2012-04-18 1 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

+0

그 사각형은 선택 테두리를 그리는 데 사용됩니다. 우리는 매우 복잡한 컨트롤을 가지고 있으며 위의 코드를 사용하여 선택 테두리를 그리는 것이 합리적입니까? – Hiber

+0

두 가지 코드 냄새가 나는데 : mousemove가 기본 구현을 호출하지 않고 mousemove가 레이아웃을 무효화하는 wpf 메소드 중 하나가되지 않아야합니다. 선택을 변경 한 후 mousemove에서 수동으로 레이아웃을 무효화하십시오. (InvalidateVisual()) –

답변

1

시도 UIElement.InvalidateVisual();