Гость
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Добавить элементы в дерево без подвисания / 24 сообщений из 24, страница 1 из 1
26.05.2014, 15:14
    #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
26.05.2014, 17:59
    #38652404
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элементы в дерево без подвисания
"Используй Силу MVVM, Люк!" (ц)

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



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


Всё равно зависает на этом местезы: Что мешает использовать HierarhicalDataTemplate?
...
Рейтинг: 0 / 0
27.05.2014, 10:43
    #38652846
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элементы в дерево без подвисания
через HierarhicalDataTemplate очень долго переделывать, можно без него?
...
Рейтинг: 0 / 0
27.05.2014, 10:44
    #38652848
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элементы в дерево без подвисания
Можно.
...
Рейтинг: 0 / 0
27.05.2014, 10:47
    #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
27.05.2014, 10:52
    #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
27.05.2014, 10:55
    #38652862
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элементы в дерево без подвисания
спасибо за ответ, но я не совсем понял. что означает "отключаем у TreeView"?

"Добавляем в TreeViewItem" - да, добавляем:
Код: plaintext
item.Items.Add(subitem)
, т.к. item - это и есть TreeViewItem из TreeView
...
Рейтинг: 0 / 0
27.05.2014, 10:59
    #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
27.05.2014, 11:02
    #38652876
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элементы в дерево без подвисания
Если я правильно понял ваш алгоритм, то он неверный, т.к. нельзя добавлять (и вообще изменять) items-ы во время выполнения метода DeferRefresh(), поэтому DeferRefresh() можно навесить только на сам TreeView, но будет зависать, т.е. не решит проблему
...
Рейтинг: 0 / 0
27.05.2014, 11:23
    #38652922
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элементы в дерево без подвисания
up
...
Рейтинг: 0 / 0
27.05.2014, 14:45
    #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
27.05.2014, 16:46
    #38653607
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элементы в дерево без подвисания
нельзя, т.к. public ItemCollection Items { get; }
можно добавлять item-ы через Add
...
Рейтинг: 0 / 0
27.05.2014, 19:22
    #38653813
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элементы в дерево без подвисания
up
...
Рейтинг: 0 / 0
28.05.2014, 10:27
    #38654161
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элементы в дерево без подвисания
up
...
Рейтинг: 0 / 0
29.05.2014, 11:10
    #38655471
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элементы в дерево без подвисания
up
...
Рейтинг: 0 / 0
29.05.2014, 12:05
    #38655561
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элементы в дерево без подвисания
Studentsнельзя, т.к. public ItemCollection Items { get; }
можно добавлять item-ы через AddМожно, т. к. public IEnumerable ItemsSource { get; set; }
можно добавлять item-ы сразу все. Быстрее способа, думаю, нет.

Если не поможет, нужно будет думать в сторону частичной загрузки или виртуализации.
...
Рейтинг: 0 / 0
29.05.2014, 12:47
    #38655647
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элементы в дерево без подвисания
если через ItemsSource значит нужно переделывать TreeView с помощью HierarhicalDataTemplate, а без HierarhicalDataTemplate можно обойтись?
...
Рейтинг: 0 / 0
29.05.2014, 13:34
    #38655729
Алексей К
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элементы в дерево без подвисания
Studentsесли через ItemsSource значит нужно переделывать TreeView с помощью HierarhicalDataTemplate, а без HierarhicalDataTemplate можно обойтись?Что мешает присвоить ItemsSource "вручную"?
...
Рейтинг: 0 / 0
29.05.2014, 14:47
    #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
29.05.2014, 15:34
    #38655971
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элементы в дерево без подвисания
up
...
Рейтинг: 0 / 0
29.05.2014, 15:49
    #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
29.05.2014, 15:57
    #38656027
Students
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Добавить элементы в дерево без подвисания
хорошо, буду смотреть в сторону частичной загрузки и виртуализации
...
Рейтинг: 0 / 0
Форумы / WPF, Silverlight [игнор отключен] [закрыт для гостей] / Добавить элементы в дерево без подвисания / 24 сообщений из 24, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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