2012-04-18 33 views
6

Tôi có một bảng tùy chỉnh, được sử dụng để vẽ hiệu ứng lựa chọn; nhưng đôi khi nó không xóa các hình chữ nhật trước đó, nếu con chuột được di chuyển qua lại khi màn hình đủ lớn (trên hai màn hình), đó có phải là lỗi hoặc giới hạn WPF không? Bạn có biết cách giải quyết vấn đề này không? Cảm ơn trước.Lỗi làm mới UIElement WPF?

Mã đơn giản trông giống như sau

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

và tôi đặt nó trong một mạng lưới và vô hiệu hóa nó trong di chuyển chuột, như thế này

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

    } 

và kết quả trông giống như hình ảnh sau enter image description here

+0

Lựa chọn là gì? – gliderkite

+0

Ý tôi là, hình chữ nhật đó sẽ được sử dụng để vẽ các đường viền chọn. chúng ta có một điều khiển rất phức tạp và sử dụng mã tương tự như trên để vẽ các đường viền lựa chọn, nó có hợp lý không? – Hiber

+0

Hai mùi mã: mousemove không gọi cơ sở triển khai thực hiện và mousemove không được coi là một trong các phương thức wpf làm mất hiệu lực bố cục. Cố gắng vô hiệu hóa bố cục theo cách thủ công trong mousemove sau khi bạn thay đổi Lựa chọn. (InvalidateVisual()) –

Trả lời

1

thử UIElement.InvalidateVisual();

Các vấn đề liên quan