重写控件的颜色,但不在设计模式下工作



我编写了一个继承 Control 类的控件。代码喜欢

class MyControl : Control {      
    private SolidBrush foreColor = new SolidBrush();    
    public override Color ForeColor {    
        get { return foreColor.Color; }    
        set { foreColor.Color = value; }      
    }
}

看起来不错,但是当我在设计模式下分配前景色时,它总是在运行时显示默认颜色。知道吗?

已编辑

我对类似的问题感到困惑,并发现设计模式不会在自动生成的代码中生成Property = Value。请检查FormName.Designer.cs中自动生成的代码。

如果您和我有同样的情况,请尝试

set
{
    foreColor.Color = value;
    base.ForeColor = value;
}

你正在混淆画笔和颜色。

这将按预期工作:

class MyControl : Control
{      
    private Color foreColor = SystemColors.ControlText;
    public override Color ForeColor
    {
        get { return foreColor; }
        set { foreColor = value; }
    }
}

请注意,这样的Control不会显示太多,特别是没有Text,因此您可能希望使用 Label 或任何其他具有可见 Text 属性的控件来测试它:class MyLabel : Label或者,当然不是通过设置ForeColor而是设置BackColor..

只要您不想使用私有文件来设置默认颜色,使用自动属性语法就可以了,因为生成的字段将无法访问!(出于明显的原因,它不会使用您声明的那个。

class MyLabel : Label 
{      
    public override Color ForeColor { get; set; }
}

还要确保在设计器中取消选择控件以查看您设置的颜色!

更新我你真的想包含Control设置ForeColor是没有意义的,除非你帮助 ypur 类显示Text,因为Control是众多不显示其Text属性的控件之一,如Panel PictureBox等。

下面是一个示例:

class MyControl0 : Control
{
    private SolidBrush foreColor = new SolidBrush(SystemColors.ControlText);
    public override Color ForeColor
    {
        get { return foreColor.Color; }
        set { foreColor.Color = value; }
    }
    protected override void OnPaint(PaintEventArgs e)
    {
         base.OnPaint(e);
        TextFormatFlags flags = TextFormatFlags.HorizontalCenter |
                                TextFormatFlags.VerticalCenter ;
        TextRenderer.DrawText(e.Graphics, Text, Font, ClientRectangle, 
                              ForeColor, flags);
    }
}

最新更新