2010-02-23 4 views
4

Я начал создавать пользовательский виджет TabControl, чтобы я мог точно рисовать вкладку с закрытым X на правом краю вкладки. У меня есть собственный класс массива, который содержит все вкладки.Правильный способ переопределить Control.ControlCollection

Поэтому я переопределяю класс экземпляра 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(); 
    } 
} 

В настоящее время это работает, но если класс управления все еще может вызывать методы SetChildIndex, и т.д., который изменяет основной ArrayList, но не массив tabPages.

Я хочу, чтобы исключить необходимость использования нового класса ControlCollection для использования базового класса для регистрации новых объектов xTabPage с помощью xTabControl.

Я уже прошел через структуру классов с .Net Reflector. Я надеюсь, что вам не придется копировать половину класса Control, чтобы получить регистрацию нового виджета для работы.

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

+0

Я отказался от настройки стандартного WinCorms TabControl (теперь использую сторонний элемент управления) по многим причинам: невозможность контролировать размер вкладок и т. Д. Но вот некоторые ресурсы, которые могут иметь значение: http: // dotnetrix. co.uk/tabcontrol.htm ... http://www.codeproject.com/KB/dotnet/CustomTabControl.aspx ... http://www.codeproject.com/KB/tabs/flattabcontrol.aspx ... В комментариях к статьям Code Project вы найдете другие ссылки и множество вопросов. Удачи ! – BillW

ответ

1

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

0

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

+0

Я прошел через tabcontrol, tabpage и классы управления с помощью .net Reflector. Я полагаю, что мне нужно создать собственный класс управления вкладками, потому что существующий tabcontrol по-прежнему не будет правильно рисовать вкладку с дополнительным пространством, необходимым для закрытия X. В отличие от поля комбо или списка, OnDrawItem не переопределяет для настройки true ширину вкладки. – JDMX

+0

@jdmx: но есть свойство «DrawMode», которое вы можете установить в «OwnerDrawFixed» и обработать событие «DrawItem», чтобы сделать свою собственную картину. Конечно, есть OnDrawItem, который вы можете переопределить. –

+0

Я уже потратил время на создание нового TabControl, который имеет больше возможностей, чем Windows TabControl. Теперь я ищу способ полностью исключить необходимость использования Control.ControlCollection для регистрации панелей вкладки в tabcontrol и вместо этого использовать созданный TabControl.ControlCollection. – JDMX

Смежные вопросы