Правильный способ переопределить Control.ControlCollection - PullRequest
4 голосов
/ 23 февраля 2010

Я занялся созданием пользовательского виджета 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, чтобы заставить работать новый виджет.

Я знаю, что это длинный выстрел, но кто-нибудь добился успеха в этом?

Ответы [ 2 ]

1 голос
/ 26 февраля 2010

На протяжении всего моего исследования я не мог найти экземпляр, где можно было бы управлять UserControls без использования System.Windows.Forms.Control.ControlCollection из-за количества функций, предоставляемых назначением элемента управления для функции Add. Еще хуже было, когда я начал включать Дизайнера в уравнение. Поэтому я решил использовать свойство Controls с помощью пользовательского переопределения, которое я дал выше. Теперь мне нужно будет синхронизировать _tabPages моего частного уровня с Control Collection, а не наоборот.

0 голосов
/ 23 февраля 2010

Ну, вы можете использовать что-то вроде .net Reflector (декомпилятор), чтобы извлечь класс tabcontrol из .net и редактировать этот класс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...