Winform窗體改變語言類型的方式

  Winform改變語言類型比較複雜,須要根據不一樣語言應用語言資源。而軟件在進行語言切換時,須要將當前的UI文化線程引用對應的語言類型。經常使用的有三種方式,此處使用兩種,對比發現其中的優缺點:this

/// <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); } } } } }
相關文章
相關標籤/搜索