powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Добавить элементы в дерево без подвисания
24 сообщений из 24, страница 1 из 1
Добавить элементы в дерево без подвисания
    #38652165
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет всем!

У меня есть TreeView, который я заполнил списком директорий.
Далее я открываю директорию C:\ и подгружаю в другом потоке с сервака список файлов (100 файлов).

Далее через Dispatcher.BeginInvoke(new Action(() => AddFilesToTheTree(item, folder, _backupFileList))) я вызываю метод, который добавит список полученных с сервера файлов в директорию и покажет у клиента:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
private void AddFilesToTheTree(TreeViewItem item, List<BackupFile> _backupFileList)
        {
            foreach (BackupFile addition in _backupFileList)
            {                
                var subitem = new TreeViewItem
                {
                    DataContext = addition,
                    Header = addition.Name
                };
                
                item.Items.Add(subitem);
            }
        }



Проблема в том, что когда эти 100 файлов (100 TreeViewItem-ов) добавляются в дерево, то приложение зависает секунд на 15.
Вопрос - можно ли как-то по-другому добавить TreeViewItem-ы в дерево TreeView, чтобы приложение не висло? Через другой пото нельзя, т.к.
Код: plaintext
 Вызывающим потоком должен быть STA, поскольку этого требуют большинство компонентов UI
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38652404
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
"Используй Силу MVVM, Люк!" (ц)

Впрочем, может это поможет.
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38652812
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
using (MyTreeView.Items.DeferRefresh())
    item.Items.Add(subitem);



Всё равно зависает на этом месте
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38652836
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Students
Код: c#
1.
2.
using (MyTreeView.Items.DeferRefresh()) // <== отключаем у TreeView.
    item.Items.Add(subitem); // <== Добавляем в TreeViewItem. Ему DeferRefresh тоже не помешает.


Всё равно зависает на этом местезы: Что мешает использовать HierarhicalDataTemplate?
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38652846
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
через HierarhicalDataTemplate очень долго переделывать, можно без него?
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38652848
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно.
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38652852
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 private void AddFilesToTheTree(TreeViewItem item, List<BackupFile> _backupFileList)
        {
            List<TreeViewItem> treeViewItemList = new List<TreeViewItem>();
            foreach (BackupFile addition in _backupFileList)
            {
                var subitem = new TreeViewItem
                {
                    DataContext = addition,
                    Header = addition.Name
                };

                treeViewItemList.Add(subitem);
            }
            
            using (FolderSelectionTree.Items.DeferRefresh())
            {
                foreach (TreeViewItem subitem in treeViewItemList)
                    item.Items.Add(subitem);
            }
        }



Вот код, приложение подвисает даже с DeferRefresh , когда добавляем элементы item.Items.Add(subitem)
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38652857
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Students
Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
 private void AddFilesToTheTree(TreeViewItem item, List<BackupFile> _backupFileList)
        {
            List<TreeViewItem> treeViewItemList = new List<TreeViewItem>();
            foreach (BackupFile addition in _backupFileList)
            {
                var subitem = new TreeViewItem
                {
                    DataContext = addition,
                    Header = addition.Name
                };

                treeViewItemList.Add(subitem);
            }
            
            using (FolderSelectionTree.Items.DeferRefresh())
            {
                foreach (TreeViewItem subitem in treeViewItemList)
                    item.Items.Add(subitem);
            }
        }



Вот код, приложение подвисает даже с DeferRefresh , когда добавляем элементы item.Items.Add(subitem) см комментарий
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38652862
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо за ответ, но я не совсем понял. что означает "отключаем у TreeView"?

"Добавляем в TreeViewItem" - да, добавляем:
Код: plaintext
item.Items.Add(subitem)
, т.к. item - это и есть TreeViewItem из TreeView
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38652868
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если так:

Код: c#
1.
2.
3.
4.
5.
using (item.Items.DeferRefresh())
            {
                foreach (TreeViewItem subitem in treeViewItemList)
                    item.Items.Add(subitem);
            }



то будет ошибка в item.Items.Add(subitem) :
Код: plaintext
Cannot change or check the contents or Current position of CollectionView while Refresh is being deferred.
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38652876
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если я правильно понял ваш алгоритм, то он неверный, т.к. нельзя добавлять (и вообще изменять) items-ы во время выполнения метода DeferRefresh(), поэтому DeferRefresh() можно навесить только на сам TreeView, но будет зависать, т.е. не решит проблему
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38652922
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
up
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38653356
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Studentsесли так:

Код: c#
1.
2.
3.
4.
5.
using (item.Items.DeferRefresh())
            {
                foreach (TreeViewItem subitem in treeViewItemList)
                    item.Items.Add(subitem);
            }



то будет ошибка в item.Items.Add(subitem) :
Код: plaintext
Cannot change or check the contents or Current position of CollectionView while Refresh is being deferred.
Ну значит DeferRefresh не подходит. Тогда можно попробовать подсунуть массив элементов через ItemsSource.
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38653607
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нельзя, т.к. public ItemCollection Items { get; }
можно добавлять item-ы через Add
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38653813
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
up
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38654161
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
up
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38655471
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
up
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38655561
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Studentsнельзя, т.к. public ItemCollection Items { get; }
можно добавлять item-ы через AddМожно, т. к. public IEnumerable ItemsSource { get; set; }
можно добавлять item-ы сразу все. Быстрее способа, думаю, нет.

Если не поможет, нужно будет думать в сторону частичной загрузки или виртуализации.
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38655647
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
если через ItemsSource значит нужно переделывать TreeView с помощью HierarhicalDataTemplate, а без HierarhicalDataTemplate можно обойтись?
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38655729
Фотография Алексей К
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Studentsесли через ItemsSource значит нужно переделывать TreeView с помощью HierarhicalDataTemplate, а без HierarhicalDataTemplate можно обойтись?Что мешает присвоить ItemsSource "вручную"?
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38655871
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Если так, то да (не зависает):

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
TreeView tv = new TreeView();
ItemCollection collection = tv.Items;

foreach (BackupFile addition in _backupFileList)
            {                
                var subitem = new TreeViewItem
                {
                    DataContext = addition,
                    Header = addition.Name
                };
                
                collection.Add(subitem);
            }


item.ItemsSource = collection;



но я добавляю в MyTreeView item-ы из TreeView , что неправильно, т.к. у MyTreeView это другой контрол с чекбоксами, картинками и т.д.



если же:
Код: c#
1.
2.
MyTreeView.Items.Clear();
collection = MyTreeView.Items;



то тогда объект будет один и тот же и при collection.Add(subitem) будет зависать
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38655971
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
up
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38656005
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сделал через ItemSource:

Код: c#
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
TreeView tv = new TreeView();
tv.Resources = MyTreeView.Resources;
ItemCollection collection = tv.Items;

foreach (BackupFile addition in _backupFileList)
            {                
                var subitem = new TreeViewItem
                {
                    DataContext = addition,
                    Header = addition.Name
                };
                
                collection.Add(subitem);
            }


item.ItemsSource = collection; <----- [color=red]ВОТ ЗДЕСЬ ЗАДЕРЖКА НА 15 СЕКУНД, т.к. в коллекции 100 элементов[/color]
...
Рейтинг: 0 / 0
Добавить элементы в дерево без подвисания
    #38656027
Students
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хорошо, буду смотреть в сторону частичной загрузки и виртуализации
...
Рейтинг: 0 / 0
24 сообщений из 24, страница 1 из 1
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Добавить элементы в дерево без подвисания
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]