C# 在设计器中显示可浏览的子属性

C# 在设计器中显示可浏览的子属性,c#,properties,designer,children,componentmodel,C#,Properties,Designer,Children,Componentmodel,我将.NETC与标准WinForms一起使用,而不是WPF 我有这种情况。 我正在为月历创建一个用户控件,与.NET类似,但功能稍多。 我有一个用户控件表单,它填充了表示日期的按钮对象。 按钮可以根据其状态选择不同的颜色,鼠标悬停,周末 我希望它的工作方式是扩展button类以接受确定颜色的状态,而不是从父用户控件类为它们着色。目前有10种颜色,我真的不想把用户控制代码和颜色条件搞得一团糟 另外,我想在设计时选择所有的颜色,使用可浏览的设计器属性。 问题是设计器只显示在用户控件类中定义的属性,而

我将.NETC与标准WinForms一起使用,而不是WPF

我有这种情况。 我正在为月历创建一个用户控件,与.NET类似,但功能稍多。 我有一个用户控件表单,它填充了表示日期的按钮对象。 按钮可以根据其状态选择不同的颜色,鼠标悬停,周末

我希望它的工作方式是扩展button类以接受确定颜色的状态,而不是从父用户控件类为它们着色。目前有10种颜色,我真的不想把用户控制代码和颜色条件搞得一团糟

另外,我想在设计时选择所有的颜色,使用可浏览的设计器属性。 问题是设计器只显示在用户控件类中定义的属性,而不显示其子按钮

这个问题有解决办法吗?
简而言之,我想使用内部按钮属性更改颜色,并能够在设计时使用设计器属性选择它们,不要手动硬编码。

这里有各种各样的事情可以做——虽然这是一个糟糕的答案,但你可以在公共界面上公开有问题的控件——但我不确定这是一个好主意

就我个人而言,我只需重新公开我感兴趣的属性,也许可以将它们放入不同的[类别…]——确保同时具有setter和getter

有点像:

using System;
using System.ComponentModel;
using System.Drawing;
using System.Windows.Forms;

class MyControl : UserControl
{
    private Button button;
    private Label label;
    public MyControl()
    {
        button = new Button { Dock = DockStyle.Right, Text = "Click me" };
        label = new Label { Dock = DockStyle.Left};
        Controls.Add(button);
        Controls.Add(label);
    }
    [Category("Wonder Control")]
    public string CaptionText { get { return label.Text; } set { label.Text = value; } }
    [Category("Wonder Control")]
    public Color ButtonBackColor { get { return button.BackColor; } set { button.BackColor = value; } }
}
static class Program
{

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);

        using (Form form = new Form())
        using (MyControl ctrl = new MyControl())
        using (PropertyGrid grid = new PropertyGrid())
        {
            ctrl.ButtonBackColor = Color.Red;
            ctrl.CaptionText = "Caption";
            ctrl.Dock = DockStyle.Fill;
            grid.Dock = DockStyle.Right;
            form.Controls.Add(ctrl);
            form.Controls.Add(grid);
            grid.SelectedObject = ctrl;
            Application.Run(form);
        }

    }
}

对于要在设计器中可见的属性,它们必须是带有getter和setter的公共属性-从您所说的,这些属性只是getter。您也可以尝试在属性上指定和,以强制设计器显示它们…

好的,我将尝试解释代码:

例如,我有一个用户控件和一个按钮类。 我想公开按钮属性,并使它们在设计器中的MyControl属性中可见

class MyControl : UserControl
{
     private MyButton button;
     button.ChangeStyle("Selected");
}

class MyButton : Button
{
     private Color buttonColor;

     public void ChangeStyle(string styleName)
     {
          if (styleName == "Selected")
              this.BackColor = buttonColor;
     }

     [Browsable(true)]
     [Category("Button style")]
     public Color ButtonColor
     {
          get { return buttonColor; }
          set { buttonColor = value; }
     }
}
这是一个简单的例子。通常我有5种不同的风格,包括背景色和前景色。因此,我想在MyButton类中定义颜色,而不是在MyControl类中管理颜色。但这样的问题是MyButton类中的属性在designer中不可见,因为它只关注MyControl属性

顺便说一句,忽略代码示例中缺少的构造函数和其他基本类

我不能使用:

[Category("Wonder Control")]
public Color ButtonBackColor { get { return button.BackColor; } set { button.BackColor = value; }

因为我每个月有30个按钮,我不能只引用一个对象。

如果控件中的所有按钮都具有相同的外观,为什么不将属性置于控件级别,并让属性设置程序对所有按钮进行任何更改?另外,使用30个单独的按钮控件似乎需要很大的开销。。。您是否考虑过为天数绘制标签,并处理鼠标单击/悬停事件以确定何时单击某一天

您的子类外观的一些代码示例将有助于该子类是一个扩展Button类的简单类。根据大小、文本和位置,它有不同的构造函数。我希望所有颜色都是此类的属性。但当我将用户控件拖动到一个框架时,我想从用户控件父设计器属性窗口中选择它们;那是百万英里外吗?你说的重新曝光是什么意思?我可以使用[Category]在父类中公开它们。有没有办法只在子类中公开它们?这是当前的解决方案。我有颜色的控件属性,并将它们传播到按钮。我已经考虑过手动绘制所有内容,但我希望按钮是活动对象,而不仅仅是普通图形。我希望避免对整个用户控件进行命中测试以确定所选日期。也就是说,我不必在每次点击时重新绘制所有的日期,只需更改那些日期。你说的大量开销是什么意思?性能问题还是大量不必要的代码?我想手动创建button类,而不仅仅是继承button并实现我需要的功能