Задержка рендеринга пользовательского элемента управления в WPF - PullRequest
3 голосов
/ 17 февраля 2010

У меня есть пользовательский элемент управления WPF, который иногда требуется для визуализации в некоторых сложных сценариях. Мне бы хотелось, чтобы мой пользовательский элемент управления отображал изображение заполнителя (например, «Пожалуйста, подождите - рендеринг!»), А затем фактически отображал элемент управления во время простоя (после обработки ввода).

Я думаю о том, чтобы изменить свой пользовательский элемент управления для хранения родительской сетки и двух дочерних элементов: A) изображение-заполнитель и B) фактическое содержимое. По умолчанию A) виден, и когда видимость пользовательского элемента управления изменяется, я могу BeginInvoke делегат, который в свою очередь показывает B) вместо A).

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

Кто-нибудь сталкивался с подобной проблемой?

1 Ответ

1 голос
/ 17 февраля 2010

Да, этот подход будет работать нормально, и я использовал его несколько раз.

Обычно я использую этот подход, если элемент управления должен извлекать и / или обрабатывать данные перед рендерингом. Я рекомендую выполнить всю такую ​​работу в фоновом потоке, а затем вызвать фактическое обновление рендеринга с помощью Dispatcher элемента.

Совет: я часто объявляю внутренний DP, называемый чем-то вроде Revision типа int, и регистрирую его в AffectsRender. Затем, как только фоновый поток завершил свою тяжелую обработку, он может BeginInvoke () вызвать инкремент свойства Revision, тем самым аннулируя рендер и вызывая новый проход рендеринга. Затем вы можете выполнить соответствующую логику рендеринга в переопределении OnRender, как обычно.

...