Я занялся созданием пользовательского виджета 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 и т. Д., Которые изменяют базовый массив, но не массив tabPages.
Я хотел бы иметь возможность устранить необходимость использования новым классом ControlCollection базового класса для регистрации новых объектов xTabPage с помощью xTabControl.
Я уже прошел через структуру классов с .Net Reflector. Я надеюсь, что не нужно будет копировать половину класса Control, чтобы заставить работать новый виджет.
Я знаю, что это длинный выстрел, но кто-нибудь добился успеха в этом?