WPF菜单项图标共享

4

我想将图标绑定到动态创建的MenuItem控件。我试过将x:Shared属性设置为False,但始终只有最后一个项目有图标。

这是我的MenuItems ItemContainerStyle样式代码:

<Window.Resources>
    <Style TargetType="{x:Type MenuItem}" x:Key="MenuItemStyle" x:Shared="False">
        <Setter Property="Icon">
            <Setter.Value>
                <Image Source="{Binding IconSource}" />
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>

并且MenuItem的定义:

<MenuItem Header="Workspaces" ItemsSource="{Binding WorkspaceItems}" Icon="{StaticResource BranchIcon}" ItemContainerStyle="{StaticResource MenuItemStyle}" />

我已经尝试在图像控件上设置共享属性,但没有成功。

有什么建议吗?


你在Visual Studio的输出窗口中是否收到任何绑定错误/警告? - haindl
不,它是可编译的。而且它只适用于一个项目。我知道当样式始终更改位置时会发生这种情况,因为它只能有一个父级。但是每个人都说它可以通过x:Shared属性进行修改。也许我错过了什么,我不知道为什么它不起作用。 - Panthesilea
1个回答

6

你已经接近成功了!

首先,不要被模板 vs 样式所困惑。

当你将Icon属性设置为Image控件时,只会创建一个副本。由于控件只能有一个父级,每次重新分配时它都会从以前的父级中删除。

这就是为什么你只看到一个图标的原因。

你有两个解决方案:

  • 使用DataTemplate,重新定义MenuItem的整个模板
  • 使用带有共享图像组件的样式(你试图实现的内容)

在你的示例中,唯一的错误是Image资源上的Shared属性应该是false,而不是整个样式。这应该可以解决问题:

<Window.Resources>
    <Image x:Key="MenuIconImage" x:Shared="false" Source="{Binding IconSource}"/>

    <Style TargetType="{x:Type MenuItem}" x:Key="MenuItemStyle" BasedOn="{StaticResource {x:Type MenuItem}}">
        <Setter Property="Icon" Value="{StaticResource MenuIconImage}">
        </Setter>
    </Style>
</Window.Resources>

希望有所帮助。

谢谢!我尝试了共享图像组件,它可以正常工作 :) - Panthesilea
1
我完全按照这个做了,但是无法让它在我的菜单项上正常显示(图标仍然只显示在最后/底部的菜单项上)。我尝试使用MaterialDesign.PackIcon作为MenuItem.Icon,也尝试使用普通图片。有什么想法吗? - Peter
@Peter 我不得不在我的ResourceDictionary(在App.xaml中)中的MenuIconImage上添加一个x:Shared="false"属性,所以整行看起来像这样<Image x:Key="DbIconImage" Source="/Images/database_32xLG.png" x:Shared="false"/> - Victor Wilson
为了让MaterialDesign图标显示出来(而不仅仅是最后一个),我必须在绑定上使用转换器,该转换器返回PackIconKind。 - h4le5torm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接