Winform改变语言类型比较复杂,需要根据不同语言应用语言资源。而软件在进行语言切换时,需要将当前的UI文化线程引用对应的语言类型。常用的有三种方式,此处使用两种,对比发现其中的优缺点:

/// <summary>
/// 获取UI的文化信息
/// 创建者:杨钊
/// 创建时间:2019.05.20
/// </summary>
/// <param name="language">语言</param>
/// <returns>语言环境的缩写。如:英文的en-US;中文的:zh-CN</returns>
public static string GetUICulture(LanguageType language)
{
string lang = "en-US";
if (language == LanguageType.Chinese)
{
lang = "zh-CN";
}
else if (language == LanguageType.English)
{
lang = "en-US";
}
return lang;
}
/// <summary>
/// 设置语言
/// </summary>
/// <param name="control">需要切换语言的对象</param>
/// <param name="language">语言</param>
/// <returns>语言环境的缩写。如:英文的en-US;中文的:zh-CN</returns>
public static string SetLanguage( this Control control, LanguageType language)
{
string lang = GetUICulture(language);
//采用这种方式,会出现如果通过自己写代码添加的控件事件(即事件的添加不在InitializeComponent方法中),则需要重写添加一次。
//所有选中等设置需要重写设置一次。不适用于创建好、只等调用的窗体
//应用语言资源
//Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
////清理控件已应用的语言资源
//form.Controls.Clear();
////重新初始化界面
//Type type = form.GetType();
////MethodInfo[] methodInfos = type.GetMethods( BindingFlags.NonPublic);
//MethodInfo method = type.GetMethod("InitializeComponent", BindingFlags.NonPublic | BindingFlags.Instance);
//if (method != null)
//{
// method.Invoke(form, null);
//} //以下方法会有问题,在具有dataGridView控件的窗体中,如果先实例化后,再应用它,不会被应用新资源。而后发现,DataGridView控件的表头,并不是继承自Control
// 并且,如果有同名控件,应用会出错。比如:组合控件内有一个子控件是lblTitle,但窗体也有一个控件是lblTitle,应用资源就会出错
if (FormManager.language != language)
{
Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
FormManager.language = language;
}
if (control != null)
{
var frmtype = control.GetType();
ComponentResourceManager resources = new ComponentResourceManager(frmtype);
resources.ApplyResources(control, "$this");
AppLang(control, resources);
}
return lang;
} /// <summary>
/// 修改:张正选
/// 时间:2017.12.26
/// 原因:单位显示偏小,英文下“Cancel”显示会换行
/// </summary>
/// <param name="control"></param>
/// <param name="resources"></param>
private static void AppLang(Control control, ComponentResourceManager resources)
{
if (control is Control)
{
foreach (Control c in control.Controls)
{
resources.ApplyResources(c, c.Name);
AppLang(c, resources);
//DataGridView控件的表头,并不是继承自Control
if (c is DataGridView)
{
DataGridView dgv = c as DataGridView;
foreach(var item in dgv.Columns)
{
resources.ApplyResources(item, (item as DataGridViewColumn).Name);
}
}
}
}
}

Winform窗体改变语言类型的方式的更多相关文章

  1. winform窗体(五)——布局方式

    一.默认布局 ★可以加panel,也可以不加: ★通过鼠标拖动控件的方式,根据自己的想法布局.拖动控件的过程中,会有对齐的线,方便操作: ★也可选中要布局的控件,在工具栏中有对齐工具可供选择,也有调整 ...

  2. C# Winform 窗体传值 利用委托 子窗体传值给父窗体

    常用的Winform窗体传值有两种方式. 1.更改Form.designer.cs文件,将控件的设为Public,供子窗体访问. 在designer.cs文件的最后,找到你的控件声明. private ...

  3. winform窗体this方式和handle(句柄)方式的区别

    我们来比较winform窗体的this方式和win32api handle方式实现窗体的最大化.默认窗体.半透明.不透明的区别 1.窗体界面设计 this方式按钮: btnMaxWindow. btn ...

  4. C# WinForm 拖动无边框窗体 改变无边框窗体尺寸

    经常遇到这种情况.窗体的边框去掉了.然后种种问题就出来了:不能拖动.不能改变窗体大小.不能......当然.肯定有解决方案滴*^_^*今天的目标就是:可以直接拖动没有边框的窗体.可以直接拉拽窗体改变其 ...

  5. 单例模式(Winform窗体的实现)

    在我的设计模式分类当中,我选择单例模式作为我第一个要写的设计模式,其一,单例模式简单.容易理解让人接受,其二,单例模式很常用,在实际的Winform窗体应用开发中能够带来更好的客户体验. 单例模式的核 ...

  6. 【开源】做了一个WinForm窗体的投影组件,能够为窗口添加影子效果

    最近手头上的项目终于忙得差不多了,想起好久没有更新了的NanUI,再看着每天QQ群未读消息闪烁的标志,突然才发现似乎愧对了群里各位喜爱NanUI的朋友们.于是乎,就想趁这几天有时间,好好的修复一下Na ...

  7. C# winform窗体间传值(使用委托或事件)

    窗体间传值 今天得空,刚好看到网上好多人再找winform窗体间传值的问题,由于昨天项目的优化的感觉不错,就写了个C# winform窗体间传值的demo,希望能给需要的人的带来帮助: 工程的源代码地 ...

  8. C#使用事件方式Winform窗体之间传值

    [摘自:http://www.cnblogs.com/codeToUp/p/5371062.html] 工程的源代码地址:https://github.com/yes-or-no/WinFormTra ...

  9. 【转载】Visual Studio2017如何打包发布Winform窗体程序

    在用C#语言编写好Winform窗体程序后,最后一步的操作是将设计好的Winform程序代码进行打包以及发布成安装包.在Visual Studio2017开发工具中,打包发布WinForm程序是比较简 ...

随机推荐

  1. 检测Python程序的执行效率

    无意中被问到代码执行效率的问题,那就总结一下检测代码执行效率的几种方式: 一.装饰器 在函数上加装饰器,来得到函数的执行时间. def cst_time(func, *args, **kwargs): ...

  2. Guide to installing 3rd party JARs

    Although rarely, but sometimes you will have 3rd party JARs that you need to put in your local repos ...

  3. java 序列化时排除指定属性

    java 序列化对象如何排除指定属性呢? java 中序列化对象有多种方式:struts2 ,jackson,json-lib (1)使用struts2 json插件 依赖的jar包:struts2- ...

  4. 【319】Python 通过 Twilio 发短信

    参考:python利用twilio模块给自己发短信 参考:使用python实现往手机发短信(基于twilio) 步骤如下: 登录 Twilio 网站注册,貌似需要***,包括用户名.密码.手机号.项目 ...

  5. jQuery的基础dom和css操作

    1.元素以及内容操作 $(function () { // alert($("a").html()); // 获取元素中间的html内容,包括标签和文本内容 // alert($( ...

  6. 单词的添加与查找 · Add and Search Word

    [抄题]: 设计一个包含下面两个操作的数据结构:addWord(word), search(word) addWord(word)会在数据结构中添加一个单词.而search(word)则支持普通的单词 ...

  7. Rabbitmq的几种交换机模式

    Rabbitmq的核心概念(如下图所示):有虚拟主机.交换机.队列.绑定: 交换机可以理解成具有路由表的路由程序,仅此而已.每个消息都有一个称为路由键(routing key)的属性,就是一个简单的字 ...

  8. httpwebrequest详解

    HttpWebRequest和HttpWebResponse类是用于发送和接收HTTP数据的最好选择.它们支持一系列有用的属性.这两个类位 于System.Net命名空间,默认情况下这个类对于控制台程 ...

  9. Differential expression analysis for paired RNA-seq data 成对RNA-seq数据的差异表达分析

    Differential expression analysis for paired RNA-seq data 抽象背景:RNA-Seq技术通过产生序列读数并在不同生物条件下计数其频率来测量转录本丰 ...

  10. Java程序设计19——类的加载和反射-Part-A

    1 本文概要 本章介绍Java类的加载.连接和初始化的深入知识,并重点介绍Java反射相关的内容.本章知识偏底层点,这些运行原理有助于我们更好的把我java程序的运行.而且Java类加载器除了根加载器 ...