通常在C#中我们用PropertyGrid来实验属性页功能,然后定义一个类,把对象实例传给PropertyGrid的SelectedObject属性。
然后在属性类中定义各个属性之前我们加各个Attribute调用来实现属性页上内容,如下代码:
[DisplayNameAttribute("XXX Name")]
[DescriptionAttribute("XXX Description")]
[CategoryAttribute("YYY")]
public string Name { get {...} set{...} }
现在需要实现多语言化,但在Attribute后的括号里不能使用Resources.XXX之类的内容来实现,因为那里需要常量。
解决办法是派生这些Attribute类,重载一些函数实现:
1. DisplayNameAttribute类我们重载public virtual string DisplayName { get; }属性
2. DescriptionAttribute类我们重载public virtual string Description { get; }属性
3. CategoryAttribute类我们重载protected virtual string GetLocalizedString(string value);方法
实例代码如下:
/// <summary> /// Override attribute for category /// </summary> public class LocalizedCategoryAttribute : CategoryAttribute { public LocalizedCategoryAttribute() : base() { } public LocalizedCategoryAttribute(string category) : base(category) { } protected override string GetLocalizedString(string value) { return Resources.ResourceManager.GetString(value); } } /// <summary> /// Override attribute for display name /// </summary> public class LocalizedDisplayNameAttribute : DisplayNameAttribute { public LocalizedDisplayNameAttribute() : base() { } public LocalizedDisplayNameAttribute(string displayName) : base(displayName) { } public override string DisplayName { get { return Resources.ResourceManager.GetString(base.DisplayNameValue); } } } /// <summary> /// Override attribute display name /// </summary> public class LocalizedDescriptionAttribute : DescriptionAttribute { public LocalizedDescriptionAttribute() : base() { } public LocalizedDescriptionAttribute(string description) : base(description) { } public override string Description { get { return Resources.ResourceManager.GetString(base.DescriptionValue); } } }
最后用这些派生类替换属性类里各属性之前的Attribute类,然后把之前Attribute后括号里的内容移到Resources类里,定义一个名称,派生类使用这些名称代替而不是内容,比如:
[LocalizedDisplayNameAttribute("XXXName")]
[LocalizedDescriptionAttribute("XXXDescription")]
[LocalizedCategoryAttribute("YYY")]
public string Name { get {...} set{...} }
多语言Resouces里对应添加同样名称的字符串和内容,多语言实验参见C#多语言实施方法。
相关日志
Tags: C#/.NET