C# 将ItemsSource与ResourceDictionary或MergedDictionary一起使用setter属性时的MenuItem样式
我有一个上下文菜单,它是从一个使用XamlReader.Load()加载的ResourceDictionary中正确设置的样式。我使用的样式键是一个我称之为styleBanner的DynamicSource 在这个上下文菜单中,我有一个名为Skins的菜单项,它也使用saveoverdynamicresourcestylebanner正确设置了样式。但是此菜单项将其子菜单项数据绑定到数据上下文视图模型中的ItemsSource,这也可以正常工作 我的问题是子菜单项的样式不正确 以下是工作原理,但根本不需要设置样式:C# 将ItemsSource与ResourceDictionary或MergedDictionary一起使用setter属性时的MenuItem样式,c#,wpf,xaml,styles,menuitem,C#,Wpf,Xaml,Styles,Menuitem,我有一个上下文菜单,它是从一个使用XamlReader.Load()加载的ResourceDictionary中正确设置的样式。我使用的样式键是一个我称之为styleBanner的DynamicSource 在这个上下文菜单中,我有一个名为Skins的菜单项,它也使用saveoverdynamicresourcestylebanner正确设置了样式。但是此菜单项将其子菜单项数据绑定到数据上下文视图模型中的ItemsSource,这也可以正常工作 我的问题是子菜单项的样式不正确 以下是工作原理,但
<Window.ContextMenu>
<ContextMenu DataContext="TimersHostViewModel" Name="TimersHostContextMenu" Style="{DynamicResource styleBanner}">
<MenuItem Name="Skins" Header="Skins" ItemsSource="{Binding Source={StaticResource TimersHostViewModel}, Path=Skins}" Style="{DynamicResource styleBanner}">
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Header" Value="{Binding Path=SkinName}"/>
<Setter Property="Command" Value="{Binding Source={StaticResource TimersHostViewModel}, Path=TimersHostContextMenuClickCommand}"/>
<Setter Property="CommandParameter" Value="{Binding Path=SkinName}"/>
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
</ContextMenu>
</Window.ContextMenu>
这里有一件事我试过了,我试着添加以下行:
<Setter Property="Style" Value={DynamicResource styleBanner}"/>
不能在样式中设置样式属性
在样式(例如ContextMenuStyle)中,将StyleBanner设置为ItemContainerStyle
例如,将您的样式名称命名为ContextMenuStyle,并将其ItemContainer样式设置为StyleBanner
<Style x:Key="ContextMenuStyle" TargetType="MenuItem">
<Setter Property="Header" Value="{Binding Path=SkinName}"/>
<Setter Property="Command" Value="{Binding Source={StaticResource TimersHostViewModel}, Path=TimersHostContextMenuClickCommand}"/>
<Setter Property="CommandParameter" Value="{Binding Path=SkinName}"/>
<Setter Property="ItemContainerStyle" Value="{DynamicResource styleBanner}"/>
</Style>
您可以使用“BasedOn”属性:
<MenuItem.ItemContainerStyle>
<Style BasedOn="{StaticResource ISAMenu}" TargetType="MenuItem">
<Setter Property="Command" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MenuItem}, Path=DataContext.ChangeLanguageCommand}" />
<Setter Property="CommandParameter" Value="{Binding}" />
</Style>
</MenuItem.ItemContainerStyle>
然后在App.xaml中,只需引用字典即可
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Assets/ResourceDictionaries/NavBarMenu.xaml" />
</ResourceDictionary.MergedDictionaries>
最后在NavBarMenu.xaml中
<Style x:Key="ISAMenu" TargetType="{x:Type MenuItem}">
这是一个老问题,但我花了一些时间寻找另一个干净的解决方案,因此我希望它能帮助别人。您使用的是哪个.net框架?我知道,我需要的是ItemContainerStyle。事实上,我看到了其他一些东西,它实际上一直在工作,除了ResourceDictionary中的子菜单项background。我会更新这个问题。这是一个新的信息。这看起来真的很有希望实现这一目标。事实上,我很难找到这个问题的正确解决方案,并将其推广到全局蒙皮解决方案,这是我一起放弃XAML的原因之一。的确,我希望它能帮助其他人-D
<Window.ContextMenu>
<ContextMenu DataContext="TimersHostViewModel" Name="TimersHostContextMenu" Style="{DynamicResource styleBanner}">
<MenuItem Name="Skins" Header="Skins" ItemsSource="{Binding Source={StaticResource TimersHostViewModel}, Path=Skins}" Style="{DynamicResource styleBanner}">
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Header" Value="{Binding Path=SkinName}"/>
<Setter Property="Command" Value="{Binding Source={StaticResource TimersHostViewModel}, Path=TimersHostContextMenuClickCommand}"/>
<Setter Property="CommandParameter" Value="{Binding Path=SkinName}"/>
<Setter Property="ItemContainerStyle" Value="{DynamicResource styleBanner}"/>
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
</ContextMenu>
</Window.ContextMenu>
<!-- Banner Style -->
<Style x:Key="styleBanner">
<Setter Property="StackPanel.Background">
<Setter.Value>
<LinearGradientBrush StartPoint="0,0.25" EndPoint="1,0.5">
<GradientStop Color="#CC0088DD" Offset="0.3" />
<GradientStop Color="#3300FFFF" Offset="0.85" />
</LinearGradientBrush>
</Setter.Value>
</Setter>
<Setter Property="TextBlock.Foreground" Value="Yellow" />
<Setter Property="TextBlock.FontFamily" Value="Comic Sans MS" />
</Style>
<Style x:Key="ContextMenuStyle" TargetType="MenuItem">
<Setter Property="Header" Value="{Binding Path=SkinName}"/>
<Setter Property="Command" Value="{Binding Source={StaticResource TimersHostViewModel}, Path=TimersHostContextMenuClickCommand}"/>
<Setter Property="CommandParameter" Value="{Binding Path=SkinName}"/>
<Setter Property="ItemContainerStyle" Value="{DynamicResource styleBanner}"/>
</Style>
<ContextMenu.Style>
<StaticResource ResourceKey="ContextMenuStyle"></StaticResource>
</ContextMenu.Style>
<Setter Property="Template">
<Setter.Value>
<ControlTemplate>
<Border >
<Border.Background>
<LinearGradientBrush StartPoint="0,0.25" EndPoint="1,0.5">
<GradientStop Color="#CC0088DD" Offset="0.3" />
<GradientStop Color="#3300FFFF" Offset="0.85" />
</LinearGradientBrush>
</Border.Background>
<Button Content="{Binding Path=SkinName}" Command="{Binding Source={StaticResource TimersHostViewModel}, Path=TimersHostContextMenuClickCommand}"
CommandParameter="{Binding Path=SkinName}"
Foreground="Yellow" FontFamily="Comic Sans MS"></Button>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<MenuItem.ItemContainerStyle>
<Style BasedOn="{StaticResource ISAMenu}" TargetType="MenuItem">
<Setter Property="Command" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MenuItem}, Path=DataContext.ChangeLanguageCommand}" />
<Setter Property="CommandParameter" Value="{Binding}" />
</Style>
</MenuItem.ItemContainerStyle>
<ResourceDictionary.MergedDictionaries>
<ResourceDictionary Source="Assets/ResourceDictionaries/NavBarMenu.xaml" />
</ResourceDictionary.MergedDictionaries>
<Style x:Key="ISAMenu" TargetType="{x:Type MenuItem}">