2012-04-18 56 views
6

我有一个自定义面板,用于绘制选择效果;但有时它不清除以前的矩形,如果鼠标在屏幕足够大(跨两个显示器)时来回移动,是WPF错误还是限制?你知道如何解决这个问题吗?提前致谢。WPF UIElement刷新错误?

简化代码如下所示

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

,我把它放在一个网格,鼠标移动过程中失效,就像这样

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

    } 

,结果看起来像下面的图片 enter image description here

+0

什么是选择? – gliderkite 2012-04-18 16:16:21

+0

我的意思是,该矩形将用于绘制选择边框。我们有一个非常复杂的控制,并使用与上面类似的代码来绘制选择边框,这是否有意义? – Hiber 2012-04-19 01:07:19

+0

两种代码气味:mousemove不调用基本实现,并且mousemove不应该是使布局无效的wpf方法之一。尝试在更改选择后在mousemove中手动使布局无效。 (InvalidateVisual()) – 2012-05-31 15:01:10

回答

1

试试UIElement.InvalidateVisual();