Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > .NET Frameworks (точка нет фреймворки) > WPF, UWP, WinRT, XAML
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2015, 15:55   #1
D][mon
Форумчанин
 
Регистрация: 05.01.2010
Сообщений: 150
По умолчанию WPF>TreeViwe : Развернуть элементы в "пути"

Доброго времени суток.

К TreeView привязано дерево каталогов (свернутое).

Задача состоит в том, чтобы выбрать какойлибо элемент внутри дерева, имея его путь.

Мое решение:
Код:
private void ExpandRecursively(ItemsControl itemsControl, string[] path, int cur)
        {
            if (cur >= path.Length) return;
            ItemContainerGenerator itemContainerGenerator = itemsControl.ItemContainerGenerator;

            for (int i = itemsControl.Items.Count - 1; i >= 0; --i)
            {
                ItemsControl childControl = itemContainerGenerator.ContainerFromIndex(i) as ItemsControl;

                if (childControl != null)
                {
                    FSInfoItem fsi = childControl.DataContext as FSInfoItem;
                    if (fsi != null && (fsi.FileSystemInfo.Name.Equals(path[cur] + '\\') || fsi.FileSystemInfo.Name.Equals(path[cur])))
                    {
                        var viewItem = childControl as TreeViewItem;
                        if (viewItem != null)
                        {
                            viewItem.IsSelected = true;
                            viewItem.IsExpanded = true;
                        }
                        ExpandRecursively(childControl, path, cur + 1);
                        break;
                    }
                }

            }

        }
Проблема в том, что элементы TreeView Генерируются по мере необходимости.

Так что вопрос к вам, уважаемые форумчане, таков:
Как в коде заставить определенный TreeViewItem сгенерировать свое содержимое и подписаться на конец этого действа?
D][mon вне форума Ответить с цитированием
Старый 05.06.2015, 12:06   #2
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Приеду из отпуска, напишу решение.
Если раньше не ответят.
"Тебе то может на меня и насрать, но твои глаза меня обожают!"
ImmortalAlexSan вне форума Ответить с цитированием
Старый 05.06.2015, 12:13   #3
Luuzuk
Форумчанин
 
Аватар для Luuzuk
 
Регистрация: 18.01.2012
Сообщений: 975
По умолчанию

Цитата:
Как в коде заставить определенный TreeViewItem сгенерировать свое содержимое...
Обрабатывать событие "Expanded", а в нем уже определять необходимость генерации содержимого. Разумеется, при создании тривьюайтема его нужно подписать на его же собственное Expanded.

Цитата:
...подписаться на конец этого действа?
ну учитывая, что генерировать содержимое вы будете в коде, то и момент окончания генерации вам будет известен. Собственно после окончания код генерации может и какой-нить ивент кинуть, или какой-то метод дернуть. Все зависит от реализации и потребностей, т.е. все в ваших руках
Благодарить в репутацию. Проклинать — туда же
Luuzuk вне форума Ответить с цитированием
Старый 23.06.2015, 10:15   #4
ImmortalAlexSan
Участник клуба
 
Аватар для ImmortalAlexSan
 
Регистрация: 13.01.2009
Сообщений: 1,353
По умолчанию

Дошли руки. Как и обещал, вот код, который использую я. Он не совершенен и требует доработки. Элементы добавляются динамически. По желанию, можете добавить в конце OnExpanded подписку на какое-либо событие.

Код:
Код:
        /// <summary>
        /// Создание элемента списка.
        /// </summary>
        /// <param name="tag">Полный путь к каталогу.</param>
        /// <param name="header">Имя элемента списка.</param>
        /// <returns></returns>
        private TreeViewItem CreateItem(string tag, string header)
        {
            TreeViewItem item = new TreeViewItem();
            item.Tag = tag;
            item.Header = header;

            return item;
        }

        /// <summary>
        /// Создание дочерних элементов для родительского элемента.
        /// В случае, если программе не удается получить доступ к таким каталогам, как, например, $RECYCLE.BIN,
        /// используется оператор try-catch-finally в сокращенной форме.
        /// </summary>
        /// <param name="parentItem">Родительский элемент.</param>
        private void CreateItems(TreeViewItem parentItem)
        {
            string[] directoryNames = null;

            try
            {
                directoryNames = Directory.GetDirectories(parentItem.Tag.ToString());
            }
            catch
            {
            }

            if (directoryNames != null)      
                foreach (string directoryName in directoryNames)
                {
                    DirectoryInfo directory = new DirectoryInfo(directoryName);
                    TreeViewItem childItem = this.CreateItem(directory.FullName, directory.Name);

                    parentItem.Items.Add(childItem);
                }
        }

        /// <summary>
        /// Загрузка окна.
        /// Строится список первоначальных элементов типа Drive и дочерних узлов для них.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void OnLoaded(object sender, RoutedEventArgs e)
        {
            TreeViewItem item = null;
            ItemCollection items = this.explorerTreeView.Items;

            DriveInfo[] drives = DriveInfo.GetDrives();

            foreach (DriveInfo drive in drives)
                if (drive.IsReady)
                {
                    item = this.CreateItem(drive.Name, drive.Name.Substring(0, 2));
                    this.CreateItems(item);

                    this.explorerTreeView.Items.Add(item);
                }
        }

        /// <summary>
        /// Развернуть родительский элемент.
        /// Эта функция не затрагивает элементы, связанные с родительским элементом посредством VisualTree и LogicalTree,
        /// так как используются явная привязка в разметке, и как следствие, параметр OriginalSource
        /// экземпляра класса <see cref="System.Windows.RoutedEventArgs"/>.
        /// </summary>
        /// <param name="sender">Должен являться экземпляром класса <see cref="System.Windows.Controls.TreeView"/> в соответствии с разметкой.</param>
        /// <param name="e">Экземпляр класса <see cref="System.Windows.RoutedEventArgs"/>.</param>
        private void OnExpanded(object sender, RoutedEventArgs e)
        {
            TreeViewItem parentItem = e.OriginalSource as TreeViewItem;

            foreach (TreeViewItem childItem in parentItem.Items)
                this.CreateItems(childItem);
        }
        /// <summary>
        /// Свернуть родительский элемент и все его дочерние элементы.
        /// Это рекурсивная функция, результат работы которой достигается за счет автоматической генерации события свертывания
        /// посредством выставления параметра IsExpanded = false экземпляра класса <see cref="System.Windows.Controls.TreeViewItem"/>.
        /// </summary>
        /// <param name="sender">Должен являться экземпляром класса <see cref="System.Windows.Controls.TreeView"/> в соответствии с разметкой.</param>
        /// <param name="e">Экземпляр класса <see cref="System.Windows.RoutedEventArgs"/>.</param>
        private void OnCollapsed(object sender, RoutedEventArgs e)
        {
            TreeViewItem parentItem = e.OriginalSource as TreeViewItem;

            foreach (TreeViewItem childItem in parentItem.Items)
                if (childItem.Items.Count != 0)
                {
                    childItem.IsExpanded = false;
                    childItem.Items.Clear();
                }
        }
Разметка:
Код:
<TreeView x:Name="explorerTreeView" TreeViewItem.Expanded="OnExpanded" TreeViewItem.Collapsed="OnCollapsed"/>
"Тебе то может на меня и насрать, но твои глаза меня обожают!"

Последний раз редактировалось ImmortalAlexSan; 23.06.2015 в 17:23. Причина: баг в коде
ImmortalAlexSan вне форума Ответить с цитированием
Старый 02.07.2015, 01:13   #5
D][mon
Форумчанин
 
Регистрация: 05.01.2010
Сообщений: 150
По умолчанию

ImmortalAlexSan, огромное спасибо.
Как раз после защиты диплома начал допиливать проекты. Очень пригодится.
D][mon вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Постоянно слетает галочка "автоматически" в "Параметры Excel", "Формулы", "Вычисления в книге" Alexsandrr Microsoft Office Excel 4 19.10.2013 14:22
Создать класс "Фигура", от него наследованием создать 3 класса ("треугольник", "четырехугольник", "окружность") funnyy Помощь студентам 3 17.10.2012 17:40
Реакция на кнопку "развернуть" на бордюре формы Ksardas13 C++ Builder 3 16.05.2011 04:11
при вводе на листе "магазин"- код товара появлялось "описание" товара из "склада" с "продажной ценой" aleksei78 Microsoft Office Excel 13 25.08.2009 12:04