2010-01-15 4 views
2

Как я мог бы добавить некоторые условия списка MenuItems изменения в контекстном меню WPF, в зависимости от некоторых атрибутов объектов перешедших ?:Как добавить условие в контекстное меню WPF?

<Grid.ContextMenu> 
<ContextMenu> 
    <MenuItem Name="EditStatusCm" Header="Change status" /> 
    ... 
    <MenuItem ... /> 
</ContextMenu>     
</Grid.ContextMenu> 

ответ

4

Мне намного проще сделать это в коде. Если это методы хорошо, довольно простой кусок образец кода:

ContextMenu cm = new ContextMenu(); 

cm.Items.Clear(); 
MenuItem mi; 


mi = new MenuItem(); 
mi.Header = "myHeader"; 
mi.Click += new RoutedEventHandler(menuItemAlways_Click); 
cm.Items.Add(mi); //this item will always show up 

if(someCondition()) 
{ 
    mi = new MenuItem(); 
    mi.Header = "myConditionalHeader"; 
    mi.Click += new RoutedEventHandler(menuItemConditional_Click); 
    cm.Items.Add(mi); //This item will show up given someCondition();  
} 

cm.IsOpen = true; 

Очевидно, что очень упрощенный пример, но он показывает, как легко это сделать в коде позади.

EDIT: В ответ на ваш комментарий, вот метод, который я в последний раз использовал ...

//raised upon an event, ie. a right click on a given control 
private void DisplayContextMenu(object sender, MouseButtonEventArgs e) 
{ 
    ContextMenu cm = GetAssetContextMenu() 
    //Method which builds context menu. Could pass in a control (like a listView for example) 

    cm.IsOpen = true; 
} 

private ContextMenu GetContextMenu() 
{ 
    ContextMenu cm = new ContextMenu(); 
    //build context menu 
    return cm; 
} 

Это должно сделать это немного яснее. Очевидно, что метод GetContextMenu(), вероятно, примет какой-то параметр, из которого вы можете вывести какое-то состояние prorgam - например, если вы нажмете на listView, вы можете получить значение для «listView.SelectedItem», из которого вы могли бы создать условный контекстMenu. Надеюсь, это ясно, я чувствую себя немного туманным на данный момент.

+0

Спасибо за пример кода! Не могли бы вы дать представление о том, как подключить это сгенерированное контекстное меню к определенному объекту на странице? – rem

+0

Должен ли я создавать пустой ContextMenu в XAML и создавать элементы меню в обработчике событий ContextMenuOpening? – rem

+0

Спасибо! Не могли бы вы рассказать, почему Контекстное меню, открывающее событие MouseRightButtonDown, остается открытым на секунду или около того, просто мигает. Что мне делать в дополнение к «cm.IsOpen = true»? – rem

1

Я строй своего контекстного меню в коде динамически на «ContextMenuOpening» Event. Он работает очень хорошо. Таким образом, я могу смотреть на все мои переменные в реальном времени. Обычно я создаю контекстное меню, в котором есть все, о чем я ЗНАЮ, что мне понадобится каждый раз, а затем измените его в коде, прежде чем показывать его. Я бы опубликовал код, но он проприетарный.

Смежные вопросы