在WPF中重用ContextMenu用于多个控件

时间:2009-12-14 22:37:34

标签: wpf parameters contextmenu

我有三个树视图控件,它们包含不同的(但大多数是相似的数据),因此可以在每个级别采取的操作就用户而言是相同的,但是它们的类型不同(这是作为开发人员我不得不担心的事情。我喜欢做的是重用这个上下文菜单并向其传递一个类型(或者能够检索它),然后该类型将被传递给实际的Executed函数。

这样我们就可以在这里找到一些常用的代码:

<UserControl x:Class="ucControl" 
 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 xmlns:local="clr-namespace:LocalNamespace"
 Name="ucControl" 
 xmlns:my="http://schemas.microsoft.com/wpf/2008/toolkit"
 Background="LightGray">
 <UserControl.Resources>
     <ContextMenu x:Key="GroupMenu">
         <MenuItem Header="Add Group" Command="New"/>
         <MenuItem Header="Rename Group" Command="local:CustomCommands.RenameGroup"/>
         <MenuItem Header="Delete Group" Command="Delete"/>
         <Separator/>
         <MenuItem Header="Change Contents of Group" Command="local:CustomCommands.EditGroupContents"/>
     </ContextMenu>
 </UserControl.Resources> 
 <UserControl.CommandBindings>
     <CommandBinding CanExecute="CanAddGroup" Command="New" Executed="AddGroup"/>
     <CommandBinding Command="local:CustomCommands.RenameGroup" CanExecute="CanRename" Executed="RenameGroup"/>
     <CommandBinding Command="local:CustomCommands.EditGroupContents" CanExecute="CanEditGroupContents" Executed="EditGroupContents"/>
 </UserControl.CommandBindings>
 <TabControl Name="tcTabs">
     <TabItem Header="Size" Name="tiSize">
         <TreeView Name="tvSizeGroup" ContextMenu="{StaticResource GroupMenu}"/>
     </TabItem>
     <TabItem Header="Brand" Name="tiBrand">
         <TreeView Name="tvBrandGroup" ContextMenu="{StaticResource GroupMenu}"/>
     </TabItem>
     <TabItem Header="Color" Name="tiColor">
         <TreeView Name="tvColorGroup" ContextMenu="{StaticResource GroupMenu}"/>
     </TabItem>
 </TabControl>

在这个例子中,我希望Size,Brand和Color中的每一个都具有相同的ContextMenu,但是如果在Size TreeView中提取了Context Menu,我将需要添加一个类型为Size的组到我的表。这可能就像我这样做吗?我试图避免制作三个ContextMenus,这显然是一种方法。

1 个答案:

答案 0 :(得分:2)

我知道只有一种方法可以实现这一目标, 在CommandHandler中,您需要检查哪个Tree已经调用了它。

在CommandHandler中尝试:

MenuItem mnu = sender as MenuItem;
TreeView tv = null;
if(mnu!=null)
{
    tv = ((ContextMenu)mnu.Parent).PlacementTarget as TreeView;
}
if(tv.Name=="tvSizeGroup")
{
    //add group of Size
}
if(tv.Name=="tvBrandGroup")
{
    //add group of Brand
}

希望这会有所帮助!!