2012-11-04 92 views
3

我正在編寫WPF應用程序。 我想在鼠標停止移動時觸發事件。在鼠標停止移動後觸發的WPF事件

這就是我試圖去做的。我創建了一個倒計時到5秒的計時器。每當鼠標移動時,該定時器就會「重置」。 這個想法是,當鼠標停止移動時,計時器停止重置,並從5減爲零,然後調用顯示消息框的刻度事件處理程序。

那麼,它不會像預期的那樣工作,並且會使我警報消息。我究竟做錯了什麼?

DispatcherTimer timer; 

private void Window_MouseMove(object sender, MouseEventArgs e) 
{ 
    timer = new DispatcherTimer(); 
    timer.Interval = new TimeSpan(0, 0, 5); 
    timer.Tick += new EventHandler(timer_Tick); 
    timer.Start(); 
} 

void timer_Tick(object sender, EventArgs e) 
{ 
    MessageBox.Show("Mouse stopped moving"); 
} 

回答

5

您需要unhookevent再次鉤住這樣的前 -

private void poc_MouseMove(object sender, MouseEventArgs e) 
{ 
    if (timer != null) 
    { 
     timer.Tick-= timer_Tick; 
    } 
    timer = new DispatcherTimer(); 
    timer.Interval = new TimeSpan(0, 0, 5); 
    timer.Tick += new EventHandler(timer_Tick); 
    timer.Start(); 
} 

說明

只要鼠標移動,你創建DispatcherTimer的新實例,你在做什麼是並在沒有unhooking the event for previous instance的情況下掛鉤Tick事件。因此,一旦所有實例的計時器停止,您都會看到被淹沒的消息。

另外,你應該解開它,否則以前的實例將不會是​​,因爲它們仍然是strongly referenced

6

沒有必要在每個MouseMove事件上創建一個新的計時器。只需停止並重新啓動它。並且確保它在Tick處理程序中停止,因爲它應該只被觸發一次。

private DispatcherTimer timer; 

public MainWindow() 
{ 
    InitializeComponent(); 

    timer = new DispatcherTimer { Interval = TimeSpan.FromSeconds(5) }; 
    timer.Tick += timer_Tick; 
} 

void timer_Tick(object sender, EventArgs e) 
{ 
    timer.Stop(); 
    MessageBox.Show("Mouse stopped moving"); 
} 

private void Window_MouseMove(object sender, MouseEventArgs e) 
{ 
    timer.Stop(); 
    timer.Start(); 
}