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

C# Custom Control's attribute not initialized after InitializeComponent() call?

我正在尝试创建一个简单的文本框,它在未获得焦点且文本为空时显示提示文本,并在获得焦点时隐藏提示文本。为此,我通过扩展 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() 过程,以便应用程序在首次显示表单时显示提示。问题出在我用 // problem 标记的那一行。在这一行,我的自定义属性 Hint 和库存属性 Text 都没有初始化,即使我已经在设计器中设置了它们的值。奇怪的是 ForeColor 属性已经在该行进行了初始化。是否有另一个事件在这些值初始化后立即触发,或者是否有任何其他解决方案?

我也试过在 Windows 表单的 FormLoad 事件上从控件外部调用 OnFocusLost()。它也不起作用。 TextHint 在开始时总是空的,即使在 InitializeComponent() 调用之后也是如此。

感谢您的关注。

编辑: 我忘记将表单的加载事件附加到我的 FormLoad() 方法,但尽管如此,Vladimir Stoyanov 的解决方案工作得很好,甚至更好。

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

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