如何在设计时编写自己的可用作属性的结构?我需要能够指定一个默认值,并且有一个可选择的预定义结构列表供设计人员选择,其方式与实现Color属性的方式非常相似。
此外,我如何使用像Font这样的类来做到这一点?如何在属性窗口中指定子属性?
我正在编写一个自定义控件,它有很多不同的可视类型元素,例如渐变颜色,宽度,百分比等。我希望这些都可以自定义,但也可以设置为全部一次使用不同的Styles
。我可以在运行时通过创建Style
struct属性并让它更改setter中的所有其他属性来执行此操作。我希望用户在设计时能够选择预定义的Styles
,例如“浅蓝色”,“深灰色”等,每个用户都会设置所有其他UI属性(渐变等。)如果我可以将所有UI属性显示在“样式”属性下,很像“粗体”和“斜体”出现在“字体”下,这将是理想的。
代码:
[Designer("System.Windows.Forms.Design.ParentControlDesigner, System.Design", typeof(IDesigner))]
public partial class GradientPanel : UserControl
{
public PanelStyle Style
{
get
{
return new PanelStyle()
{
BackgroundFade = this.BackgroundFade,
EdgeColor = this.EdgeColor,
BorderColor = this.BorderColor,
EdgeWidth = this.EdgeWidth,
LowerColor = this.LowerColor,
UpperColor = this.UpperColor
};
}
set
{
this.SuspendLayout();
this.BackgroundFade = value.BackgroundFade;
this.EdgeColor = value.EdgeColor;
this.BorderColor = value.BorderColor;
this.EdgeWidth = value.EdgeWidth;
this.LowerColor = value.LowerColor;
this.UpperColor = value.UpperColor;
this.ResumeLayout();
}
}
....
public struct PanelStyle
{
public float BackgroundFade;
public Color EdgeColor;
public int EdgeWidth;
public Color BorderColor;
public Color UpperColor;
public Color LowerColor;
public static PanelStyle System = new PanelStyle()
{
BackgroundFade = .7f,
EdgeColor = SystemColors.Window,
BorderColor = SystemColors.WindowFrame,
EdgeWidth = 6,
LowerColor = SystemColors.Control,
UpperColor = SystemColors.Window
};
}
}
答案 0 :(得分:1)
如果您拥有非简单类型的属性,“属性”窗口将自动显示“加号”按钮以展开实例。
要提供自定义下拉列表,您需要write a UITypeEditor。
答案 1 :(得分:1)
在PropertyGrid中很难处理结构,因为它们是值类型。分配结构的字段或属性无效,需要分配整个结构值。
注意Font是一个类,在网格中设置单个Font属性不是问题。 Font有一个TypeConverter(System.Drawing.FontConverter),它接受一个字符串并将其转换为Font。这就是您可以直接编辑Font值而不必扩展节点和编辑单个属性的原因。它还有一个UITypeEditor,System.Drawing.Design.FontEditor,当你点击带点的按钮时会出现对话框。
如果您想使用从预定义样式中挑选,那么您可能需要为您的属性做些什么。结构的UITypeEditor的一个很好的例子是System.Drawing.Design.ColorEditor,使用Reflector来查看该类。要公开属性,你需要一个TypeConverter,一个结构类型的好例子是System.Drawing.PointConverter。