在运行时切换 WinForm 程序的界面语言 System.ComponentModel.ComponentResourceManager .ApplyResources
2015-06-17 14:18
225 查看
Download the code for this article: WinForm-Multilanguages-2.rar (11 KB).
在 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 按钮,窗体的界面显示语言就会在英语和简体中文之间互相切换。
方法二:
下面介绍一种只需对现有代码做较小改动的方法。在 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 按钮,窗体的界面显示语言就会在英语和简体中文之间互相切换。
相关文章推荐
- swift 深入理解Swift的闭包
- WebViewJavascriptBridge使用说明(IOS)
- iOS原生二维码扫描
- Android framework系统默认设置修改
- Android textView文字添加图片 imageSpan使用
- Android中GridView中onTouch监听(1)item实现触摸执行缩放动画的功能
- 【某deed和某app面试】
- Ios开发必看,苹果粉绝不能错过
- Android L——Material Design详解(视图和阴影)
- Android: 创建一个AlertDialog对话框,必须按确定或取消按钮才能关闭对话框,禁止按[返回键]或[搜索键]关闭
- Android: 清除View跳转的历史记录
- Hisi3716C Android解决方案问题记录
- LeetCode之“数学”:Happy Number
- iOS 使用ZBarSDK扫描条形码和二维码
- [iOS学习]NSPredicate
- Android: 待机时如何让程序继续运行 extends Service
- Android: View换切后,无法正常设置焦点或切换后TextView的虚拟键盘不弹出
- cocos2d-x安装
- [Unity3D]Stencil buffer失效了怎么办
- 修改android usb的VID PID