2012-04-18 12 views
6

Ho un pannello personalizzato, che viene utilizzato per disegnare l'effetto di selezione; ma a volte non cancella i rettangoli precedenti, se il mouse viene spostato avanti e indietro quando lo schermo è abbastanza grande (su due monitor), è un bug o una limitazione WPF? Sai come risolvere questo problema? Grazie in anticipo.Errore di aggiornamento UIElement WPF?

Il codice semplificato è simile al seguente

public class CustomPanel : Panel 
{ 
    private Rectangle _rectangle; 

    public CustomPanel() 
    { 
     this._rectangle = new Rectangle(); 
     this._rectangle.StrokeThickness = 3; 
     this._rectangle.Stroke = new SolidColorBrush(Color.FromArgb(220, 0, 0, 0)); ; 
     this.Children.Add(this._rectangle); 
    }    

    protected override Size MeasureOverride(Size availableSize) 
    { 
     this._rectangle.Measure(availableSize); 
     return this._rectangle.DesiredSize; 
    } 

    protected override Size ArrangeOverride(Size finalSize) 
    { 
     if (!finalSize.IsEmpty) 
     { 
      this._rectangle.Arrange(new Rect(new Point(0, 0), finalSize)); 
     } 
     return finalSize; 
    } 
}   

e l'ho messo in una griglia e invalida che durante il movimento del mouse, come questo

void OnMouseMove(object sender, MouseEventArgs e) 
    { 
     var point = e.GetPosition(this); 
     var size = new Size(point.X>=0? point.X:0, point.Y>=0? point.Y:0); 
     this.Selection.Measure(size); 
     this.Selection.Arrange(new Rect(size)); 

    } 

e il risultato appare come la seguente immagine enter image description here

+0

Che cos'è la selezione? – gliderkite

+0

Voglio dire, quel rettangolo sarà usato per disegnare i bordi di selezione. abbiamo un controllo molto complesso e usiamo il codice simile con sopra per disegnare i confini della selezione, ha senso? – Hiber

+0

Due odori di codice: mousemove non sta chiamando l'implementazione di base e mousemove non dovrebbe essere uno dei metodi wpf che invalidano il layout. Prova a invalidare manualmente il layout in mousemove dopo aver modificato Selection. (InvalidateVisual()) –

risposta

1

provare UIElement.InvalidateVisual();

Problemi correlati