[英]Prevent Winforms Designer from Generating Property Values for Inherited Controls
我有一个自定义DataGridView
,我们这样说:
public MyGridView : DataGridView
{
public MyGridView()
{
BackgroundColor = Color.Red;
}
}
现在,当我在使用设计器的项目中使用此控件时,由于某种原因,感觉到还需要在designer.cs文件中设置该属性。
因此,在设计器文件中,我将拥有:
this.MyGridView1.BackgroundColor = System.Drawing.Color.FromArgb((byte)(int)255, (byte)(int)0, (byte)(int)0);
我的问题是,这使我无法在MyGridView
的构造函数中更改颜色,而不必遍历用于控制和更改实例的所有形式,从而使自定义控件无效。
对于某些提供虚拟吸气剂的属性,这没有问题,但是大多数属性都没有。
如何防止设计人员生成此代码?
我应该强调,这通常不是您执行此操作的方式, [DefaultValue]
属性通常是正确的选择。 但是,您正在使用Color类型的属性,以灵活的方式为该属性编写属性并不简单。 您可以传递给属性构造函数的参数只能是少数几种数据类型,Color并不是其中之一。 您必须制作一个ColorConverter可以理解的字符串 ,既难看又难以维护。
PropertyGrid具有为“困难”属性提供默认值的第二种方法,它还将在类中查找专门命名的私有成员。 给定名为“ Xxxx”的属性,它将查找以下内容:
这使此代码起作用:
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; }
}
}
请注意,实际上并没有必要使用ResetBackgroundColor()方法,因为当用户重置属性时,不需要任何特殊效果,我只是为了完整性而将其包括在内。
尝试改用InitLayout和DesignMode。 您不能在ctor中使用DesignMode,但是在构造控件之后,您可以正确访问Designmode属性以设置颜色。 注意:这不会在设计器中设置样式,而只是在运行时设置。
public class MyGridView : DataGridView
{
protected override void InitLayout()
{
base.InitLayout();
if (!DesignMode)
BackgroundColor = Color.Red;
}
}
有一种将DefaultValue分配给Color的简单方法:
public class MyGridView : DataGridView
{
public MyGridView()
{
BackgroundColor = Color.Red;
}
[DefaultValue(typeof(Color), "Red")]
public new Color BackgroundColor
{
get { return base.BackgroundColor; }
set { base.BackgroundColor = value; }
}
}
如果需求很简单并且设计外观没问题,请尝试编写一两个扩展名,例如,
public static class Extensions
{
public static void ApplyStyle( this DataGridView dataGridView )
{
dataGridView.RowHeadersVisible = false;
...
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.