Winform窗體如何改變語言類型
Winform改變語言類型比較復(fù)雜,需要根據(jù)不同語言應(yīng)用語言資源。而軟件在進(jìn)行語言切換時(shí),需要將當(dāng)前的UI文化線程引用對(duì)應(yīng)的語言類型。常用的有三種方式,此處使用兩種,對(duì)比發(fā)現(xiàn)其中的優(yōu)缺點(diǎn):
/// <summary>
/// 獲取UI的文化信息
/// 創(chuàng)建者:楊釗
/// 創(chuàng)建時(shí)間:2019.05.20
/// </summary>
/// <param name="language">語言</param>
/// <returns>語言環(huán)境的縮寫。如:英文的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>
/// 設(shè)置語言
/// </summary>
/// <param name="control">需要切換語言的對(duì)象</param>
/// <param name="language">語言</param>
/// <returns>語言環(huán)境的縮寫。如:英文的en-US;中文的:zh-CN</returns>
public static string SetLanguage( this Control control, LanguageType language)
{
string lang = GetUICulture(language);
//采用這種方式,會(huì)出現(xiàn)如果通過自己寫代碼添加的控件事件(即事件的添加不在InitializeComponent方法中),則需要重寫添加一次。
//所有選中等設(shè)置需要重寫設(shè)置一次。不適用于創(chuàng)建好、只等調(diào)用的窗體
//應(yīng)用語言資源
//Thread.CurrentThread.CurrentUICulture = new System.Globalization.CultureInfo(lang);
////清理控件已應(yīng)用的語言資源
//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);
//}
//以下方法會(huì)有問題,在具有dataGridView控件的窗體中,如果先實(shí)例化后,再應(yīng)用它,不會(huì)被應(yīng)用新資源。而后發(fā)現(xiàn),DataGridView控件的表頭,并不是繼承自Control
// 并且,如果有同名控件,應(yīng)用會(huì)出錯(cuò)。比如:組合控件內(nèi)有一個(gè)子控件是lblTitle,但窗體也有一個(gè)控件是lblTitle,應(yīng)用資源就會(huì)出錯(cuò)
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>
/// 修改:張正選
/// 時(shí)間:2017.12.26
/// 原因:?jiǎn)挝伙@示偏小,英文下“Cancel”顯示會(huì)換行
/// </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窗體如何改變語言類型的詳細(xì)內(nèi)容,更多關(guān)于Winform窗體改變語言類型的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
- 在WinForm應(yīng)用程序中快速實(shí)現(xiàn)多語言的處理的方法
- 分享兩種實(shí)現(xiàn)Winform程序的多語言支持的多種解決方案
- VisualStudio2019中為.NET Core WinForm App啟用窗體設(shè)計(jì)器
- visual studio 2019使用net core3.0創(chuàng)建winform無法使用窗體設(shè)計(jì)器
- WINFORM 窗體間的傳值實(shí)現(xiàn)解析
- c# WinForm 窗體之間傳值的幾種方式(小結(jié))
- C# Winform選項(xiàng)卡集成窗體詳解
- C# WinForm實(shí)現(xiàn)窗體上控件自由拖動(dòng)功能示例
- C# WinForm制作異形窗體與控件的方法
- winform c#中子窗體關(guān)閉刷新父窗體的實(shí)例
相關(guān)文章
基于WebRequest.RegisterPrefix的使用詳解
本篇文章對(duì)WebRequest.RegisterPrefix的使用進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
.NET單點(diǎn)登陸的實(shí)現(xiàn)方法及思路
這篇文章介紹了.NET單點(diǎn)登陸的實(shí)現(xiàn)方法及思路,有需要的朋友可以參考一下,希望對(duì)你有所幫助2013-07-07
C#數(shù)值轉(zhuǎn)換-隱式數(shù)值轉(zhuǎn)換表參考
隱式轉(zhuǎn)換就是直接使用,比如可以把一個(gè) byte 類型直接用在 int 上2013-04-04
在WPF中動(dòng)態(tài)加載XAML中的控件實(shí)例代碼
這篇文章主要介紹了在WPF中動(dòng)態(tài)加載XAML中的控件,實(shí)例分析了WPF中針對(duì)XAML中控件的動(dòng)態(tài)調(diào)用技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2016-07-07
C#中派生類調(diào)用基類構(gòu)造函數(shù)用法分析
這篇文章主要介紹了C#中派生類調(diào)用基類構(gòu)造函數(shù)用法,實(shí)例分析了派生類調(diào)用基類構(gòu)造函數(shù)的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-04-04
c#使用htmlagilitypack解析html格式字符串
這篇文章主要介紹了c#使用htmlagilitypack解析html格式字符串的示例,需要的朋友可以參考下2014-03-03

