2012-05-30 15 views
5

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 RectX 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; } }

Antwort

5

Versuchen Sie dies in Ihrem ArrangeOverride. Sie können die Variablen "Start" und "Ende" loswerden, und Sie müssen OnRender nicht überschreiben, da Ihre Thumbs selbst gerendert werden, wenn Sie ihnen sagen, wo sie sein müssen.

protected override Size ArrangeOverride(Size finalSize) 
{ 
    selectedLine = AdornedElement as Line; 

    double left = Math.Min(selectedLine.X1, selectedLine.X2); 
    double top = Math.Min(selectedLine.Y1, selectedLine.Y2); 

    var startRect = new Rect(selectedLine.X1 - (startThumb.Width/2), selectedLine.Y1 - (startThumb.Width/2), startThumb.Width, startThumb.Height); 
    startThumb.Arrange(startRect); 

    var endRect = new Rect(selectedLine.X2 - (endThumb.Width/2), selectedLine.Y2 - (endThumb.Height/2), endThumb.Width, endThumb.Height); 
    endThumb.Arrange(endRect); 

    return finalSize; 
} 

Sie sind eine explizite Größe auf dem Daumen Einstellung, so dass in den Arrange gehalten werden mußten. Außerdem müssen Sie die Hälfte der Breite und Höhe der Daumen abziehen, um die Endpunkte zu zentrieren.

Aufgrund der Natur des Canvas und Shapes müssen Sie die "echten" linken und oberen Werte der Linie abziehen, da die Adorners sich im Gegensatz zur Linie nicht von oben links auf die Linie ziehen Segeltuch. Dies sollte außerhalb der Verwendung von Canvases nicht erforderlich sein.

+0

funktioniert perfekt, danke für Ihre Hilfe das war genau das, was ich suchte. – canha