如何获取存储在资源中的图像的Uri

13

我有两个 .png 文件添加到我的资源中,需要在进行绑定时访问它们的Uri。

我的 xaml 代码如下:

<Grid>
  <Image>
    <Image.Source>
       <BitmapImage DecodePixelWidth="10" UriSource="{Binding Path=ImagePath}"/>
    </Image.Source>
  </Image> 
</Grid>

使用 ImagePath 进行绑定的代码如下:

ImagePath = resultInBinary.StartsWith("1") ? Properties.Resources.LedGreen : Properties.Resources.ledRed;

然而

Properties.Resources.LedGreen

返回一个Bitmap,而不是包含特定图像的Uri的String。我只想知道如何提取该值,而无需引用存储在目录中的图片路径(实际上,我不确定这样做是否正确,因为我在网上找不到类似的情况)。

如果有更好的方法可用,请告诉我。

2个回答

38

在WPF应用程序中,通常不会将图像存储在Properties/Resources.resx中,并通过Properties.Resources类访问它们。

相反,您只需将图像文件作为常规文件添加到Visual Studio项目中,例如在名为“Images”等文件夹中。然后,您将其Build Action设置为Resource,可以在属性窗口中完成此操作。您可以通过右键单击图像文件并选择属性菜单项进入此窗口。请注意,默认情况下,图像文件的Build Action值应始终为Resource

要从代码中访问这些图像资源,则需要使用Pack URI。使用上述文件夹名称“Images”和名为“LedGreen.png”的图像文件创建此类URI如下:

var uri = new Uri("pack://application:,,,/Images/LedGreen.png");

因此,您可以将您的属性声明为 Uri 类型:

public Uri ImageUri { get; set; } // omitted INotifyPropertyChanged implementation

并将其设置为以下内容:

ImageUri = resultInBinary.StartsWith("1")
         ? new Uri("pack://application:,,,/Images/LedGreen.png")
         : new Uri("pack://application:,,,/Images/LedRed.png");
最终你的XAML应该像下面展示的那样,依赖于从Uri到ImageSource的内置类型转换:
<Grid>
    <Image Width="10" Source="{Binding Path=ImageUri}" />
</Grid>

感谢您提供详细的答案,更重要的是提供了正确的解决方案建议。我已经按照您的建议实现了我的解决方案,但我想知道是否需要将这些图像与我要交给其他团队的可执行文件一起携带和保留?由于这是一个相当简单的项目,我没有计划为其制作安装程序。 - Mehrad
2
不,Resource 构建操作将图像文件添加到程序集中。因此它们包含在可执行文件中。 - Clemens

1
Properties.Resources.LedGreen属性声明为ImageSource,并将其设置为Uri位置,而不是Bitmap对象。
或者,如果您坚持将其存储为位图,则可以通过返回Properties.Resources.LedGreen.ImageSource来获取源,该源将是ImageSource类型。
我更喜欢第一种方法。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接