2014-10-28 49 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