我有一些图像用作ContextMenu
项目的图标:
<UserControl.Resources>
<Image x:Key="DeleteIco" Source="pack://application:,,,/MyProject.myControl;component/Resources/Delete.ico" Width="16" Height="16"/>
...
<ContextMenu x:Key="MyMenu1">
<MenuItem Header="Delete" Icon="{StaticResource DeleteIco}"/>
</ContextMenu>
<ContextMenu x:Key="MyMenu2">
<MenuItem Header="Delete me" Icon="{StaticResource DeleteIco}"/>
</ContextMenu>
<UserControl.Resources>
有时第一个菜单会错过图标,有时第二个菜单会错过...为什么?我没有对代码中的图标做任何事情。
答案 0 :(得分:2)
您已创建Image
控件,并尝试将其两次放入可视树中。由于所有控件只能有一个父级Image
已断开连接。因此,第二次使用它时,第一次将断开连接,导致您丢失图标。
您可以解决此问题,方法是不添加Image
,而是将ImageSource
添加到您的资源中:
<BitmapImage x:Key="DeleteIco" UriSource="pack://application:,,,/MyProject.myControl;component/Resources/Delete.ico" />
您的菜单必须稍微更改一下才能正常工作:
<ContextMenu x:Key="MyMenu1">
<MenuItem Header="Delete">
<MenuItem.Icon>
<Image Source="{StaticResource DeleteIco}" Width="16" Height="16"/>
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
<ContextMenu x:Key="MyMenu2">
<MenuItem Header="Delete me">
<MenuItem.Icon>
<Image Source="{StaticResource DeleteIco}" Width="16" Height="16"/>
</MenuItem.Icon>
</MenuItem>
</ContextMenu>
<强>更新强>
您还可以使用样式为您设置Image
的一些基本属性
<Style TargetType="Image">
<Setter Property="Width" Value="16"/>
<Setter Property="Width" Value="16"/>
</Style>
或者使用MenuItem
的样式每次设置Icon
。
<Style TargetType="MenuItem" x:Key="DeleteMenuIcon">
<Setter Property="Icon">
<Setter.Value>
<Image Source="{StaticResource DeleteIco}" Width="16" Height="16"/>
</Setter.Value>
</Setter>
</Style>
菜单项:
<MenuItem Header="Delete me" Style="{StaticResource DeleteMenuIcon}" />
答案 1 :(得分:1)
我有同样的问题,但标记的解决方案并没有为我解决。 做了解决问题的方法是在Image
资源上设置x:Shared="False"
:
<Image x:Key="DeleteIco"
x:Shared="False"
Source="pack://application:,,,/MyProject.myControl;component/Resources/Delete.ico"
Width="16" Height="16"/>
正如@Arcturus正确提到的那样,您当前正在为多个控件设置与子控件相同的图像控件,这会导致它每次都与前一个控件分离,然后仅为最后一个控件设置。设置x:Shared="False"
将导致每次请求资源时都创建一个新的Image
控件,从而解决问题。
需要注意的一点是x:Shared
属性无法在任何地方设置,因此请确保在实际适用的地方使用它(来自上文):
在WPF中,x:Shared仅在以下条件下有效:
包含x:Shared项目的ResourceDictionary必须是 编译。 ResourceDictionary不能在松散的XAML中使用或使用 主题。
包含项目的ResourceDictionary不得为 嵌套在另一个ResourceDictionary中。例如,你不能使用 x:在StyleDictionary中的一个Style内共享 已经是ResourceDictionary项目。