2011-10-14 38 views
12

我已經完成了自定義圖表控件,並且想要在光標後面畫一個簡單的十字。該圖表是通過Canvas上的PolyLine實現的,並且我在Canvas的OnMouseMove事件中繪製了兩行更改其座標的行。OnMouseMove不會在WPF中的畫布上觸發

令人驚訝的是,發現該事件被調用只有各10秒左右的事件時MainGUI線程空閒(用戶界面是完全響應,如果我暫停應用程序的主線程的應用程序mainForm.ShowDialog())

如何找到這究竟是爲什麼我得到使用的OnMouseMove或PreviewOnMouseMove相同性能的任何想法

編輯:這是我畫的十字架(反正如果我把一個斷點處的OnMouseMove只有它不時停止)

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

難道你不能定義一個自定義光標,而不是試圖做一個「假」的附加繪圖? –

+0

所以,你沒有性能問題,但問題是這個事件根本就沒有被調用 - 我理解這個權利嗎? –

+0

|丹尼爾:它被稱爲是因爲十字架被塗刷了,但它被更新了,每10秒左右可能會更新一次。 –

回答

23

這是奇怪的,我不知道爲什麼......只有

FrameworkElement.MouseMove作品,如果該區域有一些明確的背景刷\補集。

在你的情況下設置Canvas.Background="Transparent",它應該工作。

還有一種修復這個以及... WPF Not sending MouseMove events after CaptureMouse();

這可能是可能是因爲HitTest取決於顏色的像素和他們的反饋。

不管它是什麼,它的東西都沒有通過MSDN記錄下來,並且讓許多UI設計者感到困惑。

+2

我只有兩個詞:THANKS和WTF?真奇怪。有人應該填補微軟的缺陷吧? –

+2

如果在畫布上有一個孩子,就像一個形狀,文本塊或其他東西一樣,鼠標事件會被觸發以發現該對象和畫布(它們是直接事件,所以它們不會從孩子們冒出來觸及畫布) 。這很奇怪。 – Batibix

+2

這也適用於'Grid'。 – Stefan