合并不受数据绑定的ContextMenus

时间:2011-06-29 10:50:06

标签: wpf contextmenu

这个问题似乎有很多变化,但没有一个与我的情景有关。

我有一个在几个地方使用的UserControl。该控件有一个上下文菜单,但它的一些父级也有上下文菜单。父上下文菜单不是数据绑定,即它们看起来像这样:

<ContextMenu>
    <MenuItem Header="Do Something" Click="DoSomethingMenuItem_Click" />
</ContextMenu>

我可以走逻辑树并找到父上下文菜单,但我找不到复制MenuItems的方法(我必须复制它们,因为它们只允许一个父级)。

我想我问的是一个非常相似的问题:https://stackoverflow.com/questions/4177298/how-to-merge-wpf-contextmenus但它没有答案所以我还在搜索!

请不要建议我数据绑定父控件并使用复合集合 - 有太多的地方用来使这个可行!

2 个答案:

答案 0 :(得分:1)

老实说,WPF无法直接从视觉/逻辑控件树中合并上下文菜单(而非菜单项)。

yu可以实现它的一种方式是实现附加属性,例如MergedContextMenu,它将是类型上下文菜单。

可以实现控件的直接上下文菜单属性。

现在在属性改变事件......

  1. 创建临时上下文菜单,例如currentContextMenu。
  2. 从当前值克隆菜单项,即(e.NewValue as ContexteMenu).Items。将这些克隆的menuitems添加到currentContextMenu。
  3. 遍历逻辑树并对找到的每个上下文菜单执行步骤2,直到达到所需的祖先。
  4. 将此currentContextMenu分配给实际的ContextMenu属性,即((UIElement)depObj).ContexteMenu = currentContextMenu。
  5. 将以下代码用于克隆方法....

    public static UIElement cloneElement(UIElement orig){
    if (orig == null)
        return (null);
    string s = XamlWriter.Save(orig);
    StringReader stringReader = new StringReader(s);
    XmlReader xmlReader = XmlTextReader.Create(stringReader, new XmlReaderSettings());
    return (UIElement)XamlReader.Load(xmlReader);
    

    }

答案 1 :(得分:0)

将每个原始ContextMenu中的MenuItem添加到临时列表对象,从原始ContextMenus Items集合中删除它们,然后将它们全部添加到新的ContextMenu中。只要MenuItems不会同时包含在多个ContextMenu中,您就可以了。