2012-05-30 41 views
5

我正在使用WPF繪圖程序中的線的裝飾者。該線是在代碼後面繪製,然後用我的定製裝飾者LineAdorner裝飾。我設法使用Thumb作爲線的起點和終點。我的問題是拇指關於開始和結束點的安排。我認爲問題出在ArrangeOverride的方法中,其中應該用起點和終點排列拇指。我找不到在RectXY參數中減去或添加的正確數量。我怎麼能找到這些值總是安排拇指與線的點? 從我的自定義裝飾器的代碼是這樣的:如何安排在WPF自定義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; } }

回答

5

在ArrangeOverride試試這個。你可以擺脫「開始」和「結束」變量,並且你不需要重寫OnRender,因爲如果你告訴它們他們需要的位置,你的拇指就會自己渲染自己。

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

您正在拇指上設置顯式大小,因此必須在排列中進行維護。此外,您需要減去拇指的寬度和高度的一半以集中終點。

由於Canvas和Shapes的特性,您需要減去該行的「真實」左值和上值,因爲與Line不同,裝飾者不會從左上角帆布。除了使用Canvasses之外,這不是必需的。

+0

完美的作品,謝謝你的幫助,這正是我一直在尋找的。 – canha

相關問題