首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >调用ContextMenu打开

调用ContextMenu打开
EN

Stack Overflow用户
提问于 2010-12-20 19:15:31
回答 1查看 628关注 0票数 4

我需要像Google那样做一些事情(但在WPF中):

  • RightClick在地图上我有一个ContextMenu。当
  • RightDoubleClicking I‘s UnZoom的动作

所以,很显然,这在WPF中有点困难.在经历了大量的挣扎和搜索之后,读到了那些认为“我们无法预测未来”的人(我问自己谷歌是如何预测未来的),我决定“等待”SystemInformation.DoubleClickTime,然后再显示一个contextMenu。

当然,这不是理想的,甚至是人类可以观察到的,但我不知道其他的方法。

因此,下面代码的问题是(我有一个自定义画布):

代码语言:javascript
复制
ContextMenuEventArgs lastContextMenuEventArgs = null;
bool? lastContextMenuEventArgsHandled = null;

protected override void OnContextMenuOpening(ContextMenuEventArgs e)
{
    lastContextMenuEventArgs = e;
    lastContextMenuEventArgsHandled = e.Handled;

    e.Handled = true;
    //base.OnContextMenuOpening(e);
}

bool rightMouseClickedOnce = false;
protected override void OnPreviewMouseRightButtonUp(MouseButtonEventArgs e)
{
    //base.OnPreviewMouseRightButtonUp(e);

    Console.WriteLine(">>>>>>>>>>> OnPreviewMouseRightButtonUp");
    if (!rightMouseClickedOnce)
    {
        rightMouseClickedOnce = 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 (rightMouseClickedOnce)
                                {
                                    Console.WriteLine(">>>>>>>>>>> Right Click");
                                    rightMouseClickedOnce = false;
                                    base.OnPreviewMouseRightButtonUp(e);

                                    if (lastContextMenuEventArgsHandled.HasValue)
                                    {
                                        Console.WriteLine(">>>>>>>>>>> lastContextMenuEventArgsHandled");
                                        lastContextMenuEventArgs.Handled = lastContextMenuEventArgsHandled.Value;
                                        base.OnContextMenuOpening(lastContextMenuEventArgs);
                                        lastContextMenuEventArgsHandled = null;
                                    }
                                    //if (this.ContextMenu != null)
                                    //{
                                    //  this.ContextMenu.PlacementTarget = this;
                                    //  this.ContextMenu.IsOpen = true;
                                    //}
                                }
                            }
                    ));
                }
        ));
        thread.Start();
    }
    else if (rightMouseClickedOnce)
    {
        Console.WriteLine(">>>>>>>>>>> Right Double Click");
        rightMouseClickedOnce = false;
        base.OnPreviewMouseRightButtonUp(e);
        this.OnMouseRightDoubleClick(e);
    }

}

一切都很好,但有一个小问题:base.OnContextMenuOpening(lastContextMenuEventArgs);似乎不工作.

我以前就开始

代码语言:javascript
复制
if (this.ContextMenu != null)
{
  this.ContextMenu.PlacementTarget = this;
  this.ContextMenu.IsOpen = true;
}

这起作用了,但最后这阻止了子contextMenu元素的打开,并且始终打开父(画布) contextMenu。

我可以直接调用contextMenu事件吗?

EN

回答 1

Stack Overflow用户

发布于 2010-12-20 19:32:10

我对WPF不太了解,但是你能显示菜单吗,比如说,在离光标一个像素的地方,看看用户是否在同一地点和系统双击时间再次右击?我曾在一场比赛中使用过类似的技术,而且表现得相当不错。

菜单“淡入”(也可以选择退出)动画可以使它更好。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4492996

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档