2014-10-28 52 views
1

我想动态地在代码中填充菜单并在c#中设置其图标。将MenuItem.Icon设置为不起作用的图像

我已经读到这里这篇文章,给出的答案似乎是完全合理的:

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是false)。

我打赌,我正在做某种新手的错误的地方,但我只是没有看到它(备案,菜单的所有其他方面如预期工作)提前

谢谢:)

编辑1: 目前,图像只是一个测试的占位符,我已经添加了作为项目的链接,然后将'build action'设置为'none'和'copy to output directory ''复制,如果更新'。图像被称为“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

你确定了'fileName'设置是否正确?如果可能的话,请告诉你如何将你的图像导入到你的项目以及'fileName'的特定字符串。 – 2014-10-28 14:11:43

+0

当然。编辑相应的问题 – 2014-10-28 14:31:44

回答

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一些ImageBrushBitmapImage初始化,我们不需要上述任何步骤。 (只需使用一个构造函数调用Uri即可)。

还嵌入了您的图像作为Resource(而不是None)时,你可以试试这个代码,而不是:

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

感谢您的回复。我尝试过使用你的第一个建议(我之前看到过BeginInit和EndInit,所以我觉得它可以工作),但它仍然不显示我的图标...我试图将图像更改为资源并使用您提到的链接,但它说系统找不到指定的文件...我觉得我在做一些愚蠢的事情。 – 2014-10-28 16:03:57

+0

@BenjaminEvans尝试根据你的'BitmapImage'设置一些背景,通常如果文件路径正常,背景应该正确显示。另外,请确定你已经尝试了我的代码,问题不仅仅是'BeginInit'和'EndInit',它还涉及'CacheOption'。事实上,我可以重现你的问题,并尝试这段代码确实有助于解决它。 – 2014-10-28 16:10:34

+0

添加了更多修改(请参阅2和3)。在其他地方使用图像似乎工作 – 2014-10-29 08:01:39