2011-10-14 23 views
12

Tôi đã thực hiện điều khiển biểu đồ tùy chỉnh và tôi muốn vẽ một hình chữ thập đơn giản theo con trỏ. Biểu đồ được thực hiện dưới dạng PolyLine trên Canvas và tôi vẽ hai đường thay đổi toạ độ của chúng tại sự kiện OnMouseMove của Canvas.OnMouseMove không kích hoạt trên canvas trong WPF

Điều ngạc nhiên là để phát hiện ra rằng sự kiện này được gọi là chỉ mỗi 10 giây hoặc lâu hơn sự kiện khi thread MainGUI là nhàn rỗi (giao diện người dùng hoàn toàn đáp ứng và nếu tôi tạm dừng việc áp dụng các chủ đề chính là tại App mainForm.ShowDialog()).

?.

Bất kỳ ý tưởng về làm thế nào để tìm thấy lý do tại sao điều này xảy ra tôi có được hiệu suất tương tự bằng cách sử dụng OnMouseMove hoặc PreviewOnMouseMove

EDIT: Đây là cách tôi vẽ cây thập tự (anyway nếu tôi đặt một breakpoint tại OnMouseMove nó chỉ đôi khi dừng lại)

XAML:

<Border BorderThickness="1" BorderBrush="White" Grid.Column="1" Grid.Row="0" Grid.RowSpan="2" Grid.ColumnSpan="2" > 
    <Canvas x:Name="DrawArea" PreviewMouseMove="DrawArea_PreviewMouseMove" /> 
</Border> 

CS:

public Chart() 
{ 
    _line = new Polyline(); 
    _line.Stroke = Brushes.Orange; 
    _crossX = new Line(); 
    _crossY = new Line(); 
    _crossX.Stroke = Brushes.Orange; 
    _crossY.Stroke = Brushes.Orange; 
    _crossX.StrokeThickness = 1; 
    _crossY.StrokeThickness = 1; 

    InitializeComponent(); 

    this.DrawArea.Children.Add(_line); 
    this.DrawArea.Children.Add(_crossX); 
    this.DrawArea.Children.Add(_crossY); 
}  

private void DrawArea_MouseMove(object sender, MouseEventArgs e) 
{ 
    Point mousePosition = System.Windows.Input.Mouse.GetPosition(this.DrawArea); 

    _crossX.X1 = 0; 
    _crossX.X2 = this.DrawArea.ActualWidth; 
    _crossX.Y1 = _crossX.Y2 = mousePosition.Y; 

    _crossY.Y1 = 0; 
    _crossY.Y2 = this.DrawArea.ActualHeight; 
    _crossY.X1 = _crossY.X2 = mousePosition.X; 
} 
+0

Bạn không thể xác định con trỏ tùy chỉnh, thay vì cố vẽ bản vẽ bổ sung thành "giả"? –

+0

Vì vậy, bạn không có vấn đề về hiệu suất, nhưng vấn đề là sự kiện đơn giản không được gọi - tôi có hiểu điều này đúng không? –

+0

| Daniel: Nó được gọi là bởi vì thập tự giá được sơn nhưng nó được cập nhật có thể 1 lần mỗi 10 giây hoặc lâu hơn. –

Trả lời

23

Đây là lạ và tôi không biết tại sao ...

FrameworkElement.MouseMove chỉ hoạt động nếu khu vực này có một số bàn chải nền \ fill bộ rõ ràng.

Trong trường hợp của bạn đặt Canvas.Background="Transparent", nó sẽ hoạt động.

Có sửa chữa khác để này cũng ... WPF Not sending MouseMove events after CaptureMouse();

Đây có thể là có thể bởi vì các HitTest phụ thuộc vào điểm ảnh màu và phản hồi của họ.

Bất kể nó là gì, cái gì đó không được ghi lại trên MSDN và gây nhầm lẫn cho nhiều nhà thiết kế giao diện người dùng.

+2

Tôi chỉ có hai từ: THANKS và WTF ???? Thật kỳ lạ. Ai đó nên điền vào một lỗi ở Microsoft phải không? –

+2

Nếu có một đứa trẻ trên canvas, giống như hình dạng, textblock hoặc bất cứ điều gì, các sự kiện chuột được kích hoạt cho đối tượng đó VÀ canvas (chúng là sự kiện trực tiếp, vì vậy chúng không thể chạm tới canvas bằng cách sủi bọt từ trẻ em) . Điều này thật kỳ lạ. – Batibix

+2

Điều này cũng áp dụng cho 'Grid'. – Stefan

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