我有一个自定义控件,在这种情况下派生自TextBox。 在这个控件的构造函数中,我设置了一个新的Font。
public class dvTextBox : TextBox
{
public dvTextBox()
{
LoadSettings();
}
private void LoadSettings()
{
this.Font = new System.Drawing.Font("Segoe UI", 8f);
}
}
我在我的应用程序中使用此控件,在某些情况下,我通过设计器触摸了font属性。
当我在自定义控件中更改字体时,我不会更改那些使用过设计器的对象。
是否有可能使自定义类中的代码比自动生成的设计器代码更“重要”?
答案 0 :(得分:2)
您需要覆盖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); }
}
The ResetFont
and ShouldSerializeFont
functions are special methods由设计器序列化程序识别为重置(右键单击属性,选择“重置”)属性,或确定属性是否应序列化。您可以使用相同的格式为所有可序列化/可重置属性创建这两个相同的函数,即Reset [PropertyName]和ShouldSerialize [PropertyName]。
如果要隐藏控件API的Reset和ShouldSerialize,只需使用EditorBrowsable(EditorBrowsableState.Never)
属性修饰它们。