c# - WPF MenuItem图标分享

标签 c# wpf menuitem shared

我想将图标绑定(bind)到动态创建这些项目的 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}" />

我已经尝试在 Image 控件上设置此 Shared 属性,但没有成功。

有什么建议吗?

最佳答案

你快到了!

首先:不要被 Template vs Style. 搞糊涂了

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

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

您有 2 种解决方案来满足您的需求:

  • 改为使用数据模板,并重新定义 MenuItem 的整个模板
  • 使用具有共享图像组件的样式(您尝试实现的目标)

在您的示例中,唯一的错误是 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>

希望对您有所帮助。

关于c# - WPF MenuItem图标分享,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40038759/

相关文章:

c# - 如何将数字写入文件并使其在 Java 和 C# 之间可读

wpf - 如何动态绑定(bind)和静态添加 MenuItem?

Android 菜单到选项卡式操作栏

Android 操作栏菜单项

c# - Haskell 中的 OOP 样式继承

c# - 避免 VBCSCompiler 性能命中 Roslyn 支持的 ASP.NET Razor MVC View ?

c# - JWT承载 token 授权不起作用ASP Net Core Web API

wpf - 如何释放Image.Source来更新WPF中的图像?

wpf - 我们可以在验证模板中使用按钮吗?我们如何将它绑定(bind)到 ViewModel 方法?

wpf - 当 IsSelected 和 TreeView 中使用的两种类型时更改 TreeViewItem 模板