我正在尝试在代码中动态填充菜单,并在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);
这是有效的
答案 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"))
};