我“创建”了一个
RichTextLabel
,基本上是一个 RichTextBox
,其中包含颜色表和其他 rtf 内容的一些属性。 RichTextBox
的某些属性在构造函数中使用非默认值进行初始化,因此它的作用更像是标签而不是文本框(例如:BorderStyle
设置为 none、BackColor
设置为 control、ReadOnly
为设置为 true 等等)。这就是全部作品。
现在我在用户控件中使用这个
RichTextLabel
。我将其放到控件上,设计控件,将所有内容连接起来,它在设计器中看起来是正确的。
此 UserControl 有一个 Title 属性,可以直接访问标签的文本,并且标签本身也是公共属性,因此我不需要为标签上可能根本不需要的每个 rtf 特定内容创建属性。此公共属性使用设置为 content 的 DesignerSerializationVisibility
属性进行装饰。
问题:当将其放到表单上时,它首先看起来没问题。 RichTextLabel 的
BorderStyle
仍然是 None
。但是当我在设计器中关闭表单并重新打开它时,边框设置为3dFixed
。 BackColor
是 Window
等等,默认的 RichTextBox
属性,而不是我在 RichTextLabel
构造函数中使用的属性。
可能设计者正在使用基类中的 DefaultValue 属性,因为我的类不会重写这些属性(有些属性不可重写)并且无法为这些属性声明新的
DefaultValue
?
有什么想法可以解决这个问题吗?
public sealed class RichTextLabel : RichTextBox
{
[Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
public string RtfText { ... }
public Color Color1 { ... }
public Color Color2 { ... }
public Color Color3 { ... }
public RichTextLabel()
{
ReadOnly = true;
BorderStyle = BorderStyle.None;
TabStop = false;
ScrollBars = RichTextBoxScrollBars.None;
BackColor = SystemColors.Control;
SetStyle(ControlStyles.Selectable, false);
SetStyle(ControlStyles.UserMouse, true);
NativeMethods.HideCaret(Handle);
}
}
public class UserControl1 : UserControl
{
[Editor(typeof(MultilineStringEditor), typeof(UITypeEditor))]
public string Title { get => richTextLabel1.RtfText; set => richTextLabel1.RtfText = value; }
[DesignerSerializationVisibility(DesignerSerializationVisibility.Content)]
public RichTextLabel TitleLabel
{
get => richTextLabel1;
set => richTextLabel1 = value;
}
}
您可以解决 RichTextLabel 中的 Overriding OnHandleCreated 问题并在那里重新应用这些属性。这可以确保您的设置即使在设计器中重新打开后仍然保留。
protected override void OnHandleCreated(EventArgs e)
{
base.OnHandleCreated(e);
BorderStyle = BorderStyle.None;
BackColor = SystemColors.Control;
ReadOnly = true;
}