2009-06-09 385 views
14

我必须同时处理单击和双击WPF应用程序中按钮的不同反应。 不幸的是,在双击时,WPF会触发两个单击事件和一个双击事件,所以很难处理这种情况。WPF:Button单击+双击问题

它试图用计时器解决它,但没有成功......我希望你能帮助我。

让我们来看看代码:

private void delayedBtnClick(object statInfo) 
{ 
    if (doubleClickTimer != null) 
     doubleClickTimer.Dispose(); 
    doubleClickTimer = null; 

    this.Dispatcher.Invoke(System.Windows.Threading.DispatcherPriority.Normal, new VoidDelegate(delegate() 
    { 
     // ... DO THE SINGLE CLICK ACTION 
    })); 
} 

private void btn_Click(object sender, RoutedEventArgs e) 
{ 
    if (doubleClickTimer == null) 
     doubleClickTimer = new Timer(delayedBtnClick, null, System.Windows.Forms.SystemInformation.DoubleClickTime, Timeout.Infinite); 
     } 
    } 
} 

private void btnNext_MouseDoubleClick(object sender, MouseButtonEventArgs e) 
{ 
    if (doubleClickTimer != null) 
     doubleClickTimer.Change(Timeout.Infinite, Timeout.Infinite); // disable it - I've tried it with and without this line 
     doubleClickTimer.Dispose(); 
    doubleClickTimer = null; 

    //.... DO THE DOUBLE CLICK ACTION 
} 

的问题是,“只需点击一下行动”上双击的“双击动作”后调用。这是奇怪的是,我设置了doubleClickTimer为null上双击,但在delayedBtnClick这是真的:O型

我已经尝试过使用更长的时间,一个布尔标志和锁...

你有什么想法?

最好!

回答

16

如果设置了RoutedEvente.Handledtrue处理MouseDoubleClick事件发生后,那么它不会调用Click事件第二次MouseDoubleClick后。

有一个recent post触及具有不同的行为SingleClickDoubleClick这可能是有用的。

但是,如果你确定要单独行为,并希望/需要阻止第一Click以及第二Click,您可以使用DispatcherTimer喜欢你。

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

非常感谢! e.Handled = true是诀窍! 再次感谢您的快速反应:) – Hunsoul 2009-06-10 08:14:48

+1

如果您使用该构造函数的DispatcherTimer计时器立即启动,这将导致一个虚假的单击事件。另外背景和当前是默认值,所以混淆了一些东西(以为可能会有一些巫术出现在那里!)。非常有用 - 干杯! – 2013-01-16 16:55:09

6

你可以试试这个:

Button.MouseLeftButtonDown += Button_MouseLeftButtonDown; 

private void Button_MouseLeftButtonDown(object sender, MouseButtonEventArgs e) 
{ 
    e.Handled = true; 

    if (e.ClickCount > 1) 
    { 
     // Do double-click code 
    } 

    else 
    { 
     // Do single-click code 
    } 
} 

如果neccessary,你可能需要点击鼠标,等到鼠标向上执行的操作。