C# 覆盖Control.ControlCollection的正确方法

C# 覆盖Control.ControlCollection的正确方法,c#,winforms,user-controls,C#,Winforms,User Controls,我开始创建一个定制的TabControl小部件,这样我就可以在选项卡的右边缘精确地绘制带有闭合X的选项卡。我有一个保存所有选项卡的自定义数组类 因此,我重写CreateControlsInstance实例类并重新定义控件类,以便在反射序列化期间隐藏它 protected override Control.ControlCollection CreateControlsInstance() { return new ControlCollection( this ); } [Browsabl

我开始创建一个定制的TabControl小部件,这样我就可以在选项卡的右边缘精确地绘制带有闭合X的选项卡。我有一个保存所有选项卡的自定义数组类

因此,我重写CreateControlsInstance实例类并重新定义控件类,以便在反射序列化期间隐藏它

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等,这会更改基础arraylist,但不会更改tabPages数组

我希望能够消除新的ControlCollection类必须使用基类向xTabControl注册新的xTabPage对象的需要

我已经用.Net Reflector完成了课程结构。我希望不必复制控制类的一半,就可以注册新的小部件


我知道这很难实现,但有人成功过吗?

你可以使用类似.net Reflector(反编译)的东西从.net中提取tabcontrol类并编辑该类。

在我的研究过程中,我找不到一个不使用System.Windows.Forms.Control.ControlCollection就可以管理UserControls的实例,因为将控件分配给Add函数提供了大量函数。更糟糕的是,当我开始将设计师纳入方程式时。因此,我决定使用上面给出的自定义覆盖来接受控件属性。现在,我需要将我的私有级选项卡页面与控件集合保持同步,而不是相反。

我已经使用.net Reflector完成了选项卡控件、选项卡页面和控件类。我之所以必须构建一个自定义选项卡控件类,是因为现有的tabcontrol仍然无法正确地为选项卡绘制闭合X所需的额外空间。与组合框或列表框不同,没有OnDrawItem可替代以自定义选项卡的真实宽度。@jdmx:但有一个属性“DrawMode”,您可以将其设置为“OwnerDrawFixed”和“handle”DrawItem“活动以进行自定义绘制。当然有一个OnDrawItem可以重写。我已经花了时间创建了一个新的TabControl,它比Windows TabControl有更多的功能。我现在寻找的是一种完全不需要使用Control.ControlCollection将tabpage面板注册到tabcontrol的方法,而是使用我创建的tabcontrol.ControlCollection。我放弃了定制WinForms标准tabcontrol(现在使用第三方控件),原因很多:无法控制选项卡大小等,但以下是一些相关资源:。。。在这些代码项目文章的评论中,您会发现其他链接和许多问题。祝你好运