Добавление элементов управления в окна WPF без блокировки потока графического интерфейса

Я пытаюсь найти способ добавить несколько (более 100 с большим объемом данных) элементов управления в графический интерфейс WPF, не блокируя поток графического интерфейса сам по себе. Вот как я создаю элементы управления в настоящее время:

Я создаю элементы управления асинхронно в параллельном потоке, и я могу добавить их в графический интерфейс, но когда дело доходит до container.Children.Add(), графический интерфейс блокируется.

Моей первой попыткой было создать их с помощью задачи асинхронным методом.

var a = Task.Factory.StartNew(() =>
{
    foreach (UserElement element in userElements)
        this.Dispatcher.Invoke(() => { UserElementsContainer.Children.Add(element); });
});
await a; //Won't work with or without await.

Есть ли другой способ?


person Marc    schedule 24.08.2015    source источник
comment
Во-первых, это не очень хорошая идея, потому что все, что связано с графическим интерфейсом, должно обрабатываться потоком графического интерфейса. Даже если вы преуспеете, вы обязательно попадете в беду.   -  person Philip Stuyck    schedule 24.08.2015
comment
Можете ли вы добавить еще немного кода? Вы звоните Диспетчеру по ЭТОМУ. но это тоже UserElementsContainer? Если нет, он может заблокировать   -  person Blaatz0r    schedule 24.08.2015
comment
ЭТО текущий элемент управления WPF (UserManagement), встроенный в окно WPF. UserElementsContainer является частью UserManagement.   -  person Marc    schedule 24.08.2015
comment
добавить несколько (более 100 с большим объемом данных) элементов управления – такой объем сортировки через this.Dispatcher.Invoke() создаст значительную нагрузку на поток сообщений пользовательского интерфейса.   -  person MickyD    schedule 24.08.2015


Ответы (1)


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

Посмотрите этот пример, демонстрирующий виртуализированный элемент управления Canvas. Виртуализированный холст Microsoft WPF

А также этот другой пост для получения дополнительных ссылок на технологии виртуализации: Ресурсы и руководства по пользовательскому интерфейсу виртуализация в WPF

person toadflakz    schedule 24.08.2015