В приложениях на XAML довольно часто мне нужно манипулировать экранными элементами, изменять размер или перемещать вещи вокруг. Обычно ситуация возникает для очень настраиваемых элементов управления пользовательского интерфейса.Планирование задач пользовательского интерфейса после визуального дерева опустилось
Сроки загрузки материала и привязки данных и т. Д. Могут вызвать раздражающие моменты времени.
Традиционно мы с коллегами работали над этими проблемами путем «перераспределения» работы с потоком пользовательского интерфейса, поэтому он запускается позже, когда зависимые свойства находятся в «конечных» состояниях.
Есть ли лучший способ сделать это? Какие стратегии вы нашли, что работа?
Событие LayoutUpdated может быть очень шумным, мелкозернистым и отменять регистрацию, требует отклонения от Lambda для метода и, следовательно, не может получить доступ к закрытым переменным из внешней логики - это немного «кобыла».
Редактировать
Я дам ощутимый пример. Пользовательский элемент управления рисует контур вокруг лица при распознавании лица, поэтому мы говорим о совершенно обычном материале здесь, ничто из XAML не выходит из коробки.
Изображение должно быть масштабировано и размерно, а пути и геометрия масштабируются и масштабируются так, чтобы все было в порядке.
При программном изменении высот и ширины элементов воздействие не является немедленным, его только после того, как поток пользовательского интерфейса будет возвращен обратно в инфраструктуру XAML, подсистемы рендеринга перегруппируют все.
Таким образом, логика, зависящая от измененных значений, должна запускаться после того, как инфраструктура переделала все, и поэтому эта работа нуждается в планировании позже в потоке пользовательского интерфейса, следовательно, прибегая к отправке. Пахнет.
Многие события и виртуальные вызовы вызываются в моменты, когда требуемые данные еще недоступны. Иногда работа должна выполняться при поступлении данных (например, уведомление об изменении свойств), которое обычно не запускает события компоновки XAML. В этом случае мы прибегаем к диспетчерским хакам.
Привет, Шеридан, спасибо за ваш ответ. Я добавил несколько подробностей, чтобы проиллюстрировать более сложные и тонкие обстоятельства, при которых требуются «диспетчерские хаки». –
Я немного смущен своим ответом. :) Это для меня слишком много, но единственное, что я могу предложить, это посмотреть на [WPF Control Development Unleashed] (http://www.adorkable.us/books/wpf_control_development.pdf) книга. В главе 12 может быть что-то, что может помочь ... немного длинного выстрела. Это хорошая книга, так что, возможно, стоит посмотреть. – Sheridan
Пожалуйста, не стесняйтесь, вы пытались помочь, а событие «Loaded» - отличное место для того, чтобы что-то делать. Я был неясно в своем вопросе. –