Обновление пользовательского интерфейса замораживает приложение во время рисования - PullRequest
1 голос
/ 05 сентября 2011

Это умозрительный вопрос, поэтому код не указан.

У меня есть приложение, которое берет большой XML-файл и строит из него представление для редактирования пользователем. Загрузка XML выполняется в фоновом режиме и затем привязывается к представлению довольно ванильным способом MVVM через древовидное представление.

Все это работает очень хорошо, и при загрузке XML-файла отображается хороший курсор ожидания.

Однако, когда XML-файл становится очень большим (20 МБ), пользовательский интерфейс будет зависать во время рисования нового представления. Этого и следовало ожидать, но это означает, что все визуальные подсказки о том, что приложение все еще живо, также останавливаются. В данный момент курсор изменяется после завершения загрузки в рабочем режиме непосредственно перед рисованием. Есть ли событие типа paintingHasFinished для элемента управления или изящного трюка, который я мог бы использовать в качестве дескриптора, чтобы я мог изменить свой ожидающий курсор после этого действия пользовательского интерфейса?

Ответы [ 2 ]

1 голос
/ 05 сентября 2011

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

Попробуйте добавить это:

this.Dispatcher.BeginInvoke(DispatcherPriority.Loaded, new Action(() =>
    {
        Cursor = Cursors.Arrow;
    }
));

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

1 голос
/ 05 сентября 2011

Вы можете добавить созданные вами ViewModels по очереди или порциями по x, используя диспетчер, чтобы элементы добавлялись постепенно и не перегружали поток измерения / макета в конце операции загрузки.Это увеличит общее время загрузки, но также улучшит взаимодействие с пользователем.

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

...