将MenuItem.Icon设置为无效的图像

时间:2014-10-28 13:53:22

标签: c# wpf

我正在尝试在代码中动态填充菜单,并在c#中设置其图标。

我在这里阅读了这篇文章,给出的答案看起来非常合理:

WPF setting a MenuItem.Icon in code

我的解释:

mItem.Icon = new Image                       
{
    //filename is just image.png in build output folder
    Source = new BitmapImage(new Uri(fileName, UriKind.Relative)) 
}; 

但是当涉及到运行时,图标不存在。在检查WPF可视化工具中的数据时,它表示图像的ActualHeight和ActualWidth为0并且它看起来没有初始化(可以说,IsInitialized和IsLoaded都是假的)。

我打赌我在某处犯了一些新手的错误,但我只是没有看到它(为了记录,菜单的其他方面都按预期工作)

提前致谢:)

编辑1: 目前,图像只是测试的占位符,我已将其添加为项目的链接,然后将“构建操作”设置为“无”,将“复制到输出目录”设置为“复制更新”。该图像名为“buttonIndicator_off.png”,运行时的文件名字符串为“buttonIndicator_off.png”

编辑2: 也尝试了这个:

var bm = new BitmapImage();
bm.BeginInit();
bm.CacheOption = BitmapCacheOption.OnLoad;
bm.UriSource = new Uri(fileName, UriKind.Relative);
bm.EndInit();
mItem.Icon = new Image {
    Source = bm
}; 

并将图像设置为编译为资源并使用:

mItem.Icon = new Image 
{
    Source = new BitmapImage( new Uri("pack://application:,,,/buttonIndicator_off.png"))
};

我几乎可以肯定所有这些解决方案都应该有效,所以我开始认为发生了一些奇怪的事情。

编辑3:带有矩形填充的测试图像:

rectangle_testImage.Fill = new ImageBrush(bm);

这是有效的

1 个答案:

答案 0 :(得分:0)

经过一番尝试后,我成功地完成了它的工作。问题是您必须将CacheOption设置为BitmapCacheOption.OnLoad。重要的是我们必须将所有初始化代码放在BeginInit()EndInit()调用之间:

var bm = new BitmapImage();
bm.BeginInit();
bm.CacheOption = BitmapCacheOption.OnLoad;
bm.UriSource = new Uri(fileName, UriKind.Relative);
bm.EndInit();
mItem.Icon = new Image {
  Source = bm
}; 

特别之处在于,如果您尝试从Background初始化某些ImageBrush BitmapImage,我们就不需要执行上述任何步骤。 (只需在传入Uri的情况下使用一个构造函数调用)。

另外,当您将图片嵌入Resource(而不是None)时,您可以尝试使用此代码:

mItem.Icon = new Image {
  Source = new BitmapImage(
                new Uri("pack://application:,,,/buttonIndicator_off.png"))
};