我有一个应用程序在WPF和一个按钮。在这个buttun中,我想要实现代码的click事件,但是我希望当用鼠标双击时,执行其他代码而不是click事件的代码。如何避免点击时,我想双击?
问题是,单击事件的代码总是执行,我不知道是否有办法避免点击事件的执行时,我做了点击。
我遵循MVVM模式,并使用MVVM light将事件转换为命令。
谢谢。
我有一个应用程序在WPF和一个按钮。在这个buttun中,我想要实现代码的click事件,但是我希望当用鼠标双击时,执行其他代码而不是click事件的代码。如何避免点击时,我想双击?
问题是,单击事件的代码总是执行,我不知道是否有办法避免点击事件的执行时,我做了点击。
我遵循MVVM模式,并使用MVVM light将事件转换为命令。
谢谢。
处理完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");
}
但是这不会触发第一个点击事件?因为我认为问题在于,当我第一次点击双击时,点击事件被触发,因为应用程序不知道我是否想要双击。 –
当我实例化调度程序时,调度程序正在运行,因此在实例化我的视图模型时执行。有没有办法在停止状态下实例化调度器? –
如果我在视图模型的构造函数中创建调度器,而不是在变量类的声明中创建调度器,并且在停止调度程序时不会在创建视图模型时执行。 –
上的click事件,您可以查看点击量在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.
}
}
这意味着您可以手动区分单击和双击,如果这是您的愿望。
我已经试过这种方式。问题是,如果我想要事件被解雇,我需要使用MouseLeftDown的PreviewMouseLeftDown事件instad,所以我认为如果我使用预览envent,此代码不起作用。如果我使用的MouseLeftDown事件没有被解雇。 –
这有一个问题,即双击被检测到,但首先总是检测到第一次点击,所以单击的代码是alwys执行。稍后,如果有第二次点击,则执行双击代码。 –
Here是一个很好的解释如何区分点击和双击。它给你2个例子,你如何能够实现这一点。
我分享了这个解决方案,这是两个其他解决方案之间的混合。我无法将所接受的解决方案都给予双方,抱歉。
如果我使用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不会在双击中停止,并且if我使用解决方案工作的MouseLeftButtonDown事件。
不是你的按钮有'OnMouseDoubleClick'事件吗? –
是我的按钮有两个事件,点击事件和鼠标双击事件。 –
那么为什么不写你想要在'OnMouseDoubleClick'事件中执行的代码呢? –