这个问题似乎有很多变化,但没有一个与我的情景有关。
我有一个在几个地方使用的UserControl。该控件有一个上下文菜单,但它的一些父级也有上下文菜单。父上下文菜单不是数据绑定,即它们看起来像这样:
<ContextMenu>
<MenuItem Header="Do Something" Click="DoSomethingMenuItem_Click" />
</ContextMenu>
我可以走逻辑树并找到父上下文菜单,但我找不到复制MenuItems的方法(我必须复制它们,因为它们只允许一个父级)。
我想我问的是一个非常相似的问题:https://stackoverflow.com/questions/4177298/how-to-merge-wpf-contextmenus但它没有答案所以我还在搜索!
请不要建议我数据绑定父控件并使用复合集合 - 有太多的地方用来使这个可行!
答案 0 :(得分:1)
老实说,WPF无法直接从视觉/逻辑控件树中合并上下文菜单(而非菜单项)。
yu可以实现它的一种方式是实现附加属性,例如MergedContextMenu,它将是类型上下文菜单。
可以实现控件的直接上下文菜单属性。现在在属性改变事件......
将以下代码用于克隆方法....
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中,您就可以了。