В контейнере элемента управления или макета:
- определяет
Dictionary<Control,int>
, который будет содержать текущую переменную высоты для каждого интересующего элемента управления.
В первоначальном макете:
рекурсивно через средства управления процентами (если они вложены) или
итерация по интересующим элементам управления (если не вложенный)
... использовать "стандартную" итерацию или рекурсию, рекурсию Linq или "итерацию" Linq ...:
... когда вы повторяете или повторяете, делаете запись в Словаре для каждого элемента управления с его текущей высотой ...
... прикрепить обработчик SizeChanged к каждому интересующему элементу управления, который вызывает один и тот же метод в вашем классе Layout Engine (возможно, статический метод?): Для ясности: давайте назовем его «Код отправки события . "
В вашем коде отправки событий для всех интересующих элементов управления теперь вызывается событием SizeChanged на любом из ваших "отслеживаемых" элементов управления:
выполнить поиск по словарю, используя элемент управления в качестве ключа: получить значение свойства Height и сравнить с текущим значением высоты элемента управления:
при условии, что свойство Высота изменилось:
а. вызовите свой 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 ...
}
}