2012-04-18 12 views
6

Ich habe ein benutzerdefiniertes Panel, das verwendet wird, um den Auswahleffekt zu zeichnen. Aber manchmal werden die vorherigen Rechtecke nicht gelöscht. Wenn die Maus hin- und herbewegt wird, wenn der Bildschirm groß genug ist (über zwei Monitore), handelt es sich um einen WPF-Fehler oder eine Einschränkung? Wissen Sie, wie Sie dieses Problem lösen können? Danke im Voraus.WPF UIElement Aktualisierungsfehler?

Der vereinfachte Code sieht wie folgt aus

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

und ich habe es in einem Raster und ungültig machen es während der Maus bewegen, wie diese

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

    } 

und das Ergebnis sieht wie folgt aus Bild enter image description here

+0

Was ist Auswahl? – gliderkite

+0

Ich meine, dieses Rechteck wird verwendet, um Auswahlrahmen zu zeichnen. Wir haben eine sehr komplexe Steuerung und verwenden den ähnlichen Code mit oben, um die Auswahlgrenzen zu zeichnen, macht es Sinn? – Hiber

+0

Zwei Code-Gerüche: mousemove ruft die Basisimplementierung nicht auf, und mousemove soll nicht zu den wpf-Methoden gehören, die das Layout ungültig machen. Versuchen Sie, das Layout nach dem Ändern der Auswahl manuell in der Maus zu deaktivieren. (InvalidateVisual()) –

Antwort

1

versuchen UIElement.InvalidateVisual();

Verwandte Themen