zoukankan      html  css  js  c++  java
  • Winform窗体改变语言类型的方式

      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);
                    }
                }
            }
        }
    }
  • 相关阅读:
    解决VB6.0中不能加载MSCOMCTL.OCX的错误提示
    修改SQL Server数据库表的创建时间简单直接有效的方法
    如何将SQL Server 2000备份的数据库文件还原(升级)为SQL Server 2005或更高版本的数据库?
    如何创建和还原SQL Server 2005数据库?
    SQL Server 2005详细安装过程及配置
    如何创建和还原SQL Server 2000数据库?
    Python接受流式输入
    图的遍历(Python实现)
    Python实现多属性排序
    python构造二维列表以及排序字典
  • 原文地址:https://www.cnblogs.com/pilgrim/p/10288109.html
Copyright © 2011-2022 走看看