2010-02-23 148 views
4

我開始創建一個自定義的TabControl小部件,這樣我就可以在選項卡的右邊緣使用關閉X精確地繪製選項卡。我有一個自定義數組類,它包含所有的選項卡。正確的方法來覆蓋Control.ControlCollection

所以我重寫CreateControlsInstance實例類並重新定義Controls類,以便在反射序列化過程中隱藏它。

protected override Control.ControlCollection CreateControlsInstance() { 
    return new ControlCollection(this); 
} 

[Browsable(false), DesignerSerializationVisibility(DesignerSerializationVisibility.Hidden)] 
private new Control.ControlCollection Controls { 
    get { return base.Controls; } 
} 

然後我創建覆蓋類。

public new class ControlCollection: Control.ControlCollection { 
    private xTabControl owner; 

    public ControlCollection(xTabControl owner): base(owner) { 
    this.owner = owner; 
    } 

    public override void Add(Control value) { 
    if (!(value is xTabPage)) 
     throw new Exception("The control must be of type xTabPage"); 

    xTabPage tabPage = (xTabPage)value; 

    if (!owner.inTabEvent) 
     owner._tabPages.Add(tabPage); 

    base.Add(value); 
    } 

    public override void Remove(Control value) { 
    if (!(value is xTabPage)) 
     throw new Exception("The control must be of type JDMX.Widget.xTabPage"); 

    if (!owner.inTabEvent) { 
     xTabPage tabPage = (xTabPage)value; 
     owner._tabPages.Remove(tabPage); 
    } 

    base.Remove(value); 
    } 

    public override void Clear() { 
    owner._tabPages.Clear(); 
    } 
} 

目前這個工作,但如果控件類仍然可以調用方法SetChildIndex,等這改變了底層數組列表,但不是的TabPages陣列。

我希望能夠消除新的ControlCollection類必須使用基類來註冊xTabControl對象的新xTabPage對象。

我已經通過.Net反射器的類結構。我希望不必複製Control類的一半,以便讓新小部件的註冊工作。

我知道這是一個遠投,但有沒有人有這樣做的成功?

+0

我放棄了自定義WinForms標準TabControl(現在使用第三方控件),原因很多:無法控制標籤大小等。但是這裏有一些可能相關的資源:http:// dotnetrix。 co.uk/tabcontrol.htm ... http://www.codeproject.com/KB/dotnet/CustomTabControl.aspx ... http://www.codeproject.com/KB/tabs/flattabcontrol.aspx ...在對這些代碼項目文章的評論中,您會發現其他鏈接和許多問題。祝你好運 ! – BillW 2010-02-23 03:30:21

回答

1

在整個研究過程中,我無法找到UserControl可以在不使用System.Windows.Forms.Control.ControlCollection的情況下進行管理的實例,因爲Add函數提供了一個Control的賦值函數。當我開始將設計師納入等式時,情況更糟。所以我決定使用上面給出的自定義覆蓋來擁抱Controls屬性。我現在需要保持我的私有級別_tabPages與Control Collection同步,而不是相反。

0

那麼你可以使用.net反射器(解壓)從.net提取tabcontrol類並編輯該類。

+0

我已經通過.net反射器完成了tabcontrol,tabpage和控件類。我的理由是我必須構建一個自定義選項卡控件類,因爲現有的選項卡控件仍然不會正確地繪製具有關閉X所需的額外空間的選項卡。與組合或列表框不同,沒有OnDrawItem可以覆蓋以自定義true標籤的寬度。 – JDMX 2010-02-23 02:37:41

+0

@jdmx:但有一個屬性「DrawMode」,您可以將其設置爲「OwnerDrawFixed」並處理「DrawItem」事件來執行您的自定義繪畫。當然,您可以覆蓋一個OnDrawItem。 – 2010-02-23 05:15:42

+0

我已經花時間創建了一個新的TabControl,它具有比Windows TabControl更多的功能。我正在尋找的是一種完全消除使用Control.ControlCollection將tabpage面板註冊到tabcontrol的需求的方法,而是使用我創建的TabControl.ControlCollection。 – JDMX 2010-02-23 14:55:17