2012-05-30 16 views
5

WPF kullanarak bir çizim programında bir Çizgi için bir Adorner üzerinde çalışıyorum. Hat, kod arkasında çizilir ve daha sonra LineAdorner adlı özel Adorner'imle süslenir. Hattın başlangıç ​​ve bitiş noktası için Thumb kullanmayı başardım. Benim problemim, Başlangıcın başlangıç ​​ve bitiş noktaları ile ilgili düzenlemesi. Problemin, Thumbs'i başlangıç ​​ve bitiş noktaları ile ayarlaması gereken ArrangeOverride yönteminde olduğunu düşünüyorum. RectX ve Y parametrelerinde çıkarma veya ekleme için doğru miktarı bulamıyorum. Thumbs'ı daima çizginin noktaları ile düzenlemek için bu değerleri nasıl bulabilirim? benim özel Adorner kod şudur:WPF özel bir Hattında Çizgi ile Başlama nasıl düzenlenir 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; } }

cevap

5

sizin ArrangeOverride bu deneyin. "Start" ve "end" değişkenlerinden kurtulabilirsiniz ve OnRender'ı geçersiz kılmanıza gerek yoktur çünkü Thumbs'iniz nerede olmanız gerektiğini söylerseniz kendiliğinden açılır. O düzenleyin muhafaza edilmesi gerekiyordu bu yüzden

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

Sen Thumbs açık bir boyutunu ayarlıyorsunuz. Ayrıca, son noktalarda ortalamak için Thumbs'in genişliğini ve yüksekliğini yarıya çıkarmanız gerekir.

Tuval ve Şekiller'in doğası gereği, Çizgiden farklı olarak, Adornerler üst soldan kendilerini çizmeyeceklerinden, çizginin "gerçek" sol ve üst değerlerini çıkarmanız gerekir. Tuval. Bu Canvasses dışında kullanılması gerekli olmamalı.

+0

mükemmel çalışıyor, yardımınız için teşekkürler, bu tam olarak aradığım şeydi. – canha

İlgili konular