C# 从自定义控件的另一个属性获取设计器中设置的属性值

C# 从自定义控件的另一个属性获取设计器中设置的属性值,c#,.net,winforms,resources,custom-controls,C#,.net,Winforms,Resources,Custom Controls,我创建了自定义控件,并添加了一个指向资源的新属性。 如何从自定义控件的另一个属性获取此属性的值(在窗体设计器中设置)? 当我尝试读取它时,它返回的值是null 我的代码与自定义控件的名称和提到的属性相关: class ResourceLabel : Label { private string resourceKey; [Category("Appearance")] [Browsable(true)] [Description(&

我创建了自定义控件,并添加了一个指向资源的新属性。
如何从自定义控件的另一个属性获取此属性的值(在窗体设计器中设置)? 当我尝试读取它时,它返回的值是
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}”)
返回
null

给定问题的描述以及应用于自定义控件的
ResourceKey
属性的
description
属性,似乎您正在本地化应用程序,因此,将父窗体的
Localizable
属性设置为
true

这将更改表单初始化中的一些详细信息。
如果查看Form.Designer.cs文件,您会注意到添加了一些新的部分:
通常:
System.ComponentModel.ComponentResourceManager资源=新系统.ComponentModel.ComponentResourceManager(typeof(YourForm))

现在有了新的伙伴。在每个控件的初始化部分,
resources.ApplyResources(this.controlName,“controlName”)

您的自定义标签应显示,例如:

resources.ApplyResources(this.resourceLabel1, "resourceLabel1");
控件派生的许多标准属性都是可本地化的(用
[localizable(true)]
属性修饰)。这个这些属性的值现在存储在用于不同本地化的资源文件中。因此,这些属性不再在Designer.cs文件中设置,也在其他属性之前初始化

您的
ResourceKey
属性未定义为
Localizable
,因此它被添加到Designer.cs文件中,并在Localizable属性之后初始化

► 一个简单的修复方法是将
ResourceKey
属性定义为
Localizable
,因此它将在非本地化属性之前初始化,同时初始化
文本
属性

[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-从表单设计器中删除旧的
ResourceLabel
控件
3-编译解决方案
4-将自定义
资源标签添加回原来的位置
5-在属性面板中设置所需控件的属性
6-运行应用程序或编译项目

检查表单的Designer.cs文件,查看
ResourceKey
属性是否已消失,其值现在通过
resources.ApplyResource()
设置

► 如果不想使该属性可本地化,则必须在控件初始化完成后读取其值;例如,重写
OnHandleCreated
方法。请注意,控件的句柄可以在少数情况下在运行时重新创建(设置需要控件重新创建句柄的键属性)

注意

您不应该依赖于属性的初始化顺序,不能真正保证一个属性在另一个属性之前初始化。在设计控件的行为时考虑这一点。

鉴于问题的描述以及应用于自定义控件的
ResourceKey
属性的
描述属性,您似乎正在本地化应用程序,因此,将父窗体的
Localizable
属性设置为
true

这将更改表单初始化中的一些详细信息。
如果查看Form.Designer.cs文件,您会注意到添加了一些新的部分:
通常:
System.ComponentModel.ComponentResourceManager资源=新系统.ComponentModel.ComponentResourceManager(typeof(YourForm))

现在有了新的伙伴。在每个控件的初始化部分,
resources.ApplyResources(this.controlName,“controlName”)

您的自定义标签应显示,例如:

resources.ApplyResources(this.resourceLabel1, "resourceLabel1");
控件派生的许多标准属性都是可本地化的(用
[localizable(true)]
属性修饰)。这个这些属性的值现在存储在用于不同本地化的资源文件中。因此,这些属性不再在Designer.cs文件中设置,也在其他属性之前初始化

您的
ResourceKey
属性未定义为
Localizable
,因此它被添加到Designer.cs文件中,并在Localizable属性之后初始化

► 一个简单的修复方法是将
ResourceKey
属性定义为
Localizable
,因此它将在非本地化属性之前初始化,同时初始化
文本
属性

[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-从表单设计器中删除旧的
ResourceLabel
控件
3-编译解决方案
4-将自定义
资源标签添加回原来的位置
5-在属性面板中设置所需控件的属性
6-运行应用程序或编译项目

检查表单的Designer.cs文件,查看
ResourceKey
属性是否已消失,其值现在通过
resources.ApplyResource()
设置

► 如果不想使该属性可本地化,则必须读取其val