代码之家  ›  专栏  ›  技术社区  ›  dlras2

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

  •  1
  • dlras2  · 技术社区  · 14 年前

    如何编写可在设计期间用作属性的自己的结构?我需要能够指定一个默认值,并有一个可供设计师选择的预定义结构的可选列表,这与实现颜色属性的方式非常相似。

    此外,我怎样才能像字体那样处理类呢?如何在属性窗口中指定子属性?


    我正在编写一个自定义控件,它具有许多不同的可视类型元素,如渐变颜色、宽度、百分比等。我希望这些元素都是可自定义的,但也可以用不同的 Styles . 我可以在运行时通过 Style 结构属性并使其更改setter中的所有其他属性。我希望用户在设计时能够选择预定义的 风格 例如“浅蓝色”、“深灰色”等,如果我可以让所有的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 回复  |  直到 14 年前
        1
  •  1
  •   Hans Passant    14 年前

    结构在PropertyGrid中很难处理,因为它们是值类型。分配结构的字段或属性没有效果,需要分配整个结构值。

    注意字体是怎样的一个类,在网格中设置单独的字体属性不是问题。字体有一个类型转换器(System.Drawing.FontConverter),它接受一个字符串并将其转换为字体。这就是为什么您可以直接编辑字体值,而不必展开节点和编辑单个属性。它还有一个uitypeeditor,system.drawing.design.fonteditor,当您单击带有圆点的按钮时,它会显示对话框。

    如果要使用从预定义样式中选择样式,则可能需要为属性执行此操作。结构的uitypeeditor的一个好例子是system.drawing.design.coloreditor,使用reflector查看类。为了只公开需要类型转换器的属性,结构类型的一个好例子是System.Drawing.PointConverter。

        2
  •  1
  •   SLaks    14 年前

    如果有非简单类型的属性,则“属性”窗口将自动显示一个加号按钮以展开实例。

    要提供自定义下拉列表,需要 write a UITypeEditor .