【问题标题】:Application Context Menu in WPF with WindowStyle=NoneWPF 中的应用程序上下文菜单,WindowStyle=None
【发布时间】:2016-02-15 01:11:53
【问题描述】:

自定义 WPF 窗口有一个非常奇怪的问题。窗口完全在 WPF 中设计,WindowStyle=None 和 ResizeMode=NoResize。所以我必须重新实现所有基本的窗口处理东西,比如移动、调整大小和——这就是问题——应用程序上下文菜单。

目前我在应用程序图标和应用程序标题栏的鼠标事件中调用上下文菜单,如下所示:

POINT point=new POINT();
GetCursorPos(out point);
IntPtr handle=GetSystemMenu(new WindowInteropHelper(this).Handle, false);
IntPtr hd=new WindowInteropHelper(this).Handle;
int retvalue=TrackPopupMenu(handle, TPM_RETURNCMD, (int)point.X, (int)point.Y, 0, hd, new IntPtr());
PostMessage(hd, WM_SYSCOMMAND, retvalue, 0);

这是一个你可以在网上找到的代码,看起来每个人都在这样做。

但是,根据我用来显示菜单的事件,会发生以下情况:

鼠标上移:

  • 右键单击标题栏/应用程序图标:出现应用程序上下文菜单
  • 在不移动鼠标的情况下再次单击鼠标右键:不知何故,在窗口内生成了一个右键单击事件(而鼠标仍指向标题栏)。

搞笑部分:Click 被window.Left 和window.Top 翻译成窗口。如果我正确放置窗口,我可以在鼠标仍然指向 tilebar 时打开窗口内 ListView 的上下文菜单。

鼠标按下:

  • 在标题栏/应用程序图标上鼠标右键:出现应用程序上下文菜单
  • 鼠标右键向上而不移动鼠标:同样的行为,在窗口内鼠标位置 + window.Left/window.Top 处生成右键单击。

我已经截屏并测量了像素距离以检查它是否真的是 window.Top/Left。

这就是我在尝试解决问题时所做的:

  • 测试了对代码的数十次更改,以显示上下文菜单,但没有效果
  • 我从窗口类中完全删除了调整大小/移动代码,没有变化
  • 使用 EventArgs.Handled,没有变化
  • 将在调度程序中截取的代码加入队列,而不是直接在事件中调用,没有变化

【问题讨论】:

    标签: c# wpf


    【解决方案1】:

    您是否已经尝试在自定义窗口的 xaml 中实现上下文菜单?如果您正在使用模板,则可以将其集成到那里或在 CustomWindow.xaml 中使用它

    <'ControlName'.ContextMenu>    
        <ContextMenu>
            <MenuItem Header="FooRoot">
                <MenuItem Header="Foo" Command="{Binding FooCommand}"/>
            </MenuItem>
            <MenuItem Header="Foo2" Click="OnClick"/>
        </ContextMenu>
    </'ControlName'.ContextMenu>
    

    您可以绑定命令(也许如果您正在使用 MVVM 模式)或为它创建一个事件。

    【讨论】:

    • 是的,我可以尝试通过自定义实现来模仿 windows 提供的应用程序上下文菜单,但这将是一个肮脏的 hack,而不是真正的解决方案。例如,我正在使用 windowspager(与这里的问题无关,在另一台机器上测试过),它通过将窗口移动到其他桌面的选项来扩展菜单 - 很难复制这些。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-23
    相关资源
    最近更新 更多