C#Windows窗体.重写设计器代码

本文关键字:代码 窗体 重写 C#Windows | 更新日期: 2023-09-27 18:19:58

我有一个自定义控件,在本例中它派生自TextBox。在这个控件的构造函数中,我设置了一个新的Font。

public class dvTextBox : TextBox
{
    public dvTextBox()
    {
        LoadSettings();
    }
    private void LoadSettings()
    {
        this.Font = new System.Drawing.Font("Segoe UI", 8f);
    }
}

我在整个应用程序中都使用这个控件,在某些情况下,我已经通过设计器触摸了字体属性。

当我更改自定义控件中的字体时,我不会更改那些使用了设计器的对象。

是否有可能使自定义类中的代码比自动生成的设计器代码更"重要"?

C#Windows窗体.重写设计器代码

您需要覆盖Font属性并在其上设置一个新的DefaultValue,因为您在构造函数中设置了它,设计器确定新值与默认值不匹配,并序列化了新字体。然后,在构建对象的过程中,它使用在构造函数运行后加载的序列化值,覆盖您放入的内容。

这实际上有点困难,因为DefaultValueAttribute不采用"Font"类型,也不能在属性中构造一个。下面是一个关于如何做到这一点的简短示例:

public class dvTextBox : TextBox
{
    private Font _defaultFont = new Font("Segoe UI", 8f);
    public override Font Font
    {
        get { return base.Font; }
        set
        {
            if (value == null)
                base.Font = _defaultFont;
            else
                base.Font = value;
        }
    }
    public override void ResetFont() { Font = null; }
    private bool ShouldSerializeFont() { return !Font.Equals(_defaultFont); }
}

ResetFontShouldSerializeFont函数是设计器序列化程序识别的特殊方法,用于重置(右键单击属性,选择"重置")属性,或确定是否应序列化属性。您可以用相同的格式为所有可序列化/可重置属性创建这两个相同的函数,即Reset[PropertyName]和ShouldSerialize[PropertyName]。

如果要从控件的API隐藏Reset和ShouldSerialize,只需使用EditorBrowsable(EditorBrowsableState.Never)属性对其进行装饰即可。