Визуализация пользовательского интерфейса с помощью BackgroundWorker - PullRequest
0 голосов
/ 17 ноября 2010

Я связываю свой ContentPresenter с ViewModel, имеющим ссылочный тип DataTemplate, который содержит экземпляр стороннего элемента управления (DevExpress GridControl).Когда этот элемент управления привязан к коллекции небольшого размера (т. Е. 1000 элементов), загрузка элемента занимает заметные четыре или пять секунд.Итак, на мой вопрос - для элементов управления, которые требуют времени для визуализации, можно ли это как-то сделать с помощью BackgroundWorker, чтобы пользовательский интерфейс не зависал?Имейте в виду, что мои элементы управления находятся в DataTemplate, поэтому любая выделенная часть кода нежелательна.

Спасибо!

Ответы [ 2 ]

2 голосов
/ 17 ноября 2010

К сожалению, создание фактического пользовательского интерфейса (в вашем случае создание, позиционирование и отображение элементов управления) должно выполняться в потоке пользовательского интерфейса из-за ограничений совместимости - все компоненты пользовательского интерфейса должны создаваться потоком пользовательского интерфейса, и их можно изменять толькотакже потоком пользовательского интерфейса.

Одна вещь, которую я бы порекомендовал рассмотреть, это виртуализация - если вы не отображаете таблицу данных из 1000 элементов, зачем создавать все элементы управления?Вы можете найти примеры, например Виртуализированный холст WPF или использование встроенного VirtualizingStackPanel.Использование этих методов будет более трудоемким, чем просто привязка модели представления к элементу с табличкой данных, но даст гораздо, гораздо лучшую производительность.

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

0 голосов
/ 18 ноября 2010

Ваш ItemsControl должен содержать VirtualizingStackPanel, что делают ListView и ListBox, но убедитесь, что виртуализация включена, и вы используете перециклирование контейнера

<ItemsControl 
VirtualizingStackPanel.IsVirtualizing="true" 
VirtualizingStackPanel.VirtualizationMode="Recycling">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...