在设计时枚举属性的结构和类

时间:2010-06-30 14:01:45

标签: c# .net properties

如何在设计时编写自己的可用作属性的结构?我需要能够指定一个默认值,并且有一个可选择的预定义结构列表供设计人员选择,其方式与实现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
        };
    }
}

2 个答案:

答案 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。