Как вы изменяете элемент управления, который был заново связан с TabPage? - PullRequest
1 голос
/ 10 марта 2010

У меня есть пользовательский элемент управления, который содержит коллекцию элементов управления для повторного использования для представления данных в пользовательском интерфейсе. Я попытался реализовать опцию «всплывающего», которая переопределит элемент управления из другого контейнера в форме (например, Panel), создаст новую вкладку и добавит элемент управления на вкладку. 1001 *

К сожалению, когда элемент управления добавляется в TabPage, его размер кажется заблокированным так, как он был представлен с последним родителем.

Я переопределил событие ParentChanged, чтобы определить, когда элемент управления был фактически добавлен в TabPage. Если я проверяю размер, попробуйте установить размер для ClientRectangle TabPage, а затем пересмотрите размер - он не меняется. Установка свойства Dock не меняет это поведение (особенно Fill).

protected override void OnParentChanged(EventArgs e)
{
    if (this.Parent != null)
    {
        Size oldSize = this.Size;

        this.Size = this.Parent.ClientRectangle.Size;

        if (this.Size == oldSize)
        {
            // this is where we end up
            throw new Exception("We didn't change size!");
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 10 марта 2010

Элемент управления был впервые добавлен в элемент управления контейнера. Погружаясь в недра кода Контейнера, через Reflector, он устанавливал минимальные / максимальные значения размера для моего элемента управления, который был перерисован. Я предположил, неточно, что настройки по умолчанию мин / макс были оставлены по умолчанию от дизайнера. Контейнерный контроль, к сожалению, решил иначе. Иди, иди, отражатель! Такое поведение, конечно, не было задокументировано.

Спасибо всем за помощь.

0 голосов
/ 10 марта 2010

Я подозреваю, что если вы установили элемент управления на Dock, он, вероятно, будет игнорировать попытки изменить его размер / положение. Лично я бы отключил режим Dock / Anchor / AutoSize и просто установил позицию и размер элемента управления вручную. Я много делал такого рода вещи, и у меня никогда не было проблем, поэтому я подозреваю, что вы просто боретесь с опцией автоматического макета, и она выигрывает.

Если вы хотите, чтобы Dock сделал всю работу за вас, вам, возможно, придется нажать на вкладку, чтобы инициировать пересчет его макета? (есть объект Control.LayoutEngine, который может сделать это, но я просто постулирую возможный путь исследования здесь - я сам не пробовал)

Я надеюсь, что это может дать вам некоторые идеи, в любом случае ...

...