2013-10-02 70 views
1

我有我的程序集中的資源,我可以使用Properties.Resources.MyImage訪問。
我有一些類,我綁定到一個WPF菜單項包含屬性將System.Drawing.Image資源轉換爲System.Windows.Controls.Image for wpf MenuItem

public System.Windows.Controls.Image Icon {get; set;} 

此我想設置以編程方式使用:

dummy.Icon = Properties.Resources.MyImage; 

現在我想將資源轉換System.Drawing中。圖像到WPF System.Windows.Controls.Image。我認爲這應該是直截了當的,但我發現我的圖像沒有工作解決方案(這是使用透明度的PNG文件)。

那麼如何將System.Drawing.Image轉換爲System.Windows.Controls.Image?

+1

這並不直接回答你的問題,但我強烈建議你*不*加載'系統。 Drawing.Image'對象。它會相當慢,消耗更多的內存(你會加載每個圖像兩次)。你可以直接使用WPF資源(build action'Resource'),它會加載一個'ImageSource'(我也建議使用'ImageSource'作爲你的綁定源屬性而不是'Image',這是一個控件 - 因此它不能被添加到視覺樹中的多個位置)。 –

+0

好的提示,但如何?我無法直接將xaml綁定到資源,它需要在運行時進行設置。那麼如何從代碼中使用Properties.Resources.MyImage訪問資源? – Sam

+2

請勿爲圖像使用Properties.Resources;它與WPF不兼容。我會寫一個完整的答案。 –

回答

2

而不是使用Windows窗體嵌入式資源Properties.Resources使用WPF資源。在解決方案資源管理器中,單擊圖像文件,然後在屬性窗口中將其生成操作設置爲資源而不是嵌入式資源)。這也將圖像嵌入到程序集中,但以不同的方式。

不像Windows窗體,WPF不產生資源管理器類,所以你必須使用字符串動態地加載圖像:

BitmapImage image = new BitmapImage(); 
image.BeginInit(); 
image.UriSource = new Uri("pack://application:,,,/NameOfAssembly;component/Path/To/Image.png"); 
image.EndInit(); 

注意applicationcomponent部分的URI的是常量字符串,而NameOfAssemly是圖像所在程序集的名稱。您可以構建一個幫助程序類,該類可以構建URI並加載圖像。

如果您不打算對圖像進行任何更改(提高性能並允許在非UI線程上創建圖像源),也可以致電image.Freeze()

在您的數據類中,顯示ImageSource屬性而不是Image。然後你使用Image控件來顯示它:

<Image Source="{Binding Icon}" /> 

或樣式裏面:

<Style TargetType="MenuItem"> 
    <Style.Resources> 
     <Image x:Key="Icon" 
       x:Shared="False" 
       Source="{Binding Icon}" 
       Width="16" 
       Height="16" /> 
    </Style.Resources> 
    <Setter Property="Icon" Value="{StaticResource Icon}" /> 
</Style> 
+0

所以我需要創建自己的資源管理器類 - 好吧,似乎是更好的方法。我會檢查這一點,並標記爲答案,當我得到它的工作,謝謝! – Sam

+0

作品,謝謝你的提示! – Sam

相關問題