2013-08-22 40 views
3

我有一个应用程序在WPF和一个按钮。在这个buttun中,我想要实现代码的click事件,但是我希望当用鼠标双击时,执行其他代码而不是click事件的代码。如何避免点击时,我想双击?

问题是,单击事件的代码总是执行,我不知道是否有办法避免点击事件的执行时,我做了点击。

我遵循MVVM模式,并使用MVVM light将事件转换为命令。

谢谢。

+1

不是你的按钮有'OnMouseDoubleClick'事件吗? –

+0

是我的按钮有两个事件,点击事件和鼠标双击事件。 –

+1

那么为什么不写你想要在'OnMouseDoubleClick'事件中执行的代码呢? –

回答

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"); 
} 
+0

但是这不会触发第一个点击事件?因为我认为问题在于,当我第一次点击双击时,点击事件被触发,因为应用程序不知道我是否想要双击。 –

+0

当我实例化调度程序时,调度程序正在运行,因此在实例化我的视图模型时执行。有没有办法在停止状态下实例化调度器? –

+0

如果我在视图模型的构造函数中创建调度器,而不是在变量类的声明中创建调度器,并且在停止调度程序时不会在创建视图模型时执行。 –

3

上的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. 
     } 
    } 

这意味着您可以手动区分单击和双击,如果这是您的愿望。

+0

我已经试过这种方式。问题是,如果我想要事件被解雇,我需要使用MouseLeftDown的PreviewMouseLeftDown事件instad,所以我认为如果我使用预览envent,此代码不起作用。如果我使用的MouseLeftDown事件没有被解雇。 –

+1

这有一个问题,即双击被检测到,但首先总是检测到第一次点击,所以单击的代码是alwys执行。稍后,如果有第二次点击,则执行双击代码。 –

2

Here是一个很好的解释如何区分点击和双击。它给你2个例子,你如何能够实现这一点。

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不会在双击中停止,并且if我使用解决方案工作的MouseLeftButtonDown事件。