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

Zor*_*vic 4 c# children designer properties componentmodel

我使用的是带有标准WinForms的.NET C#,而不是WPF。

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

我希望它的工作方式是将按钮类扩展为接受确定颜色的状态,而不是从父类(用户控件)为它们着色。目前有10种颜色,我真的不想将用户控制代码与着色条件弄混。

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

有没有解决此问题的方法?简而言之,我想使用内部按钮属性来更改颜色,并希望能够在设计时使用设计器属性来选择颜色,而不是手动对其进行硬编码。

Zor*_*vic 5

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

例如,我有一个用户控件和一个按钮类。我想公开Button属性,并使它们在设计器的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; }
     }
}
Run Code Online (Sandbox Code Playgroud)

这是一个简单的例子。通常,我有5种不同的样式,包括每种样式的背景色和前景色。因此,我不想在MyControl类中管理颜色,而是在MyButton类中定义它们。但是这样的问题是MyButton类中的属性在设计器中不可见,因为它仅关注MyControl属性。

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

我不能使用:

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

因为我在MyControl中有30个按钮(每月的天数),所以我不能仅引用一个对象。