方法二:
下面介紹一種只需對現有代碼做較小改動的方法。
在 Visual Studio 的設計視圖中,如果在 Properties 窗口中改變了程序的默認界面語言(Language),我們會注意到無論是工程還是窗體對應的 .Designer.cs 文件都會有顯著的改變。比如,我們創建一個叫 MyForm 的 form,並且添加一個叫 MyButton 的按鈕。
在改變窗體 Properties 中的 Language 屬性之前, .Designer.cs 代碼文件中的 InitializeComponent 方法的內容大致如下:
- private void InitializeComponent()
- {
- this.myButton = new System.Windows.Forms.Button();
- this.SuspendLayout();
- //
- // myButton
- //
- this.myButton.Location = new System.Drawing.Point(100, 200);
- this.myButton.Name = "myButton";
- this.myButton.Size = new System.Drawing.Size(75, 23);
- this.myButton.TabIndex = 0;
- this.myButton.Text = "My Button";
- this.myButton.UseVisualStyleBackColor = true;
- //
- // myForm
- //
- this.ClientSize = new System.Drawing.Size(292, 273);
- this.Controls.Add(this.myButton);
- this.Name = "MyForm";
- this.Text = "My Form";
- this.ResumeLayout(false);
- }
而在改變了窗體 Properties 中的 Language 屬性之后,工程中除了默認的 .resx 文件之外,還會自動添加一個 .zh-CHS.resx 文件(假設我們將 Language 改變為 Chinese (Simplified))。另外,.Designer.cs 文件中的 InitializeComponent 方法也會改變成:
- private void InitializeComponent()
- {
- System.ComponentModel.ComponentResourceManager resources
- = new System.ComponentModel.ComponentResourceManager(typeof(MyForm));
- this.myButton = new System.Windows.Forms.Button();
- this.SuspendLayout();
- //
- // myButton
- //
- this.myButton.AccessibleDescription = null;
- this.myButton.AccessibleName = null;
- resources.ApplyResources(this.myButton, "myButton");
- this.myButton.BackgroundImage = null;
- this.myButton.Font = null;
- this.myButton.Name = "myButton";
- this.myButton.UseVisualStyleBackColor = true;
- //
- // myForm
- //
- this.AccessibleDescription = null;
- this.AccessibleName = null;
- resources.ApplyResources(this, "$this");
- this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
- this.BackgroundImage = null;
- this.Controls.Add(this.myButton);
- this.Font = null;
- this.Icon = null;
- this.Name = "myForm";
- this.ResumeLayout(false);
- }
我們注意到改變 Language 屬性之后,代碼的主要變化有:
- ComponentResourceManager resources = new ComponentResourceManager(typeof(MyForm));
- resources.ApplyResources(this.myButton, "myButton"); resources.ApplyResources(this, "$this");
另外,設置控件屬性(比如顯示文字 Text,控件大小 Size,顯示位置 Location 等)的代碼都沒有了。也就是說設置控件屬性的代碼都是由 resources.ApplyResource 方法來完成的。那么在我們想改變 WinForm 程序的界面顯示語言的時候,能不能直接調用 ApplyResources 方法呢?答案是肯定的。
為 myButton 添加 Click 事件的事件處理函數:
- private void myButton_Click(object sender, EventArgs e)
- {
- int currentLcid = Thread.CurrentThread.CurrentUICulture.LCID;
- currentLcid = (currentLcid == 2052) ? 1033 : 2052;
- // Changes the CurrentUICulture property before changing the resources that are loaded for the win-form.
- Thread.CurrentThread.CurrentUICulture = new CultureInfo(currentLcid);
- // Reapplies resources.
- ComponentResourceManager resources = new ComponentResourceManager(typeof(MyForm));
- resources.ApplyResources(myButton, "myButton");
- resources.ApplyResources(this, "$this");
- }
當程序運行的時候,點擊窗體上的 myButton 按鈕,窗體的界面顯示語言就會在英語和簡體中文之間互相切換。