我正在使用 Visual Studio 2013 (C#) 进行开发,并且正在寻找一种方法来更轻松地为 Windows 窗体选择语言以进行本地化。
在设计器中,您可以在“设计”→“语言”下选择所需的语言,然后 Visual Studio 通过创建必要的本地化文件来完成剩下的工作如果您需要新的本地化表单。
问题是:目前我只使用两种不同的语言,每次在这些本地化形式之间切换时,它都会向我显示所有可能语言的列表,错误的单击会导致 visual studio 创建 a 的本地化版本我不想要的语言,这很烦人并且用更多的文件使项目变得困惑。
有谁知道如何将设计器选项中显示的语言限制为所需的数量和选择?
最佳答案
Language 属性是仅设计时属性,不属于 Form
类。它是使用扩展器提供程序添加到表单设计时的扩展属性。它是 CultureInfo
类型,并使用显示所有可用文化的 TypeConverter
。
作为一种变通方法,您可以使用包含 FormLanguage
等属性的 BaseForm
并在 get
中返回 Language 的值
属性并在 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
的 setter 中编写。您可以在 MyCultureInfoConverter
中添加您需要的任何其他语言。
关于c# - Visual Studio Designer - 限制属性网格以显示语言属性的某些特定语言,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36932205/