問題起源
起源於想在用戶單擊一個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的單雙擊事件支持