繁体   English   中英

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

[英]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”的属性,它将查找以下内容:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM