【问题标题】:Enumerating Structs and Classes for Properties at Design Time在设计时枚举属性的结构和类
【发布时间】:2011-03-10 03:54:56
【问题描述】:

如何编写自己的结构,在设计时用作属性?我需要能够指定一个默认值,并有一个可供设计人员从中选择的预定义结构的可选列表,这与实现 Color 属性的方式大致相同。

此外,我怎样才能像 Font 那样对类做到这一点?如何在属性窗口中指定子属性?


我正在编写一个自定义控件,它具有许多不同的视觉类型元素,例如渐变色、宽度、百分比等。我希望这些都可以自定义,但也可以全部设置为一次与不同的Styles。我可以在运行时通过创建Style 结构属性并让它更改设置器中的所有其他属性来做到这一点。我希望用户在设计时能够选择预定义的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
        };
    }
}

【问题讨论】:

  • 你能发布一些你希望你的代码如何处理这些结构的例子吗?
  • 对于所有这些设计时的东西,我用过的最好的书是sellsbrothers.com/writing/wfbook,毫无疑问。很多关于如何做到这一点的说明,我无法在其他任何地方找到信息。自从我从事此类工作以来已经太久了,无法提供更好的建议。而且我记得发现它非常令人沮丧,即使有很多资源。

标签: c# .net properties


【解决方案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。

【讨论】:

    【解决方案2】:

    如果你有一个非简单类型的属性,属性窗口会自动显示一个加号按钮来展开实例。

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

    【讨论】:

    • 上面的代码显示Style: Sai.Phone.Client.GradientPanel+PanelStyle,但是它被禁用了,并且没有加号按钮。
    猜你喜欢
    • 1970-01-01
    • 2016-11-26
    • 2020-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多