我正在创建一个黑色背景的自定义控件,但设计师遇到了一些问题。真相被告知我有一个继承自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
上调用重置,它会正确返回Color.Black
。此外,设计人员不会将更改序列化为System.Drawing.SystemColors.Control
,直到我对控件进行另一次更改。
那么,我尝试了什么?
我认为它可能与BackColor
是环境属性有关,所以我尝试添加属性AmbientValue(false)
。当然它不起作用。
我尝试删除重写的属性,只在构造函数中留下BackColor=Color.Black
。令人惊讶的是,它解决了设计师的问题,但现在重置属性会将其恢复为默认值System.Drawing.SystemColors.Control
。覆盖ResetBackColor()
并未解决最后一个问题。
顺便说一句,我在Visual Studio 2010下工作,我的项目是作为.NET 2.0 Windows窗体应用程序创建的。
我很高兴有人能帮我找到我的代码中的任何错误。这不会阻止我完成项目,但它非常烦人。非常感谢你提前!
答案 0 :(得分:1)
这个可能帮助 - 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