溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶(hù)服務(wù)條款》

C#如何使用Resources資源文件

發(fā)布時(shí)間:2022-06-14 16:50:01 來(lái)源:億速云 閱讀:2619 作者:iii 欄目:開(kāi)發(fā)技術(shù)

這篇文章主要講解了“C#如何使用Resources資源文件”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“C#如何使用Resources資源文件”吧!

一、創(chuàng)建資源文件

可以將字符串、圖像或?qū)ο髷?shù)據(jù)等資源包含在資源文件中,方便應(yīng)用程序使用。

創(chuàng)建資源文件的方法:

1、手動(dòng)或使用IDE工具自動(dòng)生成XML 資源 (.resx) 文件。(推薦)

創(chuàng)建一個(gè)包含字符串、圖像或?qū)ο髷?shù)據(jù)的 XML 資源 (.resx) 文件。

使用 Visual Studio 創(chuàng)建一個(gè)資源文件并將其包含在項(xiàng)目中。

Visual Studio 提供一個(gè)資源編輯器,借助該編輯器,可添加、刪除和修改資源。 編譯時(shí),資源文件會(huì)自動(dòng)轉(zhuǎn)換成二進(jìn)制 .resources 文件,并嵌入應(yīng)用程序程序集或附屬程序集中。

注意:內(nèi)部使用資源文件生成器 (Resgen.exe) 將文本文件轉(zhuǎn)換成二進(jìn)制資源 (.resources) 文件。 然后使用語(yǔ)言編譯器將這個(gè)二進(jìn)制資源文件嵌入可執(zhí)行應(yīng)用程序或應(yīng)用程序庫(kù),或者使用程序集鏈接器 (Al.exe) 將這個(gè)二進(jìn)制資源文件嵌入附屬程序集。

2、以編程方式創(chuàng)建一個(gè) XML 資源 (.resx) 文件。 使用ResXResourceWriter類(lèi)

可以創(chuàng)建一個(gè) .resx 文件、枚舉其資源并按名稱(chēng)檢索特定資源。

ResXResourceWriter rw = new ResXResourceWriter("Demo.rex");
rw.AddResource("Logo", Image.FromFile("logo.jpg");
rw.AddResource("Title", "Proce c#");
rw.Generate();
rw.Close();

二、使用ResourceManager讀取項(xiàng)目中資源文件

資源文件調(diào)用方法 
(1).txt 文件:不可以直接調(diào)用,得先將其轉(zhuǎn)換成 .resources 文件才能使用。 
(2).resx 文件:可以用 ResXResourceReader 來(lái)做讀取,但是這種方法不直觀(guān),不推薦直接調(diào)用 .resx 文件。正確的方法是將其轉(zhuǎn)換成 .resources 文件,然后用 ResourceManager 作讀取工作。 
注意如果是在 VS.NET 中添加的 .resx 文件,那么它們自動(dòng)被設(shè)為 Embedded Resource,轉(zhuǎn)成 .resources 文件后被嵌入到 Assembly 中。 

(3).resources 文件分成兩種情況: 

  • 1、被嵌入或編譯成 Satellite Assembly:使用ResourceManager來(lái)獲得在 Assembly 中的資源。 

  • 2、單獨(dú)文件,沒(méi)被編譯或嵌入到Assembly:使用ResourceManager.CreateFileBasedResourceManager來(lái)獲得資源集(ResourceSet)。

在新建的Windows項(xiàng)目中,一般自動(dòng)生成兩個(gè)資源文件:Form1.resx和Resources.resx。其中,F(xiàn)orm1.resx附屬Form1窗體,Resources.resx在項(xiàng)目Properties子文件夾下。

下面我們看看讀取項(xiàng)目中資源文件

1、強(qiáng)類(lèi)型讀取項(xiàng)目中resx資源文件。

1、創(chuàng)建一個(gè)項(xiàng)目的默認(rèn)資源文件。

C#如何使用Resources資源文件

2、在項(xiàng)目“Properties”目錄下,可以看到Resources.resx。

C#如何使用Resources資源文件

3、添加相關(guān)的資源。

C#如何使用Resources資源文件

4、可以看到系統(tǒng)自動(dòng)生成的強(qiáng)類(lèi)型類(lèi)。

C#如何使用Resources資源文件

使用強(qiáng)類(lèi)型可直接使用類(lèi)

logo.Image = ZS.MouldManagement.Properties.Resources._0

不僅在Properties文件夾下可以建立資源文件,也可以在任何地方創(chuàng)建資源文件。在建立名稱(chēng)為MyResource資源文件的同時(shí),設(shè)計(jì)器會(huì)自動(dòng)生成兩個(gè)文件:MyResource.resx和MyResource.Designer.cs。其中后一個(gè)文件就包裝了設(shè)計(jì)器自動(dòng)生成的代碼,以方便對(duì)資源文件的強(qiáng)類(lèi)型訪(fǎng)問(wèn)。

C#如何使用Resources資源文件

強(qiáng)類(lèi)型訪(fǎng)問(wèn)代碼:

ZS.MouldManagement.Mould._333

2、使用代碼讀取項(xiàng)目中不同文化的resx資源文件

ResourceManager 可以根據(jù)不同的 UICulture 設(shè)置返回不同的本地資源,我們只需知道調(diào)用資源用到它就可以了。

Winform使用資源文件(ZS.MouldManagement.resx;ZS.MouldManagement.en-us.rex等等)

//多語(yǔ)言
Thread.CurrentThread.CurrentCulture = CultureInfo.CreateSpecificCulture("en-us");
Thread.CurrentThread.CurrentUICulture = new CultureInfo("en-us");

Assembly asm = Assembly.GetExecutingAssembly();
ResourceManager rm = new ResourceManager("ZS.MouldManagement.Properties.Resources", asm);
//ZS.MouldManagement是你程序的命名空間,ZS.MouldManagement.Properties 是資源類(lèi)Resources的命名空間, 資源文件名稱(chēng)不帶擴(kuò)展名
this.logo.Image = (Image)rm.GetObject("Logo");//Get**方法具有重載方法,第二個(gè)參數(shù)為CultureInfo對(duì)象
this.Title.Text = rm.GetString("Title");    //資源文件名稱(chēng)不帶擴(kuò)展名

三、Windows項(xiàng)目中的窗體資源文件

因?yàn)閷?duì)Form1.resx的訪(fǎng)問(wèn)需要構(gòu)造Syste.Resources.ResourceManager對(duì)象,而訪(fǎng)問(wèn)Resources.resx里的資源可以直接使用Properties.Resources.resName(resName是你添加的資源的名稱(chēng))。 
只有向窗體上添加圖標(biāo)、圖像等資源后

C#如何使用Resources資源文件

會(huì)在窗體設(shè)計(jì)器Form1.Designer.cs自動(dòng)生成下面的代碼

ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1));//創(chuàng)建ResourceManager對(duì)象
this.Icon = ((System.Drawing.Icon)(resources.GetObject("$this.Icon")));//根據(jù)資源的名稱(chēng)獲取字符串資源
  
this.Item1.Image = global::ZS.MouldManagement.Properties.Resources._0; //訪(fǎng)問(wèn)項(xiàng)目中的資源

從代碼可以看出,c#將窗體的圖標(biāo)文件作為資源進(jìn)行保存了起來(lái),然后利用ComponentResourceManager來(lái)獲取這些資源。

它和ResourceManager用法一樣,System.ComponentModel.ComponentResourceManager繼承自Syste.Resources.ResourceManager。

使用ComponentResourceManager類(lèi)進(jìn)行界面多語(yǔ)言切換

Thread.CurrentThread.CurrentUICulture = new CultureInfo("zh-CN");

ComponentResourceManager resources = new ComponentResourceManager(typeof(Form1));
resources.ApplyResources(this, "$this");
AppLang(form, resources);

#region AppLang for control
/// <summary>
/// 遍歷窗體所有控件,針對(duì)其設(shè)置當(dāng)前界面語(yǔ)言
/// </summary>
/// <param name="control"></param>
/// <param name="resources"></param>
private static void AppLang(Control control, System.ComponentModel.ComponentResourceManager resources)
{
    if (control is MenuStrip)
    {
        resources.ApplyResources(control, control.Name);
        MenuStrip ms = (MenuStrip)control;
        if (ms.Items.Count > 0)
        {
            foreach (ToolStripMenuItem c in ms.Items)
            {
                AppLang(c, resources);
            }
        }
    }

    foreach (Control c in control.Controls)
    {
        resources.ApplyResources(c, c.Name);
        AppLang(c, resources);
    }
}
#endregion

#region AppLang for menuitem
/// <summary>
/// 遍歷菜單
/// </summary>
/// <param name="item"></param>
/// <param name="resources"></param>
private static void AppLang(ToolStripMenuItem item, System.ComponentModel.ComponentResourceManager resources)
{
    if (item is ToolStripMenuItem)
    {
        resources.ApplyResources(item, item.Name);
        ToolStripMenuItem tsmi = (ToolStripMenuItem)item;
        if (tsmi.DropDownItems.Count > 0)
        {
            foreach (ToolStripMenuItem c in tsmi.DropDownItems)
            {
                AppLang(c, resources);
            }
        }
    }
}
#endregion

四、使用Assembly.GetManifestResourceStream()從此程序集加載指定的文件。

當(dāng)直接嵌入一資源時(shí),也就是說(shuō),不通過(guò)一個(gè)資源文件而直接將一資源(比如圖片)嵌入到 Assembly 中。這可以在 VS.NET 中通過(guò)設(shè)置一文件的 Build 屬性為“嵌入的資源” 實(shí)現(xiàn)。

在這種情況下 ResourceManager 就沒(méi)有用了,因?yàn)樗荒塬@取 .resources 資源文件。那么如何調(diào)用這類(lèi)的資源呢?我們只要了解一些 System.Reflection.Assembly 這個(gè)類(lèi)中的一些函數(shù)就可以了。

有三個(gè)相關(guān)函數(shù),不過(guò)我們只需要 Assembly.GetManifestResourceStream 這個(gè)函數(shù)。這個(gè)函數(shù)將一嵌入到 Assembly 中的資源以 stream 的方式返回,而我們可以將這個(gè) stream 轉(zhuǎn)成在 .NET 中可用的對(duì)象。

比如,如果嵌入資源是一圖片,那么我們可以利用 new Bitmap(Stream) 這個(gè)構(gòu)造方法獲得這個(gè)圖片資源的 Bitmap 對(duì)象。

1、將本地要加入的資源文本(視頻,圖片,文本或其它)加入項(xiàng)目。比如我們現(xiàn)在加入一個(gè)up.bmp的圖片到項(xiàng)目中,且放在文件夾Resources下面, 
2、將up.bmp右鍵選擇“屬性”的“生成操作”設(shè)置為"嵌入的資源"。

注意:訪(fǎng)問(wèn)資源的名稱(chēng)規(guī)則為:項(xiàng)目命名空間.資源文件所在文件夾名.資源文件名

Assembly assm = Assembly.getGetExecutingAssembly();
Stream stream = assm.GetManifestResourceStream("CreateDatabase.Resources.aa.txt");
//讀取流
//文本
System.IO.StreamReader sr = new System.IO.StreamReader(stream);
string str = sr.ReadToEnd();
//XML文件
XmlDocument xmlDoc = new XmlDocument();
xmlDoc.Load(stream);
//圖片
Image img = Image.FromStream(stream);

感謝各位的閱讀,以上就是“C#如何使用Resources資源文件”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)C#如何使用Resources資源文件這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是億速云,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI