How can I use e.ClickCount in MouseDown Routed Event to distinguish click and doubleclick?


  • I searched MSDN for e.ClickCount, and it provieds the following eg.:

    <Window x:Class="WpfApplication1.Window1"
            Title="Window1" Height="300" Width="300">
            <TextBlock x:Name="tb" Text="" Background="Black" Foreground="White"/>

    and the code behind:

      public partial class Window1 : Window
            public Window1()

                this.tb.MouseDown += new MouseButtonEventHandler(tb_MouseDown);

            void tb_MouseDown(object sender, MouseButtonEventArgs e)
                // Checks the number of clicks.
                if (e.ClickCount == 1)
                    // Single Click occurred.
                    this.tb.Text = "Single Click";


                if (e.ClickCount == 2)
                    // Double Click occurred.
                    this.tb.Text += "Double Click";


                if (e.ClickCount >= 3)
                    // Triple Click occurred.
                    this.tb.Text += "Triple Click";


    But what I want  to get is like this:

    (1)When I click once at one time, then execute DoSomethingForClick(). This has no problem! 

    (2)When I click twice at one time, then only execute DoAnotherForDoubleClick(). NOT firstly execute DoSomethingForClick() and then execute DoAnotherForDoubleClick() like in the MSDN eg., because tb_MouseDown fired 2 times;    

    How can I do?       

    2012年9月25日 10:13


  • 问题补充:实际上我是从UIElement3D派生了一些3D类,UIElement3D能响应鼠标事件,但它只有MouseDown、MouseUp等事件而没有Click、DoubleClick等事件(很多其它的WPF控件也是如此,比如TextBlock)。我的问题就是怎样利用现有的MouseDown、MouseUp等事件形成类似Click、DoubleClick等事件,从而让控件能同时响应单击、双击操作,分别执行不同的事情。


    2012年9月26日 0:38
  • 这个示例对我来说是有效的。

    你运行该示例时,双击后,TextBlock仅显示Double Click么?

    如果显示了"Single Click" + "Double Click",那么我想是DoSomethingForClick()出现了一些问题,你可以列出来看看这个方法,或者描述该方法想要实现的功能。


    2012年9月26日 1:39
  • 这个示例对我来说是有效的。

    你运行该示例时,双击后,TextBlock仅显示Double Click么?

    如果显示了"Single Click" + "Double Click",那么我想是DoSomethingForClick()出现了一些问题,你可以列出来看看这个方法,或者描述该方法想要实现的功能。


    首先谢谢你的答复!正因为双击后显示"Single Click" + "Double Click",所以不是我想要的效果。我想要的效果是双击就只执行DoAnotherForDoubleClick()而不要先执行DoSomethingForClick(),即双击只显示Double Click;


    2012年9月26日 2:00
  • 找到一个类似的例子的回答:

    You can get the system double click time span limit using:

    [DllImport("User32", ExactSpelling = true, CharSet = CharSet.Auto)]
    public static extern int GetDoubleClickTime();

    Then you can set a timer in your PreviewMouseDown to see if the second MouseDown is within that time, if yes, just ignore all (its a double-click), if a second PreviewMouseDown does not arrive before the timer runs out, then it is right-click (might be multiple right clicks, but do not qualify as double-click)

    Either way, the timer can be disposed of on first tick. Hope this will help to some extent.



    2012年9月26日 2:36