在 WinForms 中保留设计时属性
Persisting Design Time Properties in WinForms
我正在为 Windows 表单编写样式化的控件。我所说的样式化是指用户对 Control
的外观比标准 BackColor
、ForeColor
等有更大的控制权。下面的代码已被简化以说明问题
[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();
}
}
我正在为 Windows 表单编写样式化的控件。我所说的样式化是指用户对 Control
的外观比标准 BackColor
、ForeColor
等有更大的控制权。下面的代码已被简化以说明问题
[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();
}
}