gpt4 book ai didi

wpf - 使用 ItemContainerStyle 时如何在 ContextMenu 的 MenuItem 中设置图标

转载 作者:行者123 更新时间:2023-12-04 06:59:44 25 4
gpt4 key购买 nike

所以我有一个 Context Menu还有一个 MenuItem在其中分解为名称列表:

<ContextMenu>
<MenuItem Header="Set As Default For" ItemsSource="{Binding Source={StaticResource Names}}">
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Header" Value={Binding Name}/>
<Setter Property="Command" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MenuItem}, Path=DataContext.DoSomething}" />
<Setter Property="CommandParameter" Value="{Binding }" />
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
</ContextMenu>

现在上面的代码工作文件并显示我的名字列表。现在我想使用 Pack URI 在每个名称旁边添加一个图标..所以来自 this question我可以看到最好的方法是模板化 Header所以我首先尝试了这个问题
<ContextMenu>
<MenuItem Header="Set As Default For" ItemsSource="{Binding Source={StaticResource Names}}">
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Header">
<Setter.Value>
<StackPanel>
<Image Width="20" Height="20" Source="/MyProj;component/Resources/MyImg.png" />
<ContentPresenter Content="{Binding Name}" />
</StackPanel>
</Setter.Value>
</Setter>
<Setter Property="Command" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MenuItem}, Path=DataContext.DoSomething}" />
<Setter Property="CommandParameter" Value="{Binding }" />
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
</ContextMenu>

但这给了我错误:

Specified element is already the logical child of another element. Disconnect it first.



所以我经过一些研究后尝试:
<ContextMenu>
<MenuItem Header="Set As Default For" ItemsSource="{Binding Source={StaticResource Names}}">
<MenuItem.ItemContainerStyle>
<Style TargetType="MenuItem">
<Setter Property="Header">
<Setter.Value>
<ControlTemplate>
<StackPanel>
<Image Width="20" Height="20" Source="/MyProj;component/Resources/MyImg.png" />
<ContentPresenter Content="{Binding Name}" />
</StackPanel>
</ControlTemplate>
</Setter.Value>
</Setter>
<Setter Property="Command" Value="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType=MenuItem}, Path=DataContext.DoSomething}" />
<Setter Property="CommandParameter" Value="{Binding }" />
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
</ContextMenu>

但是现在我所有的名字都是 ControlTemplate 并且没有显示任何图标......

如何通过 ItemContainerStyle 向上下文菜单的菜单项添加图标?

编辑

我试过了:
   <Setter Property="Header" Value="{Binding Name}"/>
<Setter Property="Icon">
<Setter.Value>
<Image Width="20" Height="20" Source="/MyProj;component/Resources/MyImg.png" />
</Setter.Value>
</Setter>

我得到了一个图标渲染,但只针对我菜单中的最后一个项目?

最佳答案

问题是您不能在多个地方使用一种视觉效果。您可以使用 HeaderTemplate 来做到这一点。而不是 Header ,但使用 DataTemplate而不是 ControlTemplate

<Style TargetType="MenuItem">
<Setter Property="HeaderTemplate">
<Setter.Value>
<DataTemplate>
<StackPanel>
<Image Width="20" Height="20" Source="/MyProj;component/Resources/MyImg.png" />
<ContentPresenter Content="{Binding Name}" />
</StackPanel>
</DataTemplate>
</Setter.Value>
</Setter>
<!-- other setters -->
</Style>

请注意,此解决方案会将图标放在 MenuItem 的内容部分。 ,不是图标。另一种解决方案是设置 Icon MenuItem 的属性(property)作为另一个 Setter但在这种情况下 Image需要
分开 Resourcex:Shared设置为 false 否则你最终会遇到同样的问题,只有最后一个项目有一个图标。
<ContextMenu>
<ContextMenu.Resources>
<Image Width="20" Height="20" Source="/MyProj;component/Resources/MyImg.png" x:Key="myMenuIcon" x:Shared="False" />
</ContextMenu.Resources>
<MenuItem Header="Set As Default For" ItemsSource="{Binding Source={StaticResource Names}}">
<MenuItem.ItemContainerStyle>
<Style TargetType="{x:Type MenuItem}">
<Setter Property="Header" Value="{Binding Name}"/>
<Setter Property="Icon" Value="{StaticResource myMenuIcon}"/>
</Style>
</MenuItem.ItemContainerStyle>
</MenuItem>
</ContextMenu>

关于wpf - 使用 ItemContainerStyle 时如何在 ContextMenu 的 MenuItem 中设置图标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29097820/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com