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

问题描述:

我使用.NET C#与标准的WinForms,而不是WPF。C#在设计器中显示可浏览的子属性

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

我喜欢它的工作方式是将按钮类扩展为接受状态,而不是从父级(用户控件)类着色它们。目前有10种颜色,我真的不想用颜色条件搞乱用户控制代码。

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

有没有解决这个问题的方法?因此,为了简短起见,我想使用内部按钮属性更改颜色,并能够在设计时使用设计器属性选择它们,而不是手动对其进行硬编码。

+0

子类的一些代码示例有助于 – thecoop 2009-11-13 11:53:20

+0

子类是一个扩展了Button类的简单类。它有各种构造函数,取决于大小,文本和位置。像所有的颜色一样,这个类是属性。但是当我将用户控件拖到一个框架上时,我想从用户控件(父级)设计器属性窗口中选择它们。 – 2009-11-13 12:20:58

+0

新增示例;那是几百万英里吗? – 2009-11-13 12:41:52

你可以在这里做各种各样的事情 - 你可以(虽然它是一个不好的答案)公开接口上的控件 - 但我不确定这是一个好主意。

就我个人而言,我只是重新公开我感兴趣的属性,或许将它们放入不同的[Category(...)]--确保同时拥有setter和getters。

如A位:

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); 
     } 

    } 
} 
+0

你是什么意思再曝光? 我可以用[类别]在父类中公开它们。 有没有什么办法可以让他们只在孩子课上? – 2009-11-13 12:40:04

对于一个特性,在设计可见的,它们必须与一个getter和setter的公共属性 - 从你说的话,该属性仅干将。您也可以尝试在属性来指定BrowsableAttributeBindableAttribute强迫设计师展示他们...

好吧,我会尽力解释低谷代码:

例如,我有一个用户控制和按钮类。 我想暴露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; } 
    } 
} 

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

Btw。忽略代码示例缺少的构造函数和其他基本类的东西

我不能使用:

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

,因为我有30个按钮MyControl(每月的天数),我不能只是参考一个单一的对象。

如果控件中的所有按钮将共享相同的外观,为什么不将该属性置于控件级别并让属性设置器传播对所有按钮的更改?此外,使用30个单独的按钮控件似乎有很多开销......您是否考虑过绘制当天的标签并处理鼠标单击/悬停事件以确定某个特定日期何时点击?

+0

这是目前的解决方案。 我有颜色的控制属性并将它们传播到按钮。 我已经考虑手动绘制一切,但我希望按钮是活动对象,而不仅仅是纯图形。我想避免命中测试整个用户控件以确定选定的日期。 也是这样,我不需要重新绘制每次点击的所有日期,只是那些已被更改的日期。 – 2009-11-13 14:15:51

+0

“很多开销”是什么意思?性能问题还是很多不必要的代码?我正在考虑手动创建按钮类,而不仅仅是从Button继承并实现我需要的功能 – 2009-11-13 14:17:34