我正在为Windows Forms编写一个可控制的控件。通过styable我的意思是用户可以更好地控制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
实例的所有属性。我也可以更改值,但是在构建/运行项目的那一刻,我分配给属性的值消失了。为了保留在设计时指定的属性值,我的代码需要什么?
答案 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();
}
}