我在WPF中有一个应用程序和一个按钮。在这个buttun中,我想要实现代码的click事件,但是我希望当用鼠标双击时,执行其他代码而不是click事件的代码。
问题是click事件的代码总是被执行,我不知道当我进行doulbe点击时是否有办法避免执行click事件。
我遵循MVVM模式,并使用MVVM灯将事件转换为命令。
感谢。
答案 0 :(得分:3)
在点击事件中,您可以检查EventArgs中的点击次数,例如;
private void RightClickDown(object sender, MouseButtonEventArgs e)
{
if (e.ClickCount == 1)
{
//do single click work here.
}
if (e.ClickCount == 2)
{
//do double click work.
}
}
这意味着您可以手动区分单击和双击,如果这是您想要的。
答案 1 :(得分:2)
在处理MouseDoubleClick事件后,将RoutedEvent的e.Handled设置为True,以阻止被点击的第二次点击事件。
如果要阻止首次单击事件行为,可以使用计时器:
private static DispatcherTimer myClickWaitTimer =
new DispatcherTimer(
new TimeSpan(0, 0, 0, 1),
DispatcherPriority.Background,
mouseWaitTimer_Tick,
Dispatcher.CurrentDispatcher);
private void Button_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
// Stop the timer from ticking.
myClickWaitTimer.Stop();
Trace.WriteLine("Double Click");
e.Handled = true;
}
private void Button_Click(object sender, RoutedEventArgs e)
{
myClickWaitTimer.Start();
}
private static void mouseWaitTimer_Tick(object sender, EventArgs e)
{
myClickWaitTimer.Stop();
// Handle Single Click Actions
Trace.WriteLine("Single Click");
}
答案 2 :(得分:2)
Here是如何区分点击次数和双击次数的一个很好的解释。它为您提供了如何实现这一目标的2个示例。
答案 3 :(得分:0)
我分享了这个解决方案,这是两个其他解决方案之间的混合。我不能给两者都接受的解决方案,对不起。
如果我使用PreviewMouseLeftButtonDown控制何时单击或双击工作,而不是使用两个事件(单击和双击)。
所以我用这段代码解决了这个问题:
第一种方法用鼠标控制点击。
private void MouseLeftButtonDownCommand(MouseButtonEventArgs e)
{
if (e.ClickCount == 1)
{
_dtMouseClick.Start();
}
else if(e.ClickCount > 1)
{
_dtMouseClick.Stop();
//the code of the double click
}
}
此方法是链接到DispatcherTimer的方法,如果第二次单击鼠标时没有停止,则执行该方法。
private void MouseClick_Tick(object sender, System.EventArgs e)
{
_dtrMouseClick.Stop();
//code of the single click
}
dispatcherTimer是在视图模型
的构造函数中创建的_dtBotonBuscarMouseClick =
new System.Windows.Threading.DispatcherTimer(
new TimeSpan(0, 0, 0, 0, 250),
System.Windows.Threading.DispatcherPriority.Background,
MouseClick_Tick,
System.Windows.Threading.Dispatcher.CurrentDispatcher);
_dtMouseClick.Stop();
间隔为250毫秒,即用户必须双击的时间间隔。
在这个解决方案中,我使用相同的方法来停止dispatcherTimer,stop()方法,但由于某种原因,如果我使用这两个事件(click和mouseDoubleClick),则双击中不会停止dispatcherTimer,如果我使用MouseLeftButtonDown事件,解决方案可以正常工作。