Ich arbeite an einem Adorner für eine Linie in einem Zeichenprogramm mit WPF. Die Linie wird in Code-Behind gezeichnet und dann mit meinem benutzerdefinierten Adorner namens LineAdorner
geschmückt. Ich habe es geschafft, einen Thumb
für den Anfangs- und Endpunkt der Linie zu verwenden. Mein Problem ist die Anordnung der Thumbs bezüglich der Start- und Endpunkte. Ich denke das Problem liegt in der Methode ArrangeOverride
, wo die Thumbs mit den Start- und Endpunkten angeordnet werden sollen. Ich kann nicht die richtige Menge finden, um die Rect
X
und Y
Parameter zu subtrahieren oder hinzuzufügen. Wie kann ich diese Werte finden, um die Thumbs immer mit den Punkten der Linie zu arrangieren? Der Code aus meiner benutzerdefinierten Adorner ist dies:So ordnen Sie Thumbs mit einer Linie in einem WPF-benutzerdefinierten Adorner
public class LineAdorner : Adorner
{
private Point start;
private Point end;
private Thumb startThumb;
private Thumb endThumb;
private Line selectedLine;
private VisualCollection visualChildren;
// Constructor
public LineAdorner(UIElement adornedElement) : base(adornedElement)
{
visualChildren = new VisualCollection(this);
startThumb = new Thumb { Cursor = Cursors.Hand, Width = 10, Height = 10, Background = Brushes.Green };
endThumb = new Thumb { Cursor = Cursors.Hand, Width = 10, Height = 10, Background = Brushes.BlueViolet };
startThumb.DragDelta += StartDragDelta;
endThumb.DragDelta += EndDragDelta;
visualChildren.Add(startThumb);
visualChildren.Add(endThumb);
selectedLine = AdornedElement as Line;
}
// Event for the Thumb Start Point
private void StartDragDelta(object sender, DragDeltaEventArgs e)
{
Point position = Mouse.GetPosition(this);
selectedLine.X1 = position.X;
selectedLine.Y1 = position.Y;
}
// Event for the Thumb End Point
private void EndDragDelta(object sender, DragDeltaEventArgs e)
{
Point position = Mouse.GetPosition(this);
selectedLine.X2 = position.X;
selectedLine.Y2 = position.Y;
}
protected override int VisualChildrenCount { get { return visualChildren.Count; } }
protected override Visual GetVisualChild(int index) { return visualChildren[index]; }
protected override void OnRender(DrawingContext drawingContext)
{
if (AdornedElement is Line)
{
selectedLine = AdornedElement as Line;
start = new Point(selectedLine.X1, selectedLine.Y1);
end = new Point(selectedLine.X2, selectedLine.Y2);
}
}
protected override Size ArrangeOverride(Size finalSize)
{
var startRect = new Rect(selectedLine.X1, selectedLine.Y1, ActualWidth, ActualHeight);
startThumb.Arrange(startRect);
var endRect = new Rect(selectedLine.X2, selectedLine.Y2, ActualWidth, ActualHeight);
endThumb.Arrange(endRect);
return finalSize;
}
}
funktioniert perfekt, danke für Ihre Hilfe das war genau das, was ich suchte. – canha