Wpf 中 MenuItems 的选择性样式
Selective styling of MenuItems in Wpf
我有一个 MenuItem
,在 headers 下有几个动态列表。我想为来自 CollectionContainer
项目的项目设计样式,而不是 headers 已经属于 MenuItem
类型的项目。我之前一直通过使用 DataTemplate
来做到这一点,但是 运行 变成了 this issue.
<MenuItem Header="Test">
<MenuItem.ItemsSource>
<CompositeCollection>
<MenuItem Header="List A" IsEnabled="False" />
<CollectionContainer Collection="{Binding Source={StaticResource ListACollectionViewSource}}" />
<MenuItem Header="List B" IsEnabled="False" />
<CollectionContainer Collection="{Binding Source={StaticResource ListBCollectionViewSource}}" />
</CompositeCollection>
</MenuItem.ItemsSource>
</MenuItem>
我怎样才能只设置那些特定列表的样式?
一种解决方案是为 MenuItems 设置默认样式,然后生成的项目将使用该样式。然后,对于非生成的项目,您可以将样式显式设置为另一种样式。
<!-- this will be the style of each generated MenuItem -->
<Style TargetType="{x:Type MenuItem}" BasedOn="{StaticResource {x:Type MenuItem}}">
<Setter Property="Header" Value="{Binding Path=Text, StringFormat=Example {0}}" />
<Setter Property="Command" Value="{Binding Path=Command}" />
<Setter Property="Icon" Value="{StaticResource TheImage}" />
</Style>
它变得有点冗长,但它允许混合使用动态和非动态项目:
<Menu DockPanel.Dock="Top">
<Menu.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:MenuItemViewModel}" ItemsSource="{Binding Path=MenuItems}">
<TextBlock Text="{Binding}"/>
</HierarchicalDataTemplate>
</Menu.ItemTemplate>
<Menu.ItemsSource>
<CompositeCollection>
<MenuItem Header="123" Style="{StaticResource NormalMenuItem}">
<MenuItem Header="Beta1" Style="{StaticResource NormalMenuItem}"/>
<MenuItem Header="Beta2" Style="{StaticResource NormalMenuItem}"/>
<MenuItem Header="Beta3" Style="{StaticResource NormalMenuItem}"/>
<MenuItem Header="Close" Command="Close" CommandTarget="{Binding ElementName=Window}" />
</MenuItem>
<CollectionContainer Collection="{Binding Source={StaticResource Items}}" />
</CompositeCollection>
</Menu.ItemsSource>
</Menu>
我有一个 MenuItem
,在 headers 下有几个动态列表。我想为来自 CollectionContainer
项目的项目设计样式,而不是 headers 已经属于 MenuItem
类型的项目。我之前一直通过使用 DataTemplate
来做到这一点,但是 运行 变成了 this issue.
<MenuItem Header="Test">
<MenuItem.ItemsSource>
<CompositeCollection>
<MenuItem Header="List A" IsEnabled="False" />
<CollectionContainer Collection="{Binding Source={StaticResource ListACollectionViewSource}}" />
<MenuItem Header="List B" IsEnabled="False" />
<CollectionContainer Collection="{Binding Source={StaticResource ListBCollectionViewSource}}" />
</CompositeCollection>
</MenuItem.ItemsSource>
</MenuItem>
我怎样才能只设置那些特定列表的样式?
一种解决方案是为 MenuItems 设置默认样式,然后生成的项目将使用该样式。然后,对于非生成的项目,您可以将样式显式设置为另一种样式。
<!-- this will be the style of each generated MenuItem -->
<Style TargetType="{x:Type MenuItem}" BasedOn="{StaticResource {x:Type MenuItem}}">
<Setter Property="Header" Value="{Binding Path=Text, StringFormat=Example {0}}" />
<Setter Property="Command" Value="{Binding Path=Command}" />
<Setter Property="Icon" Value="{StaticResource TheImage}" />
</Style>
它变得有点冗长,但它允许混合使用动态和非动态项目:
<Menu DockPanel.Dock="Top">
<Menu.ItemTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:MenuItemViewModel}" ItemsSource="{Binding Path=MenuItems}">
<TextBlock Text="{Binding}"/>
</HierarchicalDataTemplate>
</Menu.ItemTemplate>
<Menu.ItemsSource>
<CompositeCollection>
<MenuItem Header="123" Style="{StaticResource NormalMenuItem}">
<MenuItem Header="Beta1" Style="{StaticResource NormalMenuItem}"/>
<MenuItem Header="Beta2" Style="{StaticResource NormalMenuItem}"/>
<MenuItem Header="Beta3" Style="{StaticResource NormalMenuItem}"/>
<MenuItem Header="Close" Command="Close" CommandTarget="{Binding ElementName=Window}" />
</MenuItem>
<CollectionContainer Collection="{Binding Source={StaticResource Items}}" />
</CompositeCollection>
</Menu.ItemsSource>
</Menu>