語言屬性是僅屬於設計時間的屬性,它不屬於Form
類。這是一個使用擴展提供程序添加到表單設計時間的擴展屬性。它是CultureInfo
的類型,並使用顯示所有可用文化的TypeConverter
。
作爲一種變通方法,你可以有一個包含BaseForm
屬性像FormLanguage
和Language
財產get
,返回值和set
,設置Language
屬性的值。然後從這個BaseForm
繼承你的所有表格。這樣,只需更改FormLanguage
屬性即可。
還爲CultureInfo
創建一個自定義類型轉換器,它只顯示您想要的文化,然後更改語言,這足以更改FormLanguage
屬性。
這裏是我用作替代方法的代碼。不要忘記從這個BaseClass
繼承你的表格。
using System;
using System.ComponentModel;
using System.ComponentModel.Design;
using System.Globalization;
using System.Linq;
using System.Windows.Forms;
public partial class BaseForm : Form
{
[TypeConverter(typeof(MyCultureInfoConverter))]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)]
public CultureInfo FormLanguage
{
get
{
return TypeDescriptor.GetProperties(this)["Language"]
.GetValue(this) as CultureInfo;
}
set
{
TypeDescriptor.GetProperties(this)["Language"].SetValue(this, value);
}
}
}
public class MyCultureInfoConverter : CultureInfoConverter
{
public override StandardValuesCollection
GetStandardValues(ITypeDescriptorContext context)
{
var values = CultureInfo.GetCultures(CultureTypes.SpecificCultures |
CultureTypes.NeutralCultures)
.Where(x => x.Name == "fa-IR" || x.Name == "en-US").ToList();
values.Insert(0, CultureInfo.InvariantCulture);
return new StandardValuesCollection(values);
}
}
當您選擇從FormLanguage
fa-IR
那麼Language
自動成爲Persian
的,因爲這是我們在FormLanguage
二傳手寫的代碼。您可以在MyCultureInfoConverter
中添加您需要的任何其他語言。
當你從FormLanguage中選擇'fa-IR'時,由於我們在'FormLanguage'的setter中編寫的代碼,'Language'自動變成'Persian'。您可以在'MyCultureInfoConverter'中添加任何您需要的語言。如果您對答案有任何疑問,請告知我們。 –
非常感謝。這是一個很好的解決方法來限制選擇。它似乎工作得很好。從一種語言切換到另一種語言效果良好,並且創建了正確的resx文件。我現在遇到的問題(但這可能是另一個問題)是,當我在設計器視圖中保存更改時,Visual Studio將不再反應,我將不得不殺死它。但是這可能是一個設置問題。我會在接下來的幾天觀察它。 –
不客氣,我沒有面對這樣的問題。我會再檢查一次。但是你也可以在一個新的乾淨的項目中檢查行爲並讓我知道結果。 –