在 WinForms 中保留设计时属性

Persisting Design Time Properties in WinForms

我正在为 Windows 表单编写样式化的控件。我所说的样式化是指用户对 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 实例的所有属性。我也可以更改这些值,但是在我 build/run 项目的那一刻,我分配给属性的值就消失了。我的代码需要什么才能保留设计时指定的 属性 值?

如果目标是获得设计时支持,那么您不需要将所有 类 都基于 Component object. Instead you could decorate your classes with the 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();
  }
}