Слияние ContextMenus, которые не связаны с данными - PullRequest
2 голосов
/ 29 июня 2011

Кажется, есть много вариантов этого вопроса, но ни один из них не касается моего сценария.

У меня есть UserControl, который используется в нескольких местах. Элемент управления имеет контекстное меню, но некоторые из его родителей также имеют контекстные меню. Родительские контекстные меню не привязаны к данным, т.е. они выглядят так:

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

Я могу пройти по логическому дереву и найти родительское контекстное меню, но не могу найти способ дублировать элементы MenuItem (я должен дублировать их, потому что им разрешен только один родитель).

Я думаю, что задаю очень похожий вопрос к этому: https://stackoverflow.com/questions/4177298/how-to-merge-wpf-contextmenus Но это не были ответы, поэтому я все еще ищу!

Пожалуйста, не предлагайте, чтобы данные связывали родительский элемент управления и использовали составные коллекции - слишком много мест, где это можно сделать!

Ответы [ 2 ]

1 голос
/ 17 июля 2011

Честно говоря, WPF не имеет прямого способа объединять контекстные меню (скорее элементы меню) из визуального / логического дерева элементов управления.

Один из способов добиться этого - вместо установки свойства прямого контекстного меню вашего элемента управления реализовать реализованное свойство, скажем MergedContextMenu, которое будет иметь тип контекстного меню.

Теперь в собственности изменилось событие ...

  1. Создайте временное контекстное меню, скажем currentContextMenu.
  2. Клонировать элементы меню из текущего значения, т. Е. (Например, NewValue как ContexteMenu). Элементы. Добавьте эти клонированные элементы меню в currentContextMenu.
  3. Пройдите по логическому дереву и выполните шаг 2 для каждого найденного контекстного меню, пока не будет достигнут желаемый предок.
  4. Назначьте это currentContextMenu фактическому свойству ContextMenu, т.е. ((UIElement) depObj) .ContexteMenu = currentContextMenu.

Используйте следующий код для метода Clone ....

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);

}

0 голосов
/ 29 июня 2011

Добавьте MenuItems из каждого исходного ContextMenu во временный объект списка, удалите их из исходной коллекции Items ContextMenus, а затем добавьте их все в новое ContextMenu.Пока элементы MenuItem не содержатся более чем в одном ContextMenu одновременно, все будет в порядке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...