WPF四元语境菜单

时间:2009-03-29 09:26:57

标签: wpf wpf-controls contextmenu

N.B此问题已更新,请继续阅读

嗨,

我想创建一个自定义上下文菜单,其中包含4个子菜单,每个子菜单位于自己的象限中(左上角,右上角,左下角,右下角)。与3ds Studio Max相似。

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

[1]需要从上下文菜单派生,否则您无法将其分配给Window上的ContextMenu属性。

使用Reflector.NET找到解决方法。

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

有关如何创建此四元组上下文菜单的任何建议/想法?

2 个答案:

答案 0 :(得分:2)

我可以想到两种方法,如果你有时间的话,这两种方法都不一定是干净的,但是有可能发挥作用。

方法1

使用上下文菜单,但通过设置模板使其成为ContextMenu实际上只显示打开其他窗口的控件。也许可以做一些技巧,以便打开这些二级菜单不会把焦点带走。这可能最终导致原始问题。

方法2

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

答案 1 :(得分:1)

更新

行。在使用自定义控件后,我有一些比以前更好的工作。现在所有菜单都保持打开状态。

我做了什么:
- 创建源自ContextMenu的名为QuadContextMenu的自定义控件,覆盖默认样式键 - 控件的样式有4个弹出基元:
     - 每个都有PART_名称,所以我在OnApplyTemplate时得到它们的引用      - 每个都有子QuadMenu,这是从MenuBase派生的自定义控件      - 每个都有VerticleOffset和Horizo​​ntalOffset属性绑定到子项的ActualHeight和ActualWidth [2]。

QuadMenu样式/控制模板:
- 具有带有dockpanel的经典边框,以及带有文本块的边框,用于放置菜单名称。

[2]如何将菜单定位到Quad: - TopLeft偏移负实际宽度和高度
- TopRight偏移负实际高度
- BottomLeft偏移负实际高度
- BottomRight NOT 偏移并位于其原始位置

alt text

新问题/问题

这是进行此控制的下一个挑战:
1.此时键盘和鼠标被您关注的第一个菜单锁定/捕获,而其他菜单悬停在它们上方则无法使用。这意味着您只能使用其中一个菜单 2.翻转MenuItem,以便对于TopLeft / BottomLeft,子菜单在左侧打开。

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

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