默认情况下,当您将图像(图标,位图等)作为资源添加到项目时,图像的构建操作将设置为无。这样做是因为图像神奇地存储在.resources文件中。
我 希望将资源存储为嵌入式资源(我的理由无关紧要,但我们只是假装它,以便我可以在 {中看到它们{3}} )。
所以我将每个图像的构建操作更改为嵌入式资源,然后资源出现在Lutz的Reflector中 - 完全按照我的意愿。
很遗憾,RedGate's Reflector:
注意资源编辑器 添加图片,它将构建操作设置为 无,因为.resx文件 引用图像文件。在构建 时间,图像被拉进了 .resources文件创建出来的 .resx文件。然后可以轻松地拍摄图像 通过强类型访问 为.resx自动生成的类 文件。
因此,你不应该改变 此设置为嵌入式资源, 因为这样做会包括 在装配中两次成像。
那么将图像作为嵌入资源包含的正确方法是什么?
答案 0 :(得分:43)
注意:此答案不是处理图像资源的推荐方法。它只是解决问题所描述的特定问题(即将图像包含为嵌入式资源)。
不要将图像添加为资源。我宁愿做以下事情:
然后,您可以使用
访问此资源Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceUri)
这样,图像不会神奇地添加到项目资源文件中,并且只有一个图像副本存储在程序集的资源中。
答案 1 :(得分:11)
在项目视图中,打开Properties子树;双击Resources.resx项。
(如果没有,请右键单击“属性”项并选择“打开”,然后单击左侧的“资源”选项卡,单击页面中间的链接以创建默认资源文件。)
点击resources.resx页面顶部的第一个下拉列表。它可能会说像“Strings”这样无用的东西,并选择Images。或者,您可以按 Ctrl + 2 。这将更改为“图像资源”视图。现在单击“添加资源”下拉列表,然后选择“现有文件”。选择图像文件,然后单击“打开”。如果您愿意,可以重命名该资源。
单击“保存”图标。
您现在可以编程方式访问嵌入式资源:
[namespace].Properties.Resources.[yourResourceName]
答案 2 :(得分:6)
在VS 2005中:
要在代码中引用图像,请使用以下内容:
btnStop.Image = myImages.Stop;
答案 3 :(得分:5)
这取决于您想要如何使用图像。
如果您想本地化和访问特定文化的特定图像,那么使用ResourceManager
是一个很好的方法,因为它为附属程序集,搜索,后备等提供了一些很好的功能。
如果您只想在程序集中嵌入资源并且不担心本地化(使用Assembly.GetManifestResourceStream
),那么只需添加图像并将构建操作设置为Embedded Resource
即可。
文档警告您不要将构建操作设置为Embedded Resource
,因为资源已由资源编译器通过.resx文件编译到程序集中。