[WinForms] свой LayoutEngine - затык
От: Baiker  
Дата: 12.11.24 00:52
Оценка:
Ребят, помогите плиз с одной хитрой проблемой.
Пишу на WinForms свой layout (скажем, типа Docking). Т.е. у нас есть сам контрол DockingPanel и сателлит DockingLayoutEngine (где есть Layout(), который и делает всю работу).
При добавлении контрола на DockingPanel важно, в какую часть DockingPanel его изначально положили (кликнули).
Т.е. если взяли лэйбл с тулбара и кликнули мышой в правую часть DockingPanel, лэйбл должен "прилипнуть" к правой стороне.

Подводка: после кидания контрола на контейнер, мой DockingLayoutEngine.Layout() вызывается аж 5 раз, причём первые 3 раза координаты дочернего контрола нулевые (но у контрола есть дефолтовые W & H),
а последние 2 вызова — координаты и размер выставлены как положено (по координатам, где я кликнул).

Проблема: внутри Layout() мне нужно обрабатывать дочерний контрол только после того, как у него инициализированы X-Y-W-H!
Но я не знаю, какой из вызовов Layout() "последний", вот в чём беда! Они практически идентичны (смотрел по свойствам контрола и по LayoutEventArgs.AffectedProperty).

Если реагировать в событии самого DockingPanel.OnControlAdded, то событие вызывается слишком рано — практически сразу после первого
вызова Layout().

Не уверен, что вы поняли, но кто своё писал, тот усёк. Попробую другими словами: мы кинули контрол на контейнер и мне надо понять, когда дизайнер
закончил инициализировать контрол и я могу играть с его(контрола) координатами.

Проблема очень специфичная (и наверняка у неё очень простое решение, но из "женской логики MS"), гугл бессильно накидал мне просто фсякой фигни,
где даже близко к этой теме не подходили. Так что вот, прошу форум помочь. Заранее спасибо!

(у меня есть книжки по WinForms, но там тоже такие глубинные вещи не касались)
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.