在WinForms中保留设计时属性

时间:2015-05-31 18:56:33

标签: c# winforms persistence designer

我正在为Windows Forms编写一个可控制的控件。通过styable我的意思是用户可以更好地控制Control的外观而不是标准BackColorForeColor等。以下代码已经过简化以说明问题

[ToolboxItem(false)]
public class BrushProperties : Component
{
    public Color[] GradientColors { get; set; }
    public Single[] GradientPositions { get; set; }
    public Single GradientAngle { get; set; }
}

[ToolboxItem(false)]
public class Style : Component
{
    public BrushProperties Background { get; set; }
    public BrushProperties Foreground { get; set; }

    public Style()
    {
         this.Background = new BrushProperties();
         this.Foreground = new BrushProperties();
    }
}

public class StyleControl : Control
{
    public Style Style { get; set; }

    public StyleControl()
    {
        this.Style = new Style();
    }
}

当我在设计器中时,我可以看到Style的所有属性以及每个BrushProperties实例的所有属性。我也可以更改值,但是在构建/运行项目的那一刻,我分配给属性的值消失了。为了保留在设计时指定的属性值,我的代码需要什么?

1 个答案:

答案 0 :(得分:1)

如果目标是获得设计时支持,那么您不需要基于Component对象的所有类。相反,您可以使用ExpandableObjectConverter属性来装饰您的类。

PropertyGrid将使用ExpandableObjectConverter属性来确定是否应该展开对象的属性。

示例:

[ToolboxItem(false)]
[TypeConverter(typeof(ExpandableObjectConverter))]
public class BrushProperties
{
  public Color[] GradientColors { get; set; }
  public Single[] GradientPositions { get; set; }
  public Single GradientAngle { get; set; }
}

[ToolboxItem(false)]
[TypeConverter(typeof(ExpandableObjectConverter))]
public class Style
{
  public BrushProperties Background { get; set; }
  public BrushProperties Foreground { get; set; }

  public Style()
  {
    this.Background = new BrushProperties();
    this.Foreground = new BrushProperties();
  }
}