2012-04-18 15 views
6

Tengo un panel personalizado, que se usa para dibujar el efecto de selección; pero a veces no borra los rectángulos previos, si el mouse se mueve hacia adelante y hacia atrás cuando la pantalla es lo suficientemente grande (en dos monitores), ¿es un error o limitación de WPF? ¿Sabes cómo resolver este problema? Gracias por adelantado.Error de actualización UIElement de WPF?

El código simplificado tiene el siguiente

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

y me lo puso en una rejilla y la invalida durante el movimiento del ratón, como este

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

    } 

y el resultado se parece a la imagen siguiente enter image description here

+0

¿Qué es la selección? – gliderkite

+0

Quiero decir, ese rectángulo se usará para dibujar bordes de selección. tenemos un control muy complejo y usamos el código similar anterior para dibujar los bordes de selección, ¿tiene sentido? – Hiber

+0

Dos olores de código: mousemove no está llamando a la implementación base y mousemove no se supone que sea uno de los métodos wpf que invaliden el diseño. Intente invalidar el diseño manualmente en mousemove después de cambiar Selection. (InvalidateVisual()) –

Respuesta

1

prueba UIElement.InvalidateVisual();

Cuestiones relacionadas