XAML 中的 WPF 合并上下文菜单
WPF Merge ContextMenues in XAML
是否可以合并 XAML 中的两个上下文菜单?
我创建了两个上下文菜单作为资源。我在几个数据模板中使用它们并且工作正常。但是,对于某些 DataTemplates,我想合并两个 ContextMenues。不幸的是,这似乎不起作用。
这是其中一个上下文菜单的一些代码,其他的定义相同:
<ContextMenu x:Key="CtxIEditableViewModel" DataContext="{Binding PlacementTarget,RelativeSource={RelativeSource Self}}">
<MenuItem Header="Edit" Command="{Binding Path=DataContext.EditCommand}" CommandParameter="{Binding }">
<MenuItem.Icon>
<Image Source="{StaticResource IcoEdit}" Width="16" Height="16"></Image>
</MenuItem.Icon>
</MenuItem>
...
使用其中一个上下文菜单效果很好:
<StackPanel Orientation="Horizontal" ContextMenu="{StaticResource CtxIEditableViewModel}">
但是如何合并两个呢?这不起作用
<StackPanel Orientation="Horizontal">
<ContextMenu>
<ContextMenu.ItemsSource>
<CompositeCollection>
<StaticResource ResourceKey="CtxIEditableViewModel" />
<StaticResource ResourceKey="CtxRootViewModel" />
</CompositeCollection>
</ContextMenu.ItemsSource>
这也行不通:
<StackPanel Orientation="Horizontal">
<ContextMenu>
<StaticResource ResourceKey="CtxIEditableViewModel" />
<StaticResource ResourceKey="CtxRootViewModel" />
</ContextMenu>
当我 运行 程序抛出异常时,提示上下文菜单可能不包含逻辑或可视父项。因为如果我只使用一个 ContextMenu 就可以正常工作,所以我不理解异常消息。
如何在 XAML 中合并这两个上下文菜单(或者根本不可能)?
这是使用 CompositeCollection
的一种方法
<Window.Resources>
<x:Array Type="{x:Type sys:Object}" x:Key="CtxIEditableViewModel">
<MenuItem Header="Edit1"/>
<MenuItem Header="Edit2"/>
</x:Array>
<x:Array Type="{x:Type sys:Object}" x:Key="CtxRootViewModel">
<MenuItem Header="Root1" />
<MenuItem Header="Root2"/>
</x:Array>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Border Grid.Row="0" Background="LightBlue">
<Border.ContextMenu>
<ContextMenu>
<ContextMenu.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{StaticResource CtxIEditableViewModel}" />
</CompositeCollection>
</ContextMenu.ItemsSource>
</ContextMenu>
</Border.ContextMenu>
</Border>
<Border Grid.Row="1" Background="LightGreen">
<Border.ContextMenu>
<ContextMenu>
<ContextMenu.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{StaticResource CtxRootViewModel}" />
</CompositeCollection>
</ContextMenu.ItemsSource>
</ContextMenu>
</Border.ContextMenu>
</Border>
<Border Grid.Row="2" Background="Khaki">
<Border.ContextMenu>
<ContextMenu>
<ContextMenu.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{StaticResource CtxIEditableViewModel}" />
<CollectionContainer Collection="{StaticResource CtxRootViewModel}" />
</CompositeCollection>
</ContextMenu.ItemsSource>
</ContextMenu>
</Border.ContextMenu>
</Border>
</Grid>
是否可以合并 XAML 中的两个上下文菜单?
我创建了两个上下文菜单作为资源。我在几个数据模板中使用它们并且工作正常。但是,对于某些 DataTemplates,我想合并两个 ContextMenues。不幸的是,这似乎不起作用。 这是其中一个上下文菜单的一些代码,其他的定义相同:
<ContextMenu x:Key="CtxIEditableViewModel" DataContext="{Binding PlacementTarget,RelativeSource={RelativeSource Self}}">
<MenuItem Header="Edit" Command="{Binding Path=DataContext.EditCommand}" CommandParameter="{Binding }">
<MenuItem.Icon>
<Image Source="{StaticResource IcoEdit}" Width="16" Height="16"></Image>
</MenuItem.Icon>
</MenuItem>
...
使用其中一个上下文菜单效果很好:
<StackPanel Orientation="Horizontal" ContextMenu="{StaticResource CtxIEditableViewModel}">
但是如何合并两个呢?这不起作用
<StackPanel Orientation="Horizontal">
<ContextMenu>
<ContextMenu.ItemsSource>
<CompositeCollection>
<StaticResource ResourceKey="CtxIEditableViewModel" />
<StaticResource ResourceKey="CtxRootViewModel" />
</CompositeCollection>
</ContextMenu.ItemsSource>
这也行不通:
<StackPanel Orientation="Horizontal">
<ContextMenu>
<StaticResource ResourceKey="CtxIEditableViewModel" />
<StaticResource ResourceKey="CtxRootViewModel" />
</ContextMenu>
当我 运行 程序抛出异常时,提示上下文菜单可能不包含逻辑或可视父项。因为如果我只使用一个 ContextMenu 就可以正常工作,所以我不理解异常消息。
如何在 XAML 中合并这两个上下文菜单(或者根本不可能)?
这是使用 CompositeCollection
<Window.Resources>
<x:Array Type="{x:Type sys:Object}" x:Key="CtxIEditableViewModel">
<MenuItem Header="Edit1"/>
<MenuItem Header="Edit2"/>
</x:Array>
<x:Array Type="{x:Type sys:Object}" x:Key="CtxRootViewModel">
<MenuItem Header="Root1" />
<MenuItem Header="Root2"/>
</x:Array>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
<RowDefinition Height="*"/>
</Grid.RowDefinitions>
<Border Grid.Row="0" Background="LightBlue">
<Border.ContextMenu>
<ContextMenu>
<ContextMenu.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{StaticResource CtxIEditableViewModel}" />
</CompositeCollection>
</ContextMenu.ItemsSource>
</ContextMenu>
</Border.ContextMenu>
</Border>
<Border Grid.Row="1" Background="LightGreen">
<Border.ContextMenu>
<ContextMenu>
<ContextMenu.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{StaticResource CtxRootViewModel}" />
</CompositeCollection>
</ContextMenu.ItemsSource>
</ContextMenu>
</Border.ContextMenu>
</Border>
<Border Grid.Row="2" Background="Khaki">
<Border.ContextMenu>
<ContextMenu>
<ContextMenu.ItemsSource>
<CompositeCollection>
<CollectionContainer Collection="{StaticResource CtxIEditableViewModel}" />
<CollectionContainer Collection="{StaticResource CtxRootViewModel}" />
</CompositeCollection>
</ContextMenu.ItemsSource>
</ContextMenu>
</Border.ContextMenu>
</Border>
</Grid>