加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 在usercontrol中更改默认backcolor的问题

发布时间:2020-12-15 22:01:29 所属栏目:百科 来源:网络整理
导读:我正在创建一个黑色背景的自定义控件,但设计师遇到了一些问题.真相被告知我有一个继承自UserControl的基类控件类,然后是一些代表我将在GUI中使用的最终控件的子类.在该基类中,我重写BackColor属性,添加DefaultValue属性并在构造函数中将默认值设置为BackColo
我正在创建一个黑色背景的自定义控件,但设计师遇到了一些问题.真相被告知我有一个继承自UserControl的基类控件类,然后是一些代表我将在GUI中使用的最终控件的子类.在该基类中,我重写BackColor属性,添加DefaultValue属性并在构造函数中将默认值设置为BackColor.举个例子,我的代码看起来像这样:

public partial class MyControl1 : UserControl
{
    public MyControl1()
    {
        InitializeComponent();
        BackColor = Color.Black;            
    }

    [DefaultValue(typeof(Color),"Black")]
    public override Color BackColor
    {
        get
        {
            return base.BackColor;
        }
        set
        {
            base.BackColor = value;
        }
    }
}

public partial class MyControl2 : MyControl1
{
    public MyControl2()
    {
        InitializeComponent();
    }
}

问题是我每次打开MyControl2的设计器时,属性对话框中的BackColor都会恢复为System.Drawing.SystemColors.Control,我的控件被涂成灰色.如果我在BackColor上调用Reset,它会正确返回到Color.Black.此外,设计器不会将更改序列化到System.Drawing.SystemColors.Control,直到我对控件进行另一次更改.

那么,我尝试了什么?

>我认为它可能与BackColor是一个环境属性有关,所以我尝试添加属性AmbientValue(false).当然它没有用.
>我尝试删除重写的属性,只在构造函数中留下BackColor = Color.Black.令人惊讶的是,它修复了设计器的问题,但现在重置属性将其恢复为默认值System.Drawing.SystemColors.Control.重写ResetBackColor()并没有解决最后一个问题.

顺便说一句,我在Visual Studio 2010下工作,我的项目是作为.NET 2.0 Windows窗体应用程序创建的.

我很高兴有人能帮助我找到我的代码中的任何错误.这不会阻止我完成项目,但它非常烦人.非常感谢你提前!

解决方法

这可能会有所帮助 – winforms设计器中似乎有一些伏都教(有点像XML序列化程序),它会查找以特定方式命名的属性,因为DefaultValue不能像您预期的那样工作:

以下是来自另一篇文章的示例,我知道您不是继承DataGridView的子类,但原则应该是相同的.

public class MyGridView : DataGridView {
    public MyGridView() {
        this.BackgroundColor = DefaultBackgroundColor;
    }
    public new Color BackgroundColor {
        get { return base.BackgroundColor; }
        set { base.BackgroundColor = value;  }
    }
    private bool ShouldSerializeBackgroundColor() {
        return !this.BackgroundColor.Equals(DefaultBackgroundColor);
    }
     private void ResetBackgroundColor() {
        this.BackgroundColor = DefaultBackgroundColor;
    }
    private static Color DefaultBackgroundColor {
        get { return Color.Red; }
    }
}

很自然 – 这不是我的代码 – 它是来自Hans Passant的一些更纯粹的天才…链接到原始的完整解释:https://stackoverflow.com/a/20838280/685341

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读