在WPF中为多个控件重用上下文菜单
我有三个树视图控件,它们包含不同的(但大部分是相似的数据),因此,就用户而言,每个级别可以采取的操作是相同的,但类型不同(这是作为开发人员我必须担心的)。我想做的是重用这个上下文菜单并向它传递一个类型(或者能够检索它),然后将该类型传递给实际执行的函数 因此,我们可以有一个共同的措辞这里有一些代码:在WPF中为多个控件重用上下文菜单,wpf,parameters,contextmenu,Wpf,Parameters,Contextmenu,我有三个树视图控件,它们包含不同的(但大部分是相似的数据),因此,就用户而言,每个级别可以采取的操作是相同的,但类型不同(这是作为开发人员我必须担心的)。我想做的是重用这个上下文菜单并向它传递一个类型(或者能够检索它),然后将该类型传递给实际执行的函数 因此,我们可以有一个共同的措辞这里有一些代码: <UserControl x:Class="ucControl" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentat
<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>
在本例中,我希望每个尺寸、品牌和颜色都具有相同的上下文菜单,但如果在“尺寸”树视图中调出上下文菜单,我将需要向表中添加一组类型大小。我这样做可能吗?我试图避免制作三个上下文菜单,这显然是一种方法。我知道只有一种方法可以实现这一点, 在CommandHandler中,您需要检查哪个树调用了它 在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
}
希望这有帮助 这应该行得通,我必须在某些方法中从元素中获取id。