如何为WPF上下文菜单添加条件?

时间:2010-01-15 13:52:40

标签: wpf silverlight xaml contextmenu

如何在WPF上下文菜单中添加一些更改MenuItem列表的条件,具体取决于点击对象的某些属性?:

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

2 个答案:

答案 0 :(得分: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;

显然是一个非常简单的例子,但它说明了在后面的代码中做起来有多容易。

编辑:回答你的评论,这是我上次使用的方法......

//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”的值,您可以从中获取建立条件contextMenu。我希望这很清楚,此刻我感觉有点模糊。

答案 1 :(得分:1)

我在“ContextMenuOpening”事件中动态地在代码隐藏中构建我的上下文菜单。它非常好用。这样我就可以实时查看所有变量。我通常会创建一个上下文菜单,其中包含我每次都需要的所有内容,然后在显示它之前在代码后面修改它。我发布了一些代码,但它是专有的。