2012-04-18 42 views
6

Seçim efektini çizmek için kullanılan özel bir panom var; Ancak, ekran yeterince büyük olduğunda iki ekran arasında moved ileri ve geri hareket ettirilirse, bazen bir önceki dikdörtgenleri temizlemez, bir WPF hatası mı yoksa sınırlaması mı? Bu sorunu nasıl çözeceğinizi biliyor musunuz? Şimdiden teşekkürler.WPF UIElement yenileme hatası?

basitleştirilmiş kod aşağıdaki

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

benziyor ve bu

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

    } 

gibi bir ızgara içine koyun ve fare hareket sırasında geçersiz ve sonuç aşağıdaki resimde benziyor enter image description here

+0

Seçim Nedir? – gliderkite

+0

Yani, bu dikdörtgen seçim sınırlarını çizmek için kullanılacaktır. Çok karmaşık bir kontrolümüz var ve seçim kodlarını çizmek için yukarıdaki benzer kodu kullanıyoruz, mantıklı mı? – Hiber

+0

İki kod kokuyor: mousemove, temel uygulamayı çağırmıyor ve mousemove, düzeni geçersiz kılan wpf yöntemlerinden biri olması beklenmiyor. Seçimi değiştirdikten sonra mizanpajı el ile mizanpajı geçersiz kılmaya çalışın. (InvalidateVisual()) –

cevap

1

try UIElement.InvalidateVisual();