从自定义控件的另一个 属性 获取在设计器中设置的 属性 值
Get the property value set in the Designer from another property of a Custom Control
我制作了自定义控件,并添加了一个新的 属性 以指向资源。
如何从自定义控件的另一个 属性 中获取此 属性 在表单设计器中设置的值?
当我尝试阅读它时,它的值 return 是 null
.
我的代码与自定义控件和提到的相关 属性:
class ResourceLabel : Label
{
private string resourceKey;
[Category("Appearance")]
[Browsable(true)]
[Description("Sets the resource key for localization")]
public string ResourceKey
{
get { return resourceKey; }
set {
if (resourceKey != value) {
resourceKey = value;
Invalidate();
}
}
}
[Browsable(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[EditorBrowsable(EditorBrowsableState.Always)]
[Bindable(true)]
public override string Text
{
if (base.Text != value) {
Console.WriteLine($"Test: {ResourceKey}");
if (ResourceKey != null) {
var locale = CultureInfo.GetCultureInfo(Properties.Settings.Default.Language);
var textFromResource = Resources.ResourceManager.GetString(ResourceKey, locale);
base.Text = textFromResource;
}
else {
base.Text = value;
}
}
}
}
这个字符串 Console.WriteLine($"Test: {ResourceKey}");
returns null
.
考虑到问题的描述以及应用于自定义控件的 ResourceKey
属性 的 Description
属性,看来您正在本地化您的应用程序,因此将父表单的 Localizable
属性 设置为 true
.
这会更改表单初始化中的一些细节。
如果您查看 Form.Designer.cs 文件,您会注意到添加了一些新部分:
平常的:
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(YourForm));
现在有了新伙伴。在每个控件的初始化部分,添加了resources.ApplyResources(this.controlName, "controlName");
。
您的自定义标签应该显示,例如:
resources.ApplyResources(this.resourceLabel1, "resourceLabel1");
许多从 Control
派生的标准属性是可本地化的(用 [Localizable(true)]
属性修饰)。 Text property is of course among these。这些属性的值现在存储在用于不同本地化的资源文件中。因此,这些属性不再在 Designer.cs 文件中设置,并且也在其他属性之前被初始化。
你的ResourceKey
属性没有定义为Localizable
,所以在Designer.cs文件中添加,之后初始化可本地化的属性。
▶ 一个简单的解决方法是将 ResourceKey
属性 定义为 Localizable
,这样它将在 non-localized 属性之前与 Text
属性.
[Localizable(true), Browsable(true)]
[Category("Appearance"), Description("Sets the resource key for localization")]
public string ResourceKey {
get { return resourceKey; }
set {
if (resourceKey != value) {
resourceKey = value;
Invalidate();
}
}
}
请注意,这是一个 重大更改 ,您应该:
1 - 将 Localizable
属性添加到 ResourceKey
属性
2 - 从表单设计器中删除 old ResourceLabel
控件
3 - 编译解决方案
4 - 将自定义 ResourceLabel
添加回原来的位置
5 - 在属性面板中设置所需控件的属性
6 - 运行 应用程序或编译项目
检查你的Form的Designer.cs文件,看到ResourceKey
属性已经消失了,它的值现在是通过resources.ApplyResource()
.
设置的
▶ 如果您不想使 属性 可本地化,则必须在控件初始化完成后 读取它的值;例如,覆盖 OnHandleCreated
。请注意,在某些情况下,控件的句柄可能会 re-created at run-time(设置需要控件重新创建句柄的关键属性)。
注:
你不应该依赖你的属性的初始化顺序,没有真正保证 属性 在另一个之前被初始化。在设计控件的行为时考虑到这一点。
我制作了自定义控件,并添加了一个新的 属性 以指向资源。
如何从自定义控件的另一个 属性 中获取此 属性 在表单设计器中设置的值?
当我尝试阅读它时,它的值 return 是 null
.
我的代码与自定义控件和提到的相关 属性:
class ResourceLabel : Label
{
private string resourceKey;
[Category("Appearance")]
[Browsable(true)]
[Description("Sets the resource key for localization")]
public string ResourceKey
{
get { return resourceKey; }
set {
if (resourceKey != value) {
resourceKey = value;
Invalidate();
}
}
}
[Browsable(true)]
[DesignerSerializationVisibility(DesignerSerializationVisibility.Visible)]
[EditorBrowsable(EditorBrowsableState.Always)]
[Bindable(true)]
public override string Text
{
if (base.Text != value) {
Console.WriteLine($"Test: {ResourceKey}");
if (ResourceKey != null) {
var locale = CultureInfo.GetCultureInfo(Properties.Settings.Default.Language);
var textFromResource = Resources.ResourceManager.GetString(ResourceKey, locale);
base.Text = textFromResource;
}
else {
base.Text = value;
}
}
}
}
这个字符串 Console.WriteLine($"Test: {ResourceKey}");
returns null
.
考虑到问题的描述以及应用于自定义控件的 ResourceKey
属性 的 Description
属性,看来您正在本地化您的应用程序,因此将父表单的 Localizable
属性 设置为 true
.
这会更改表单初始化中的一些细节。
如果您查看 Form.Designer.cs 文件,您会注意到添加了一些新部分:
平常的:
System.ComponentModel.ComponentResourceManager resources = new System.ComponentModel.ComponentResourceManager(typeof(YourForm));
现在有了新伙伴。在每个控件的初始化部分,添加了resources.ApplyResources(this.controlName, "controlName");
。
您的自定义标签应该显示,例如:
resources.ApplyResources(this.resourceLabel1, "resourceLabel1");
许多从 Control
派生的标准属性是可本地化的(用 [Localizable(true)]
属性修饰)。 Text property is of course among these。这些属性的值现在存储在用于不同本地化的资源文件中。因此,这些属性不再在 Designer.cs 文件中设置,并且也在其他属性之前被初始化。
你的ResourceKey
属性没有定义为Localizable
,所以在Designer.cs文件中添加,之后初始化可本地化的属性。
▶ 一个简单的解决方法是将 ResourceKey
属性 定义为 Localizable
,这样它将在 non-localized 属性之前与 Text
属性.
[Localizable(true), Browsable(true)]
[Category("Appearance"), Description("Sets the resource key for localization")]
public string ResourceKey {
get { return resourceKey; }
set {
if (resourceKey != value) {
resourceKey = value;
Invalidate();
}
}
}
请注意,这是一个 重大更改 ,您应该:
1 - 将 Localizable
属性添加到 ResourceKey
属性
2 - 从表单设计器中删除 old ResourceLabel
控件
3 - 编译解决方案
4 - 将自定义 ResourceLabel
添加回原来的位置
5 - 在属性面板中设置所需控件的属性
6 - 运行 应用程序或编译项目
检查你的Form的Designer.cs文件,看到ResourceKey
属性已经消失了,它的值现在是通过resources.ApplyResource()
.
▶ 如果您不想使 属性 可本地化,则必须在控件初始化完成后 读取它的值;例如,覆盖 OnHandleCreated
。请注意,在某些情况下,控件的句柄可能会 re-created at run-time(设置需要控件重新创建句柄的关键属性)。
注:
你不应该依赖你的属性的初始化顺序,没有真正保证 属性 在另一个之前被初始化。在设计控件的行为时考虑到这一点。