阻止Winforms Designer为inheritance的控件生成属性值

我有一个自定义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的构造函数中的颜色,而不必遍历我以前控制的所有表单并在每个实例中更改它,使我的自定义控件无效。

有些属性提供虚拟getter,这没有问题,但大多数属性都没有。

如何防止设计人员生成此代码?

我应该强调,这通常不是你这样做的方式, [DefaultValue]属性通常是正确的选择。 但是您正在使用Color类型的属性,以灵活的方式为其编写属性并不简单。 您可以传递给属性构造函数的参数只能是少数几种数据类型,Color不是其中之一。 你必须制作一个ColorConverter可以理解的字符串 ,它既丑陋又难以维护。

PropertyGrid有一种为“困难”属性提供默认值的辅助方法,它还会在类中查找特别命名的私有成员。 给定名为“Xxxx”的属性,它会查找以下内容:

  • DefaultXxxx,一个只有一个返回默认值的getter的属性
  • ResetXxxx(),一种可在用户选择“重置”上下文菜单项时运行的方法
  • ShouldSerializeXxxx(),如果不应保留属性的值,则该方法应返回false

这使得此代码有效:

 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; ... } }