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

Rot*_*tem 3 .net c# visual-studio-2010 windows-forms-designer winforms

我有一个习惯DataGridView,让我们这样说:

public MyGridView : DataGridView
{
    public MyGridView()
    {
         BackgroundColor = Color.Red;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,当我在使用设计器的项目中使用此控件时,出于某种原因,还需要在designer.cs文件中设置该属性.

所以在设计器文件中,我会:

this.MyGridView1.BackgroundColor = System.Drawing.Color.FromArgb((byte)(int)255, (byte)(int)0, (byte)(int)0);
Run Code Online (Sandbox Code Playgroud)

我的问题是,它阻止我能够改变我的构造函数中的颜色MyGridView,而不必遍历我以前控制的所有形式并在每个实例中更改它,使我的自定义控件无效.

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

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

Han*_*ant 10

我应该强调,这通常不是你这样做的方式,[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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,ResetBackgroundColor()方法实际上并不是必需的,因为当用户重置属性时不需要特殊效果,我只是为了完整性而包含它.

  • `BeersIOweHansPassant ++;` (7认同)