问题起源
起源于想在用户单击一个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的单双击事件支持