2009-11-13 65 views
2

我使用.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

回答

1

你可以在這裏做各種各樣的事情 - 你可以(雖然它是一個不好的答案)公開接口上的控件 - 但我不確定這是一個好主意。

就我個人而言,我只是重新公開我感興趣的屬性,或許將它們放入不同的[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

2

對於一個特性,在設計可見的,它們必須與一個getter和setter的公共屬性 - 從你說的話,該屬性僅干將。您也可以嘗試在屬性來指定BrowsableAttributeBindableAttribute強迫設計師展示他們...

3

好吧,我會盡力解釋低谷代碼:

例如,我有一個用戶控制和按鈕類。 我想暴露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(每月的天數),我不能只是參考一個單一的對象。

0

如果控件中的所有按鈕將共享相同的外觀,爲什麼不將該屬性置於控件級別並讓屬性設置器傳播對所有按鈕的更改?此外,使用30個單獨的按鈕控件似乎有很多開銷......您是否考慮過繪製當天的標籤並處理鼠標單擊/懸停事件以確定某個特定日期何時點擊?

+0

這是目前的解決方案。 我有顏色的控制屬性並將它們傳播到按鈕。 我已經考慮手動繪製一切,但我希望按鈕是活動對象,而不僅僅是純圖形。我想避免命中測試整個用戶控件以確定選定的日期。 也是這樣,我不需要重新繪製每次點擊的所有日期,只是那些已被更改的日期。 – 2009-11-13 14:15:51

+0

「很多開銷」是什麼意思?性能問題還是很多不必要的代碼?我正在考慮手動創建按鈕類,而不僅僅是從Button繼承並實現我需要的功能 – 2009-11-13 14:17:34

相關問題