语言属性是仅属于设计时间的属性,它不属于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将不再反应,我将不得不杀死它。但是这可能是一个设置问题。我会在接下来的几天观察它。 –
不客气,我没有面对这样的问题。我会再检查一次。但是你也可以在一个新的干净的项目中检查行为并让我知道结果。 –