2013-10-08 2 views
0

В приложениях на XAML довольно часто мне нужно манипулировать экранными элементами, изменять размер или перемещать вещи вокруг. Обычно ситуация возникает для очень настраиваемых элементов управления пользовательского интерфейса.Планирование задач пользовательского интерфейса после визуального дерева опустилось

Сроки загрузки материала и привязки данных и т. Д. Могут вызвать раздражающие моменты времени.

Традиционно мы с коллегами работали над этими проблемами путем «перераспределения» работы с потоком пользовательского интерфейса, поэтому он запускается позже, когда зависимые свойства находятся в «конечных» состояниях.

Есть ли лучший способ сделать это? Какие стратегии вы нашли, что работа?

Событие LayoutUpdated может быть очень шумным, мелкозернистым и отменять регистрацию, требует отклонения от Lambda для метода и, следовательно, не может получить доступ к закрытым переменным из внешней логики - это немного «кобыла».

Редактировать

Я дам ощутимый пример. Пользовательский элемент управления рисует контур вокруг лица при распознавании лица, поэтому мы говорим о совершенно обычном материале здесь, ничто из XAML не выходит из коробки.

Изображение должно быть масштабировано и размерно, а пути и геометрия масштабируются и масштабируются так, чтобы все было в порядке.

При программном изменении высот и ширины элементов воздействие не является немедленным, его только после того, как поток пользовательского интерфейса будет возвращен обратно в инфраструктуру XAML, подсистемы рендеринга перегруппируют все.

Таким образом, логика, зависящая от измененных значений, должна запускаться после того, как инфраструктура переделала все, и поэтому эта работа нуждается в планировании позже в потоке пользовательского интерфейса, следовательно, прибегая к отправке. Пахнет.

Многие события и виртуальные вызовы вызываются в моменты, когда требуемые данные еще недоступны. Иногда работа должна выполняться при поступлении данных (например, уведомление об изменении свойств), которое обычно не запускает события компоновки XAML. В этом случае мы прибегаем к диспетчерским хакам.

ответ

0

Что об использовании Loaded события ?:

Loaded += LoadedHandler; 

... 

private void LoadedHandler(object sender, RoutedEventArgs e) 
{ 
    // Do something here when controls have loaded 
} 
+0

Привет, Шеридан, спасибо за ваш ответ. Я добавил несколько подробностей, чтобы проиллюстрировать более сложные и тонкие обстоятельства, при которых требуются «диспетчерские хаки». –

+0

Я немного смущен своим ответом. :) Это для меня слишком много, но единственное, что я могу предложить, это посмотреть на [WPF Control Development Unleashed] (http://www.adorkable.us/books/wpf_control_development.pdf) книга. В главе 12 может быть что-то, что может помочь ... немного длинного выстрела. Это хорошая книга, так что, возможно, стоит посмотреть. – Sheridan

+0

Пожалуйста, не стесняйтесь, вы пытались помочь, а событие «Loaded» - отличное место для того, чтобы что-то делать. Я был неясно в своем вопросе. –

0

Я обнаружил, что в WPF, эта зависимость аргумент метаданных свойства существует, чтобы помочь с проблемами я говорю.

FrameworkPropertyMetadataOptions.AffectsRender 

Перечисление не существует в приложениях Windows Store, по-видимому, так как его дизайнеры думают метод InvalidateArrange является подходящей альтернативой.

Возможно, нам необходимо: a) аннулировать соглашение в наших обработчиках изменений DP; b) сделать эти соглашения на нескольких проходах; c) допускать неправильный макет между проходами.

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

 Смежные вопросы

  • Нет связанных вопросов^_^