C# 资源文件(二)

    在新建的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文件,该文件中的代码都是由设计器自动生成的:
namespace RootNameSpace.Properties {
    ......
    internal class Resources {
        private static global::System.Resources.ResourceManager resourceMan;
        private static global::System.Globalization.CultureInfo resourceCulture;

        //返回此类使用的缓存 ResourceManager 实例。       
        internal static global::System.Resources.ResourceManager ResourceManager {
            get {
                if (object.ReferenceEquals(resourceMan, null)) {
                    global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("RootNameSpace.Properties.Resources",typeof(Resources).Assembly);
                    resourceMan = temp;
                }
                return resourceMan;
            }
        }
        //添加的资源将以属性的形式返回
        internal static System.Drawing.Bitmap resName {
            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。其中后一个文件就包装了设计器自动生成的代码,以方便对资源文件的访问。


你可能感兴趣的:(Winform)