WPF中的应用程序上下文菜单,WindowStyle =无

时间:2015-11-13 12:41:07

标签: c# wpf

我在自定义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);

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

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

的MouseUp:

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

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

的MouseDown:

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

我制作了截图并测量了像素距离,以检查它是否真的是窗口。顶部/左侧。

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

  • 经过测试,对代码进行了数十次更改,以显示无效的上下文菜单
  • 我从窗口类中完全删除了调整大小/移动代码,没有更改
  • 玩EventArgs.Handled,没有变化
  • 将在调度程序中剪切的代码排入队列,而不是直接在事件中调用它,不做任何更改

1 个答案:

答案 0 :(得分:0)

您是否已尝试在自定义窗口的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模式时)或为其创建事件。