2013-08-15 3 views
0

У нас есть элемент управления, который отображает большой объем данных, используя несколько элементов управления различного размера и сложности. Из-за большого количества элементов управления, которые необходимо выложить, может произойти очень заметная задержка.Задержка на загрузку WPF

Мы знаем, что задержка исходит от функций Measure/Arrange, поскольку у нас есть тестовый класс, который держится из стековой панели, которая переопределяет их некоторым временным кодом.

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

Итак, мой вопрос: есть ли способ создания элемента управления, который отображает загрузочную анимацию как рекламодателя или что-то еще до тех пор, пока его контент не будет выложен? Я ценю это, вероятно, невозможно, поскольку организация/измерение также выполняется в потоке пользовательского интерфейса.

+0

Вы пытались перенести приоритет? Вот как я это делаю, но я также использую виртуализацию. – Paparazzi

+0

Использование виртуализации. Забудьте прокрутки. В противном случае вам необходимо [Создать BusyIndicator в отдельном потоке] (http://abrahamheidebrecht.wordpress.com/2009/08/05/creating-a-busy-indicator-in-a-separate-thread-in-wpf/) –

ответ

0

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

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

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

Так варианты, которые вы остались с таковы:

  1. дисплей анимированной загрузкой изображения/формы, что будет замирает, когда данные обитающие управления или
  2. дисплея не-анимированная загрузка изображений/Форма

Я пошел на анимированную версию, которая замерзает в последний момент, когда данные заселены.

+0

Вы попробовали какой-то контроль над Windows.Form сверху? .. У меня было это в моем списке вещей, чтобы попробовать – wforl

+0

Это одна вещь, которая никогда не приходила мне в голову ... удачи в этой идее. – Sheridan

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