Как обновить макет всякий раз, когда элемент управления изменяет высоту в Winforms? - PullRequest
0 голосов
/ 14 января 2010

У меня есть собственный LayoutEngine, и он правильно обрабатывает макет. Однако я хочу, чтобы макет обновлялся (вызывался снова), если какой-либо элемент управления изменяет высоту.

Возможно ли это? Если да, то как и где я должен это сделать? Внутри управления, или макет двигателя? Желательно, чтобы я не хотел, чтобы этот код дублировался, где бы я ни использовал этот макет.

Так что, если я смогу инкапсулировать это в контроле или в Layoutengine, это было бы хорошо.

1 Ответ

1 голос
/ 15 января 2010

В контейнере элемента управления или макета:

  1. определяет Dictionary<Control,int>, который будет содержать текущую переменную высоты для каждого интересующего элемента управления.

В первоначальном макете:

  1. рекурсивно через средства управления процентами (если они вложены) или

  2. итерация по интересующим элементам управления (если не вложенный)

... использовать "стандартную" итерацию или рекурсию, рекурсию Linq или "итерацию" Linq ...:

... когда вы повторяете или повторяете, делаете запись в Словаре для каждого элемента управления с его текущей высотой ...

... прикрепить обработчик SizeChanged к каждому интересующему элементу управления, который вызывает один и тот же метод в вашем классе Layout Engine (возможно, статический метод?): Для ясности: давайте назовем его «Код отправки события . "

В вашем коде отправки событий для всех интересующих элементов управления теперь вызывается событием SizeChanged на любом из ваших "отслеживаемых" элементов управления:

  1. выполнить поиск по словарю, используя элемент управления в качестве ключа: получить значение свойства Height и сравнить с текущим значением высоты элемента управления:

  2. при условии, что свойство Высота изменилось:

а. вызовите свой Layout Engine, чтобы «сделать свое дело».

б. обновите Dictinary значение для высоты для этого элемента управления.

Примечание: поскольку событие SizeChanged будет вызываться с объектом «отправитель как»: вам нужно привести его к типу Control, прежде чем получить доступ к его свойству «Высота».

Вот "грубый набросок" того, как может выглядеть ваш код:

// note : untested code : use caution ... test rigorously ...

// stub for the Dictionary of monitored Controls
private Dictionary<Control, int> LayoutManager_MonitoredControls = new Dictionary<Control, int>();

// the SizeChanged Event Handler you "install" for all Controls you wish to monitor
private void LayoutManager_SizeChanged(object sender, EventArgs e)
{
    Control theControl = sender as Control;

    int cHeight = theControl.Height;

    if (LayoutManager_MonitoredControls[theControl] != theControl.Height);
    {
        // update the Dictionary
        LayoutManager_MonitoredControls[theControl] = cHeight;

        // call your code to update the Layout here ...
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...