2

注意此问题已更新,请继续阅读

你好,

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

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

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

似乎可行,菜单保持打开存在问题(由于焦点在菜单之外,它们正在关闭),但我确信使用 Reflector.NET 可以找到解决方法。

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

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

4

2 回答 2

2

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

方法一

使用上下文菜单,但通过设置模板使 ContextMenu 真正只显示碰巧打开其他窗口的控件。也许可以做一些技巧,这样打开这些二级菜单就不会把焦点移开。这可能最终仍会导致原始问题。

方法二

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

于 2009-03-29T22:22:42.517 回答
1

更新

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

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

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

[2] 如何将菜单定位到四边形中: - TopLeft 偏移为负,实际宽度和高度
- TopRight 偏移为负,实际高度 - BottomLeft
偏移为负,实际高度
- BottomRight 未偏移并且位于其原始位置

替代文字

新问题/问题

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

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

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

于 2009-05-17T21:39:05.253 回答