来自常量的WPF图像源

时间:2011-02-26 13:50:49

标签: c# wpf image xaml constants

我的项目中有一些资源,我计划将这些图标用于菜单项和其他内容。

我创建了一个常量类来将这些图标的位置保存在一个中心位置,而不是将它们硬编码到每个菜单项等中。

E.g。

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

如果我将此值硬编码到xaml中图像的Source属性中,则可以正常工作。但是,如果我尝试引用此常量,则它会失败。

E.g。

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

它失败并出现此异常:“无法将属性'Source'中的值转换为'System.Windows.Media.ImageSource'类型的对象。”。

这个和我之间有什么区别只是硬编码的价值?有没有更好的方法在xaml中引用我的常量?

谢谢, 艾伦

2 个答案:

答案 0 :(得分: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}"/>

答案 1 :(得分:4)

如果你想将图像指定为资源字典中的资源,那么在Pavlo所提到的基础上稍作修改。如果在资源字典中直接指定图像路径,则对于Windows 8 XAML,它会给出错误

  

“错误1元素'BitmapImage'缺少内容属性定义'   接收内容'/Project ;component/Icons/IconName.png'

要解决此问题,您必须将路径指定为UriSource。

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