2016-12-22 10 views
0

У меня есть проект WPF с DataGrid, который привязан к коллекции Observable. Эта коллекция заполняется с использованием метода async, когда я вызываю этот асинхронный метод, пользователю отображается анимация с индикатором выполнения.WPF UI Замораживает при заполнении DataGrid

Хотя коллекция ждет данных все работает без задержек, но когда DataGrid заполняемых себя с деталями, прогресс кольцо анимация перестает работать в течение 1 секунды или 2, пока DataGrid загружает все записи (Эта коллекция может иметь 50 000 записей или более). Мне просто интересно, есть ли способ заблокировать анимацию, когда DataGrid заполняет собой информацию, возвращенную из коллекции.

Установки: У меня есть основное окно со скрытым пользовательским элементом управления, которое отображает/скрывает анимацию, используя свойство с именем IsLoading. Когда этот элемент управления пользователя виден, он блокирует все пользовательские объекты за ним.

Кодекс

<Grid> 
<local:LoadingOverlayView 
     DataContext="{Binding Assets}" 
     d:IsHidden ="True" 
     Visibility="{Binding IsLoading, 
     Converter={StaticResource BoolToVisibilityConverter}, 
       UpdateSourceTrigger=PropertyChanged}"/> 
</Grid> 
+1

Вы попробуйте использовать другую тему для анимации? – Master117

+0

Можете ли вы дать пример, как это сделать? –

+0

Вам нужно использовать [BackGroundWorker] (https://msdn.microsoft.com/en-us/library/system.componentmodel.backgroundworker.aspx), также пройти через это [Как использовать рабочий стол WPF] (http://stackoverflow.com/questions/5483565/how-to-use-wpf-background-worker) –

ответ

0

Лучший способ реализации анимационного прогресс кольцо, бары и т.д., чтобы использовать вторичный поток для них. Позже для синхронизации других потоков с использованием потока ui используйте метод Dispatcher.Invoke().

+0

Dispatcher.Invoke() - это метод, используемый для того, чтобы сообщить диспетчеру что-то выполнить (как делегат) синхронно в потоке Диспетчер связан с. Он не используется для «_синхронизации других потоков с помощью ui thread_». –

0

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

это хорошо читать: https://msdn.microsoft.com/en-us/library/cc716879(v=vs.110).aspx, но это может стать довольно сложной

+0

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

+0

Я действительно сомневаюсь в этом; в этом вопросе четко сказано: «Пока коллекция ожидает данных, все работает без задержек, но когда DataGrid заполняет себя элементами, анимация цикла выполнения перестает работать в течение 1 секунды или 2, пока DataGrid не загрузит все записи (эта коллекция может иметь 50 000 записей или более). «Таким образом, загружается без задержки и анимация цикла процесса останавливается; указывает на то, что у него нет задержки на сбор коллекции, но на данный момент датадайд собирается выполнять свою работу. –

+0

Точно, когда DataGrid заполняет себя тем, что анимация прогресса Ring блокирует короткий период времени ... Это не большая проблема, но было бы лучше, если бы я мог продолжать видеть анимацию кольца без «удушья», когда DataGrid загружает данные ... Я также не уверен, как выделить это в двух разных потоках, поскольку это два разных пользовательских элемента управления WPF, привязанные к общему свойству True/False, которое показывает или скрывает анимацию после загрузки Datagrid завершает .... –

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

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