2012-05-30 10 views
5

Sto lavorando a un dispositivo di allineamento per una linea in un programma di disegno che utilizza WPF. La linea è disegnata in code-behind e poi adornata con il mio Adorner personalizzato chiamato LineAdorner. Sono riuscito a utilizzare uno Thumb per il punto iniziale e finale della linea. Il mio problema è la disposizione dei pollici per quanto riguarda i punti di inizio e di fine. Penso che il problema sia nel metodo ArrangeOverride, dove si suppone che organizzi i pollici con i punti di inizio e fine. Non riesco a trovare la giusta quantità da sottrarre o aggiungere nei parametri RectX e Y. Come posso trovare questi valori per disporre sempre i pollici con i punti della linea? Il codice da mia abitudine Adorner è questo:Come disporre i pollici con una linea in un dispositivo di personalizzazione WPF

 

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

risposta

5

Prova questo nella vostra ArrangeOverride. Puoi sbarazzarti delle variabili "inizio" e "fine" e non hai bisogno di sovrascrivere OnRender poiché i tuoi Thumb si renderanno se dici loro dove devono essere.

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

Si sta impostando una dimensione esplicita su Thumbs, quindi è necessario mantenerla in Arrange. Inoltre, è necessario sottrarre metà della larghezza e altezza dei pollici per centrare i punti finali.

A causa della natura della tela e delle forme, è necessario sottrarre i valori "reali" a sinistra e in alto della linea, poiché a differenza della linea, gli ornamenti non si disegneranno dall'angolo in alto a sinistra sul Tela. Questo non dovrebbe essere richiesto al di fuori dell'uso di Canvass.

+0

funziona perfettamente, grazie per il vostro aiuto questo era esattamente quello che stavo cercando. – canha

Problemi correlati