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

C# C Windows窗体。重写设计器代码,c#,winforms,C#,Winforms,我有一个自定义控件,在本例中是从TextBox派生的。 在这个控件的构造函数中,我设置了一个新字体 public class dvTextBox : TextBox { public dvTextBox() { LoadSettings(); } private void LoadSettings() { this.Font = new System.Drawing.Font("Segoe UI", 8f); }

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

public class dvTextBox : TextBox
{
    public dvTextBox()
    {
        LoadSettings();
    }

    private void LoadSettings()
    {
        this.Font = new System.Drawing.Font("Segoe UI", 8f);
    }
}
我在我的应用程序中使用这个控件,在某些情况下,我通过设计器接触了字体属性

然后,当我在自定义控件中更改字体时,我不会更改使用设计器的对象的字体


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

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

这实际上有点困难,因为DefaultValueAttribute不采用字体类型,也不能在属性中构造字体类型。下面是一个关于如何执行此操作的简短示例:

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); }

}
设计器序列化程序已识别要重置的属性,请右键单击该属性,选择“重置该属性”,或确定是否应序列化该属性。您可以使用相同的格式为所有可序列化/可重置属性创建这两个相同的函数,即Reset[PropertyName]和ShouldSerialize[PropertyName]

如果要隐藏重置并从控件的API序列化,只需使用EditorRowsableEditorRowsableState.Never属性修饰它们