2010-02-23 110 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