调用InitializeComponent后未初始化C#自定义控件的属性吗?

问题描述

我正在尝试创建一个简单的文本框,该文本框在未聚焦且其文本为空时显示提示文本,并在聚焦时隐藏该提示文本。为此,我通过扩展TextBox创建了一个自定义控件。

public partial class HintedTextBox : TextBox
{
    private Color foreColor;

    public HintedTextBox()
    {
        InitializeComponent();
        foreColor = ForeColor;
        GotFocus += OnFocused;
        LostFocus += OnFocusLost;

        OnFocusLost(null,null); // Problem
    }

    public string Hint { get; set; }

    protected override void OnPaint(PaintEventArgs pe)
    {
        base.OnPaint(pe);
    }

    private void OnFocused(object sender,EventArgs e)
    {
        if (Text == Hint)
        {
            Text = "";
            ForeColor = foreColor;
        }
    }

    private void OnFocusLost(object sender,EventArgs e)
    {
        if (Text.Trim() == "") 
        {
            Text = Hint;
            ForeColor = Color.Gray;
        }
        else
        {
            ForeColor = foreColor;
        }
    }
}

从逻辑上讲,在初始化组件之后,我需要调用OnFocusLost()过程,以便应用程序在首次显示Form时显示提示。问题出在我标记// problem的那一行。在这一行,即使我已经在Designer中设置了它们的值,我的自定义属性Hint和stock属性Text都未初始化。奇怪的是ForeColor属性已经在该行初始化了。这些值被初始化后,还会触发另一个事件吗?还是有其他解决方案?

我还尝试了从Windows窗体的Formload事件的控件外部调用OnFocusLost()。它也不起作用。 TextHint在开始时始终为空,即使在InitializeComponent()调用之后也是如此。

感谢您的关注。

编辑: 我忘记将Form的加载事件附加到我的Formload()方法上,但是Vladimir Stoyanov的解决方案运行得很好,甚至更好。

解决方法

作为一个选项,您可以仅使用Hint属性的setter。当您以后需要以编程方式更改提示时,它将处理这种情况

private string hint;
public string Hint
{
    get => hint;
    set
    {
        hint = value;
        OnFocusLost(null,null);
    }
}