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

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

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

我可以像这样双击 TextBlock:

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

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

您需要在点击序列结束后触发事件……这是什么时候? 我建议使用计时器。 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; } 

干杯!

如果你需要检测差异,我建议你使用像Label这样的控件为你工作:

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

编辑:我的建议是关于MSDN的文档:

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

但是,即使用户单击,这样做也会为您提供单击通知。

您必须使用计时器来区分这两者。 在GUI中为表单添加一个计时器(最简单的方法 – 它将自动处理处理等…)。 在我的示例中,计时器称为clickTimer

 private bool mSingleClick; private void TextBlock_MouseUp(object sender, MouseButtonEventArgs e) { if (e.Button == MouseButtons.Left) { if (e.ClickCount < 2) { mSingleClick = true; clickTimer.Interval = System.Windows.Forms.SystemInformation.DoubleClickTime; clickTimer.Start(); } else if (e.ClickCount == 2) { clickTimer.Stop(); mSingleClick = false; MessageBox.Show("you double-clicked"); } } } private void clickTimer_Tick(object sender, EventArgs e) { if (mSingleClick) { clickTimer.Stop(); mSingleClick = false; MessageBox.Show("you single-clicked"); } } 

您只需使用MouseDown事件并计算点击次数,如下所示:

 if (e.ChangedButton == MouseButton.Left && e.ClickCount == 2) { // your code here } 

您可以在MouseUp而不是MouseDown上执行此操作。 这样,您可以向ClickCount属性询问总点击次数,并决定从该点开始做什么。

我这样做了,它完美无缺

 If e.Clicks = 2 Then doubleClickTimer.Stop() ElseIf e.Clicks = 1 Then doubleClickTimer.Enabled = True doubleClickTimer.Interval = 1000 doubleClickTimer.Start() End If Private Sub doubleClickTimer_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles doubleClickTimer.Tick OpenWebPage("abc") doubleClickTimer.Stop() End Sub 

这是我的工作解决方案:)

  #region message label click -------------------------------------------------------------------------- private Timer messageLabelClickTimer = null; private void messageLabel_MouseUp(object sender, MouseButtonEventArgs e) { Debug.Print(e.ChangedButton.ToString() + " / Left:" + e.LeftButton.ToString() + " Right:" + e.RightButton.ToString() + " click: " + e.ClickCount.ToString()); // in MouseUp (e.ClickCount == 2) don't work!! Always 1 comes. // in MouseDown is set e.ClickCount succesfully (but I don't know should I fire one clicked event or wait second click) if (e.ChangedButton == MouseButton.Left) { if (messageLabelClickTimer == null) { messageLabelClickTimer = new Timer(); messageLabelClickTimer.Interval = 300; messageLabelClickTimer.Elapsed += new ElapsedEventHandler(messageLabelClickTimer_Tick); } if (! messageLabelClickTimer.Enabled) { // Equal: (e.ClickCount == 1) messageLabelClickTimer.Start(); } else { // Equal: (e.ClickCount == 2) messageLabelClickTimer.Stop(); var player = new SoundPlayer(ExtraResource.bip_3short); // Double clicked signal player.Play(); } } } private void messageLabelClickTimer_Tick(object sender, EventArgs e) { // single-clicked messageLabelClickTimer.Stop(); var player = new SoundPlayer(ExtraResource.bip_1short); // Single clicked signal player.Play(); } #endregion