2011-09-16 332 views
1

在WPF中,當觸發MouseMove事件時,我想檢查是否按下了鼠標左鍵,如果按下了,我想進行一些計算。WPF中的MouseMove事件

我已經試過這樣:

private void Window_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (e.LeftButton == MouseButtonState.Pressed) 
    { 
     Calculate(); 
    } 

} 

但我當左鍵單擊並按住,然後移動屏幕的計算(約鼠標)只被調用一次(即當鼠標開始移動),後無論我移動鼠標的位置,該方法都不會被調用。

我希望Calculate()方法在鼠標移動並按住鼠標左鍵的同時重複調用。

+1

你確定這不是別的嗎?對我來說一個簡單的測試顯示,即使按下鼠標左鍵,MouseMove也總是被調用。 – Ray

+0

嗯...奇怪 - 但你不能只在LButtonDown上設置一個標誌(和MouseCapture?)並釋放LButtonUp上的標誌(和捕捉)?似乎對我來說比較乾淨,應該工作。 – Carsten

+0

@射線:是的,但也許e.LeftButton狀態只在按下按鈕後設置 - 這似乎是這裏的問題。 – Carsten

回答

1

一個簡單的測試,我顯示了這個工作:

private void MouseMoveEvent(object sender, MouseEventArgs e) 
{ 
    if (e.LeftButton == MouseButtonState.Pressed) 
    { 
     _vm.MoveCount++; 
    } 
} 

一個會懷疑你的Calculate方法是造成問題的一個同步方式。

嘗試調用下面的方法。這將在新線程中啓動計算方法。然後文本框的更新將在原始線程中發生。

private void WindowMouseMoveEvent(object sender, MouseEventArgs e) 
    { 
     if (e.LeftButton == MouseButtonState.Pressed) 
     { 
      var worker = new BackgroundWorker(); 
      worker.DoWork += Calculate; 
      worker.RunWorkerCompleted += 
       (o, args) => myTextBox.Text = (string)args.Result; 
      worker.RunWorkerAsync(); 
     } 
    } 


    private void Calculate(object sender, DoWorkEventArgs args) 
    { 
     //do work 
     args.Result = "my new value" 
    } 
+0

計算方法大約有50行,它有一些if/else,一些Math.Abs​​和一個Math.Atan2計算。最後,它必須更新一個簡單的TextBLock.Text值。我嘗試了你推薦的調用方法,但它會產生一個異常「調用線程不能訪問這個對象,因爲不同的線程擁有它」。 – kr13

+0

@ xjay13更新了方法來調用在新線程中計算並在原始中更新它。 – Ray

0

我已驗證它的正常工作。如果我將鼠標放在窗口上並將其移到窗口上,只要將鼠標移到窗口上,就可以重複調用該函數。可能是你的計算函數需要很多時間來執行並返回。所以它被重新召回還需要很長時間。在這種情況下,使用多個線程來調用Calculate()。

爲了測試這個工作,我在Window上添加了一個標籤,並將line label.Content = DateTime.Now.Ticks;而不是在這裏計算func。它不斷更新價值。

0

如果您使用從Panel類派生的元素,則只有在設置了Background屬性後纔會觸發鼠標事件。