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