在新建的Windows项目中,一般自动生成两个资源文件:Form1.resx和Resources.resx。其中,Form1.resx在项目的根文件夹下,Resources.resx在Properties子文件夹下。这两个资源文件的使用方法是不一样的,因为对Form1.resx的访问需要构造Syste.Resources.ResourceManager对象,而访问Resources.resx里的资源可以直接使用Properties.Resources.resName(resName是你添加的资源的名称)。
访问Form1.resx
ResourceManager rm = new ResourceManager(typeof(Form1));//创建ResourceManager对象
string stringResource =rm.GetString("resName"); //根据资源的名称获取字符串资源
Image imageResource = (Image)rm.GetObject("resName");//根据资源名称获取资源,并转型
在Form1.Designer.cs窗体设计器生成的代码中,可以看到这样的代码:
//只有向窗体上添加图标、图像等资源后,才会自动生成下面的代码。
ComponentResourceManager resources= new ComponentResourceManager(typeof(Form1));
this.Icon =((System.Drawing.Icon)(resources.GetObject("$this.Icon")));
从代码可以看出,c#将窗体的图标文件作为资源进行保存了起来,然后利用ComponentResourceManager来获取这些资源。它和ResourceManager用法一样,System.ComponentModel.ComponentResourceManager继承自Syste.Resources.ResourceManager。
访问Resources.resx
Resources.resx文件位于Properties子文件夹下,在此文件夹中还存在一个Resources.Designer.cs文件,该文件中的代码都是由设计器自动生成的:
namespaceRootNameSpace.Properties {
......
internal class Resources {
private staticglobal::System.Resources.ResourceManager resourceMan;
private staticglobal::System.Globalization.CultureInfo resourceCulture;
//返回此类使用的缓存 ResourceManager实例。
internal staticglobal::System.Resources.ResourceManager ResourceManager{
get {
if (object.ReferenceEquals(resourceMan,null)) {
global::System.Resources.ResourceManagertemp = newglobal::System.Resources.ResourceManager("RootNameSpace.Properties.Resources",typeof(Resources).Assembly);
resourceMan = temp;
}
returnresourceMan;
}
}
//添加的资源将以属性的形式返回
internal staticSystem.Drawing.BitmapresName {
get {
object obj =ResourceManager.GetObject("resName", resourceCulture);
return((System.Drawing.Bitmap)(obj));
}
}
......
}
}
可以看出,设计器自动为我们包装好了这些资源,在默认的RootNameSpace命名空间(也即你的项目所在的命名空间)下生成RootNameSpace.Properties子空间,并自动产生Resources类。所以,我们可以方便的以属性的形式来获取这些资源,Propperties.Resources.resName;也可以属性的形式获得ResourceManager来获取资源,Properties.Resources.ResourceManager.GetObject("resName")。
不仅在Properties文件夹下可以建立资源文件,也可以在任何地方创建资源文件。在建立名称为MyResource资源文件的同时,设计器会自动生成两个文件:MyResource.resx和MyResource.Designer.cs。其中后一个文件就包装了设计器自动生成的代码,以方便对资源文件的访问。