如何在WPF FrameworkElement上捕获单击和双击事件?

Edw*_*uay 20 c# wpf double-click event-handling

我可以像这样在TextBlock上单击一下:

private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
    MessageBox.Show("you single-clicked");
}
Run Code Online (Sandbox Code Playgroud)

我可以像这样双击 TextBlock:

private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
{
    if (e.LeftButton == MouseButtonState.Pressed)
    {
        if (e.ClickCount == 2)
        {
            MessageBox.Show("you double-clicked");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

但是如何在单个TextBlock上捕获它们并区分它们?

Nat*_*txo 12

您需要在点击序列结束后触发事件......这是什么时候?我建议使用计时器.MouseDown事件会重置它并增加点击次数.当计时器间隔过去时,它会调用以评估点击次数.

    private System.Timers.Timer ClickTimer;
    private int ClickCounter;

    public MyView()
    {
        ClickTimer = new Timer(300);
        ClickTimer.Elapsed += new ElapsedEventHandler(EvaluateClicks);
        InitializeComponent();
    }

    private void TextBlock_MouseDown(object sender, MouseButtonEventArgs e)
    {
        ClickTimer.Stop();
        ClickCounter++;
        ClickTimer.Start();
    }

    private void EvaluateClicks(object source, ElapsedEventArgs e)
    {
        ClickTimer.Stop();
        // Evaluate ClickCounter here
        ClickCounter = 0;
    }
Run Code Online (Sandbox Code Playgroud)

干杯!

  • 谢谢它真的有助于了解别人如何解决这个问题. (2认同)

Ken*_*art 4

如果您需要检测差异,我建议您使用这样的控件Label

label.MouseDown += delegate(object sender, MouseEventArgs e)
{
    if (e.ClickCount == 1)
    {
        // single click
    }
};

label.MouseDoubleClick += delegate
{
    // double click
};
Run Code Online (Sandbox Code Playgroud)

编辑:我的建议来自 MSDN 上的文档:

Control 类定义了 PreviewMouseDoubleClick 和 MouseDoubleClick 事件,但没有定义相应的单击事件。要查看用户是否单击了该控件一次,请处理 MouseDown 事件(或其对应事件之一)并检查 ClickCount 属性值是否为 1。

但是,即使用户单击,这样做也会给您一个单击通知。