正确的方法来覆盖Control.ControlCollection

时间:2010-02-23 01:04:02

标签: c# winforms user-controls

我开始创建一个自定义的TabControl小部件,以便我可以在选项卡的右边缘用一个关闭的X准确地绘制选项卡。我有一个包含所有选项卡的自定义数组类。

因此,我重写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();
  }
}

目前这有效但是如果Controls类仍然可以调用方法SetChildIndex等,它们会更改底层的arraylist但不会更改tabPages数组。

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

我已经使用.Net Reflector完成了类结构。我希望不必复制Control类的一半,以便让新小部件的注册工作。

我知道这是一个很长的镜头,但有人在这方面取得了成功吗?

2 个答案:

答案 0 :(得分:1)

在我对此的研究中,我找不到一个可以在不使用System.Windows.Forms.Control.ControlCollection的情况下管理UserControls的实例,因为为Add函数提供了Control的赋值功能。当我开始将Designer纳入等式时,情况更糟。所以我决定使用我上面给出的自定义覆盖来包含Controls属性。我现在需要保持我的私人级别_tabPages与Control Collection同步,而不是相反。

答案 1 :(得分:0)

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