言語プロパティは、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
があるため、我々はFormLanguage
のセッターで書いたコードを自動的にPersian
になります。あなたはMyCultureInfoConverter
に必要な他の言語を追加することができます。
'FormLanguage'から' fa-IR'を選択すると、 'FormLanguage'のsetterで書いたコードのため、' Language'は自動的に 'Persian'になります。 'MyCultureInfoConverter'に必要な言語を追加することができます。あなたが答えについて何か質問があれば教えてください。 –
ありがとうございました。これは、選択を制限するための素晴らしい回避策です。そしてそれはかなりうまくいくようです。ある言語から別の言語に切り替えると、適切なresxファイルが作成されます。私は今問題がありますが(これは別の問題かもしれません)、私がデザイナービューで変更を保存すると、Visual Studioはもう反応しなくなり、私はそれを終了しなければならないということです。しかし、これは設定の問題かもしれません。私は次の日にそれを観察します。 –
あなたは歓迎です、私はそのような問題に直面しませんでした。私はもう一度それをチェックします。しかし、あなたはまた、新しいクリーンなプロジェクトの動作をチェックし、結果を教えてください。 –