【问题标题】:RightDoubleClick and context menuRightDoubleClick 和上下文菜单
【发布时间】:2010-12-17 04:14:55
【问题描述】:

相关问题(详情)

Tunneling events and ContextMenu

我有一个 WPF 画布,我关联了一个 ContextMenu..

这很酷。现在我必须对 Right DoubleClick 执行一些操作...

事实上,我从来没有收到鼠标右键 ClickCount == 2...

怎么办?
我需要在简单(右键)单击时显示 ContextMenu,并执行 Action2 OnRightDoubleClick..

protected override void OnPreviewMouseRightButtonUp(MouseButtonEventArgs e)
{
    if (e.ClickCount == 1)
    {
        #region SINGLE CLICK
        stillSingleClick = true;
        Thread thread = new Thread(
            new System.Threading.ThreadStart(
                delegate()
                {
                    Thread.Sleep(System.Windows.Forms.SystemInformation.DoubleClickTime);
                    this.Dispatcher.Invoke(
                        System.Windows.Threading.DispatcherPriority.Background,
                        new Action(
                            delegate()
                            {
                                if (stillSingleClick)
                                {
                                    base.OnPreviewMouseRightButtonUp(e);
                                }
                                stillSingleClick = false;
                            }
                    ));
                }
        ));
        thread.Start();
        #endregion SINGLE CLICK
    }
    else if (e.ClickCount == 2)
    {
        stillSingleClick = false;
        base.OnPreviewMouseRightButtonUp(e);
    }
}

【问题讨论】:

  • 上下文菜单不会作为 WM_RBUTTONUP 的结果显示,而是作为 WM_CONTEXTMENU 的结果显示。这样做的原因是允许键盘(Shift+F10 或上下文菜单键)调用上下文菜单。无法区分从键盘或鼠标调用的 WM_CONTEXTMENU。如果要指定行为,则必须放弃键盘功能。我强烈建议保持“正常”行为,而不是右键双击,而是使用其他一些机制,例如 Ctrl+左键。
  • @Tergiver:谢谢。见stackoverflow.com/questions/4464936/…
  • 我没有仔细阅读这个问题。我只是假设 ClickCount="1" 语句中的代码是一些操作,但现在我看到它与我提供的答案基本相同。我的错.. 已删除答案

标签: .net wpf mouse click double-click


【解决方案1】:

MouseButtonEventArgs.ClickCount 将始终为 1,因为您处理的是向上事件而不是向下事件。 PreviewUp 和 Up 都将始终为 1。单击行为通常定义为相应按钮的向下事件。

【讨论】:

  • @serhio,您只需要处理 ButtonDown 事件
  • @serhio 使用 PreviewMouseRightButtonDown 或 MouseRightButtonDown 代替 PreviewMouseRightButtonUp
  • 谢谢。查看相关问题stackoverflow.com/questions/4464936/…
  • 麻烦在于 ContextMenu
  • @serhio 您有多个问题...您的 ClickCount 问题是基于订阅了不正确的事件。
【解决方案2】:

MouseDoubleClickEvent 中执行此操作

if (e.ChangedButton == MouseButton.Right)
{
     //do something with Mouse Right Double Click
}

【讨论】:

  • 问题是如果上下文菜单处于活动状态,右键不会引发“MouseDoubleClick”事件。
【解决方案3】:

查看 MSDN 上的 this 示例:

private void OnMouseDownClickCount(object sender, MouseButtonEventArgs e)
{
    //Handle only right clicks
    if (e.RightButton != MouseButtonState.Pressed) return;

    // Checks the number of clicks.
    if (e.ClickCount == 1)
    {
        // Single Click occurred.
        lblClickCount.Content = "Single Click";
    }
    if (e.ClickCount == 2)
    {
        // Double Click occurred.
        lblClickCount.Content = "Double Click";
    }
    if (e.ClickCount >= 3)
    {
        // Triple Click occurred.
        lblClickCount.Content = "Triple Click";
    }
}

【讨论】:

  • 还有什么......?我需要在简单的点击时显示 ContextMenu,并执行 Action2 onDoubleClick..
  • 你是什么意思,和你的例子有什么联系?
  • 刚刚测试过,它可以工作,所以如果你投了反对票,那你就错了。我改为处理 MouseDown 事件并使用上面发布的确切方法,它工作得很好......我添加了 if (e.RightButton != MouseButtonState.Pressed) return;在方法的顶部,以避免处理右键单击事件。
  • :) 我毫不怀疑 Microsoft 示例有效,但我投了反对票,因为与我遇到的问题无关,所以没有用。
  • 你迷路了...我刚刚在我的 XAML 中添加了一个画布,例如 并且当我在画布上执行一次右键单击时,包含在 if (e.ClickCount == 1) 中的代码会执行,如果我执行双击右键单击包含在 if (e.ClickCount == 2) 中的代码,那么这显然有效,并且与您遇到的问题有关……您只需快速拒绝那些试图帮助您的人,而无需等待任何进一步的澄清。
猜你喜欢
  • 2010-10-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-23
  • 1970-01-01
相关资源
最近更新 更多