none
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">
        <Grid>
            <TextBlock x:Name="tb" Text="" Background="Black" Foreground="White"/>
        </Grid>
    </Window>

    and the code behind:

      public partial class Window1 : Window
        {
            public Window1()
            {
                InitializeComponent();

                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";

                    DoSomethingForClick();           

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

                   DoAnotherForDoubleClick();           

                 }
                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()出现了一些问题,你可以列出来看看这个方法,或者描述该方法想要实现的功能。


    Wanpeng wanpeng.ones@gmail.com

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

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

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


    Wanpeng wanpeng.ones@gmail.com

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

    总体来说就是:当单击控件时仅执行单击函数,双击时仅执行双击函数。

    2012年9月26日 2:00
  • 找到一个类似的例子 http://social.msdn.microsoft.com/Forums/zh-CN/wpf/thread/ff31c8f1-842d-4c02-9f76-60773c020666的回答:

    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.

    即首先获得系统定义的鼠标双击间隔时间,再用一个定时器去判断。但总感觉比较麻烦,不知道有没有更简单的方法!在实际中要判断是单击、双击不仅要考虑这些,还要考虑鼠标是否有移动,即一次完整的单击是:按下鼠标MouseDown发生-》鼠标没移动MouseMove没发生-》松开鼠标MouseUp发生,并且在系统定义的“双击间隔时间”内没有发生第二次单击!

    PS:我觉得这个问题应该挺常见的,不知大牛们是采用什么方法实现的?

    2012年9月26日 2:36