2012-04-18 25 views
6

Mam niestandardowy panel, który służy do rysowania efektu selekcji; ale czasami nie usuwa poprzednich prostokątów, jeśli mysz jest przesuwana tam iz powrotem, gdy ekran jest wystarczająco duży (na dwóch monitorach), czy jest to błąd WPF lub ograniczenie? Czy wiesz, jak rozwiązać ten problem? Z góry dziękuję.Błąd odświeżania WPF UIElement?

Kod uproszczony wygląda następującym

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

i umieścić ją w siatce i unieważnia go podczas ruchu myszy, jak to

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

    } 

i wynik wygląda jak na poniższym rysunku enter image description here

+0

Co to jest wybór? – gliderkite

+0

Mam na myśli, że ten prostokąt będzie używany do rysowania granic wyboru. mamy bardzo złożoną kontrolę i używamy podobnego kodu z powyższym, aby narysować granice wyboru, czy ma to sens? – Hiber

+0

Dwa zapachy kodu: mousemove nie wywołuje podstawowej implementacji, a mousemove nie powinna być jedną z metod wpf, które unieważniają layout. Spróbuj zmienić układ ręcznie w przesunięciu myszy po zmianie zaznaczenia. (InvalidateVisual()) –

Odpowiedz

1

spróbuj UIElement.InvalidateVisual();

Powiązane problemy