c# Winforms:在设计器中控制继承和使用

问题描述 投票:0回答:1

我“创建”了一个

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;
    }
}
c# winforms controls
1个回答
0
投票

您可以解决 RichTextLabel 中的 Overriding OnHandleCreated 问题并在那里重新应用这些属性。这可以确保您的设置即使在设计器中重新打开后仍然保留。

protected override void OnHandleCreated(EventArgs e)
{
    base.OnHandleCreated(e);
    BorderStyle = BorderStyle.None;
    BackColor = SystemColors.Control;
    ReadOnly = true;
}
© www.soinside.com 2019 - 2024. All rights reserved.