2011-02-26 43 views
2

我在項目中有一些圖標是資源,我打算將這些圖標用於菜單項和其他東西。來自常量的WPF圖像源

我創建了一個常量類來保存​​這些圖標在中央位置的位置,而不是硬編碼他們到每個菜單項等

例如

public const string IconName = "/Project;component/Icons/IconName.png"; 

如果我將這個值硬編碼到xaml中的圖像的Source屬性,它工作正常。但是,如果我試圖引用這個常量,那麼它就會失敗。

E.g.

<Image Source="{x:Static pb:IconConstants.IconName}" Width="16" Height="16" /> 

它失敗與此異常:「無法轉換的屬性‘來源’類型爲‘System.Windows.Media.ImageSource’的對象的值。」

這和我只是硬編碼的價值有什麼區別?有沒有更好的方式在xaml中引用我的常量?

感謝, 艾倫

回答

6

不同的是,在第一種情況下(當你硬編碼路徑)的XAML解析器將調用值轉換器(ImageSourceConverter)的字符串您在Source屬性將其轉換爲指定類型值爲ImageSource。而在第二種情況下,它預計您的常數值已經是ImageSource

你可以做的是,你可以把所有的路徑在全球ResourceDictionary

<Window.Resources> 
    <ResourceDictionary> 
     <BitmapImage x:Key="IconName">/Project;component/Icons/IconName.png</BitmapImage> 
    </ResourceDictionary> 
</Window.Resources> 

<Image Source="{StaticResource IconName}" Width="16" Height="16" /> 

如果你想的路徑常量存儲在代碼中,你可以有Uri對象作爲響應並將UriSource屬性BitmapImage設置爲此URI:

public static readonly Uri IconName = new Uri("/Project;component/Icons/IconName.png", UriKind.Relative); 

<BitmapImage x:Key="IconName" UriSource="{x:Static pb:IconConstants.IconName}"/> 
+0

謝謝您的回答帕夫洛。我一直在試圖得到這個工作,但我仍然得到一個錯誤「無法轉換字符串」/ Pro ject; component/Icons/IconName.png'到'System.Windows.Media.Imaging.BitmapImage'對象中。「理想情況下,將我的常量存儲爲字符串會很好,因爲我在別處使用它們來綁定變量等等。我想我可能不得不同時硬編碼它們,不情願。 – 2011-02-27 10:32:53

+0

@Alan Spark - 查看我的更新。 – 2011-02-27 13:09:38

+0

謝謝帕夫洛。這將完成這項工作!我非常感謝你的幫助。 – 2011-02-27 19:53:30

4

如果要指定圖像作爲資源字典中的資源,對什麼帕夫洛提到的頂部上有輕微的修改。如果您在資源字典指定圖像路徑直接聯機,爲Windows 8 XAML提示錯誤

「錯誤1點遺漏的內容屬性定義爲元素‘的BitmapImage’ 接收內容「/項目;組件/圖標/ IconName巴紐」

要解決它,你必須指定路徑UriSource。

<ResourceDictionary> 
    <BitmapImage x:Key="ImageFollowOnFacebook" 
       UriSource="Assets/FollowOnFacebookImage.png"/> 
</ResourceDictionary>