WPF图像资源和Visual Studio 2010资源编辑器

4

我提出这个问题的动机只是想通过ImageSource的依赖属性来指定一个用户控件中要使用的图像。我在管理、访问和单元测试方面遇到了一些困难。

  • 资源编辑器是维护应用程序图像的好工具吗?
  • 将编辑器中的Bitmap翻译成ImageSource的最佳方法是什么?
  • 如何从编辑器中获取资源文件名?

使用资源编辑器维护图像是什么意思? - Danny Varod
我的意思是将图像添加到资源设计器中,然后在需要时在那里找到它们。或者,如果这是一个不好的想法,那么对于可能在多个程序集中具有图像的非平凡应用程序来说,什么是更好的想法。干杯 - Berryl
1个回答

10

不,资源编辑器不是处理这个问题的好工具。

在WPF应用程序中,最好的方法是将所有图片放置在一个名为“Images”的目录下,并将每个图像标记为“Resource”。然后你可以直接在Image控件和其他地方引用它们。

以下是具体步骤:

  • 使用你喜欢的位图编辑程序(Paint.NET,Photoshop等)裁剪和调整你的图像
  • 将它们保存为.png文件(或者如果你愿意,也可以保存为.jpg或.gif文件)
  • 在Visual Studio解决方案中创建一个“Images”文件夹(或多个文件夹,根据你的组织方式)
  • 将图像从硬盘拖入“Images”文件夹中(或右键单击项目,选择“添加”->“现有项”,然后选择图像)

现在你可以在XAML中轻松地引用你的图像:

<Image Source="Images/MyImage.png" />

或者在代码中:

var source = (BitmapSource)Application.LoadComponent(
               new Uri("Images/MyImage.png", UriKind.Relative));

你还可以引用外部程序集中的图像:

<Image Source="ReferencedAssembly;v1.0.0.1;component/Images/MyImage.png" />

在代码中可以表示为:

var source = (BitmapSource)Application.LoadComponent(
               new Uri("ReferencedAssembly;v1.0.0.1;component/Images/MyImage.png",
                 UriKind.Relative));

太好了!两个问题 - (1) 将构建操作设置为'Content'而不是'Resource'是否有任何实际优势?(2) 获取引用程序集中的代码,只需写成“Application.LoadComponent("ReferencedAssembly;v1.0.0.1; component/Images/MyImage.png") as BitmapSource;” 吗?您知道如何获取该语法的帮助程序代码吗(抱歉,三个问题)?谢谢! - Berryl
看起来 Application.LoadComponent 接受 Uri(而不是字符串)。 - Berryl
谢谢。不知怎么的,我总是忘记使用“new Uri(..., UriKind.Relative)”直到编译器指出我的错误。我已经更正了答案。 - Ray Burns
"Resource" 将文件添加到您的 .exe 或 .dll 中。 "Content" 则将文件作为单独的文件存储在输出目录中。通常情况下,部署单个 .exe 文件更容易,但如果您有大型图像文件或数百个文件,则最好使用 Content。 - Ray Burns
很好的答案!非常清晰易懂。棒极了。我刚刚用这个问题写了源代码。我注意到一件事:如果你的资源位于不同的程序集中(另一个类库DLL),你可能想使用这个URI格式:"pack://application:,,,/YourAssemblyName;component/Images/MyImage.png" 我仍然困惑何时使用Images文件夹+Build Action = 资源与资源编辑器。此外,由于资源是二进制数据,Build Action = Resource和Build Action = Embedded Resource在这里是否相同? - kevinarpe

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