Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将ItemsSource与ResourceDictionary或MergedDictionary一起使用setter属性时的MenuItem样式_C#_Wpf_Xaml_Styles_Menuitem - Fatal编程技术网

C# 将ItemsSource与ResourceDictionary或MergedDictionary一起使用setter属性时的MenuItem样式

C# 将ItemsSource与ResourceDictionary或MergedDictionary一起使用setter属性时的MenuItem样式,c#,wpf,xaml,styles,menuitem,C#,Wpf,Xaml,Styles,Menuitem,我有一个上下文菜单,它是从一个使用XamlReader.Load()加载的ResourceDictionary中正确设置的样式。我使用的样式键是一个我称之为styleBanner的DynamicSource 在这个上下文菜单中,我有一个名为Skins的菜单项,它也使用saveoverdynamicresourcestylebanner正确设置了样式。但是此菜单项将其子菜单项数据绑定到数据上下文视图模型中的ItemsSource,这也可以正常工作 我的问题是子菜单项的样式不正确 以下是工作原理,但

我有一个上下文菜单,它是从一个使用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}">