[WPF]UIElement被按下不同時間時實現不同的響應

問題起源

起源於想在用戶單擊一個button時實現如下效果:
(1)當用戶單擊時,發出一個指令A。
(2)如果用戶將button按下,保持一段時間(如200ms)以上時,則發出指令B。
隨後,再次將button按鍵擡起時,發出指令C。
這種效果類似於汽車的車窗的開啓/關閉的按鈕,當輕輕的扳一下按鈕(扳完立馬鬆開)時,他會一直開或關,指導你再次輕輕的扳一下才會停止;而當你扳住按鈕保持,則車窗一直動,當你鬆開時,車窗停止運動。

實現方式

響應Button的兩個事件,PreviewMouseLeftButtonDown和PreviewMouseLeftButtonUp。

<Button context = "Push" PreviewMouseLeftButtonDown="MouseLeftButtonDown" PreviewMouseLeftButtonUp="MouseLeftButtonUp" />

具體代碼如下:

private void MouseLeftButtonDown(object sender, MouseButtonEventArgs e)
 {
     var element = (FrameworkElement)sender;
     var timer = new System.Timers.Timer(200);
     timer.AutoReset = false;
     timer.Elapsed += new ElapsedEventHandler((o, ex) => element.Dispatcher.Invoke(new Action(() =>
     {
         ///發出指令B,長時間按下的事件
     })));
     timer.Start();
     element.Tag = timer;
 }

private void MouseLeftButtonUp(object sender, MouseButtonEventArgs e)
{
    var element = (FrameworkElement)sender;
    Timer timer = (Timer)element.Tag;

    bool isClick = timer.Enabled;		//通過判斷當前定時器是否還使能來判斷鼠標擡起的時間間隔!
    timer.Stop();
    timer.Dispose();
    
    if (isClick)
    {
        //發指令A。單擊動作,
    }
    else
    {
        //發指令C。長時間按後的擡起
    }
}

擴展

(1)除了Button外,其他UIElment也都有這兩個事件,可以類似處理。
(2)類似的處理:【WPF】UIElement的單雙擊事件支持

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章