我开始创建一个自定义的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类的一半,以便让新小部件的注册工作。
我知道这是一个很长的镜头,但有人在这方面取得了成功吗?
答案 0 :(得分:1)
在我对此的研究中,我找不到一个可以在不使用System.Windows.Forms.Control.ControlCollection的情况下管理UserControls的实例,因为为Add函数提供了Control的赋值功能。当我开始将Designer纳入等式时,情况更糟。所以我决定使用我上面给出的自定义覆盖来包含Controls属性。我现在需要保持我的私人级别_tabPages与Control Collection同步,而不是相反。
答案 1 :(得分:0)
你可以使用类似.net Reflector(decomplier)的东西从.net中提取tabcontrol类并编辑该类。