WPF四元上下文菜单

WPF四元上下文菜单,wpf,wpf-controls,contextmenu,Wpf,Wpf Controls,Contextmenu,N.B此问题已更新,请往下读 嗨 我想创建一个自定义上下文菜单,它有4个子菜单,每个子菜单位于各自的象限(左上角、右上角、左下角、右下角)。类似于3ds Studio Max 到目前为止,我就是这样处理这个问题的: -创建自定义WPF控件,从ContextMenu[1]派生 -声明ContextMenu的4个依赖属性,这些属性将显示菜单,并且可以从XAML进行设置。 -将所有者添加到ContextMenu.IsOpenProperty,添加属性更改通知。 -当IsOpen属性更改时,设置4个子上

N.B此问题已更新,请往下读

我想创建一个自定义上下文菜单,它有4个子菜单,每个子菜单位于各自的象限(左上角、右上角、左下角、右下角)。类似于3ds Studio Max

到目前为止,我就是这样处理这个问题的: -创建自定义WPF控件,从ContextMenu[1]派生
-声明ContextMenu的4个依赖属性,这些属性将显示菜单,并且可以从XAML进行设置。
-将所有者添加到ContextMenu.IsOpenProperty,添加属性更改通知。
-当IsOpen属性更改时,设置4个子上下文菜单的IsOpen属性。
-使用ContextMenuService设置上下文菜单的垂直和水平偏移,使其显示在每个象限中;绑定实际高度和宽度特性以计算偏移

[1] 需要从上下文菜单派生,否则无法将其指定给窗口上的ContextMenu属性

这似乎是可行的,菜单没有保持打开状态会出现问题(由于焦点在菜单之外,因此菜单正在关闭),但我确信使用Reflector.NET可以找到解决问题的方法

这是我尝试编写的第一个自定义WPF控件;不确定这是否是最好的方法


有没有关于如何创建这个四元上下文菜单的建议/想法?

我可以想到两种方法,它们都不一定那么干净,但如果你有时间,它们都有可能发挥作用

方法1

使用上下文菜单,但通过设置模板,使上下文菜单真正显示一个恰好打开其他窗口的控件。也许可以采取一些技巧,这样打开这些辅助菜单就不会失去焦点。这最终可能仍然会导致原来的问题

方法2

如果将ContextMenu.StaysOpen设置为false,然后自己尝试控制菜单何时关闭,会发生什么情况

更新 嗯。在玩了自定义控件之后,我有了比以前更好的东西。所有菜单现在都保持打开状态

我所做的:
-从ContextMenu派生的名为QuadContextMenu的自定义控件,重写默认样式键。
-控件的样式有4个弹出原语:
-每个都有零件名称,因此我在打开OnApplyTemplate时可以获得对它们的引用。
-每个都有子QuadMenu,它是从MenuBase派生的自定义控件。
-每个都有其垂直偏移和水平偏移属性,绑定到子对象的实际高度和实际宽度[2]

四元菜单样式/控件模板:
-有一个带dockpanel的经典边框,还有一个带textblock的边框以放置菜单名

[2] 如何将菜单定位到四元菜单中: -左上角为实际宽度和高度的负偏移量
-右上角偏移为实际高度的负值
-左下角偏移为实际高度的负值
-右下角为偏移,位于其原始位置

新问题/议题 以下是实现此控制的下一个挑战:
1.此时,键盘和鼠标被您关注的第一个菜单锁定/捕获,而其他菜单则不可用。这意味着您只能使用其中一个菜单。
2.翻转菜单项,使左上/左下的子菜单在左侧打开

我已经尝试通过重写GetContainerForItemOverride方法来替换菜单项,以返回QuadMenuItem。QuadMenuItem是从MenuItem派生的自定义控件。但是,当我这样做时,我会丢失子菜单功能,这令人沮丧


如果任何人对如何解决这些问题有任何提示/窍门/建议,将不胜感激!:D谢谢

嘿,史蒂文,谢谢你的回答,这让我的想法有点不同。我已经用我最新的尝试更新了这篇文章,除了一些新的问题外,其他都很有效。:)任何超出默认控件行为的调整都是痛苦的。我认为如果你不使用ContextMenu,只使用自己的窗口,那么总体来说你会更好。实际上,我会把它变成一种行为(),通过做一些hackey操作来覆盖控件的默认行为是非常痛苦的™ 通过反射更改内部/私有属性。我将进行实验,看看是否可以使用附加行为创建相同的控件,如果成功,我将发回。谢谢史蒂夫!现在考虑一下,我认为可以通过“附加属性”链接多个上下文菜单,同时打开/关闭,并将每个上下文菜单作为单独的资源进行管理,因为这是我真正需要的唯一独特行为。嗯,想一想。