Модераторы: gambit, Kefir, Partizan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TreeView, отображение дерева папок 
:(
    Опции темы
CasperSC
Дата 17.11.2010, 13:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: 1
Всего: 1



Начал писать простое дерево, для получения списка папок, хочу сделать, чтобы они в TreeView отображались в виде дерева, как в Explorer. То есть, чтобы были плюсики слева, нажимаешь и расскрывается список папок содержащийся в папки на которыю нажали. Я что-то вообще не могу понять, как это сделать. Не замудрённым кодом, а на примере моего. Или я что-то не то делаю? Я просто не пойму никак, что сделать, чтобы отображался список папок. У меня почему-то отображается названия типов элементов добавляемых в TreeView. И пусть я даже сделаю дерево с вложенными элементами, то у меня всё равно отображаются просто названия корневого списка. Ничего не понимаю...

Я впервые это делаю, так что мог и написать немного не то.

Код

<Window x:Class="WpfFileSystem_Foldes_FileLists.MainWindow"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="MainWindow" Height="437" Width="586"
        TextOptions.TextFormattingMode="Display">
    <Grid>
        <Grid.ColumnDefinitions>
            <ColumnDefinition Width="282*" />
            <ColumnDefinition Width="282*" />
        </Grid.ColumnDefinitions>
        <TreeView Height="374" Margin="12,12,11,0" Name="treeView" VerticalAlignment="Top" />
        <Button Content="Список" Grid.Column="1" Height="23" HorizontalAlignment="Left" Margin="11,363,0,0"
 Name="btnGetFolders" VerticalAlignment="Top" Width="93" Click="btnGetFolders_Click" />
    </Grid>
</Window>


Код

    class TreeNode : IEnumerable
    {
        public ObservableCollection<TreeNode> Child = new ObservableCollection<TreeNode>();
        public String Path;

        public TreeNode(String Path) : this(Path, null) { }

        public TreeNode(String Path, TreeNode treeNode)
        {
            this.Path = Path;
            if (treeNode != null)
                this.Child.Add(treeNode);
        }

        public void Add(TreeNode treeItem)
        {
            this.Child.Add(treeItem);
        }

        public void Clear()
        {
            this.Child.Clear();
        }

        public IEnumerator GetEnumerator()
        {
            return this.Child.GetEnumerator();
        }
    }


Код

        private void btnGetFolders_Click(object sender, RoutedEventArgs e)
        {
            String directory = @"D:/";
            TreeNode treeMain = new TreeNode(directory);
            IEnumerable<String> strs = Directory.EnumerateDirectories(directory);

            foreach (String item in strs)
            {
                treeMain.Add(new TreeNode(item));
            }

            treeView.ItemsSource = treeMain;
        }


Вот, что получается в итоге:
(Превью, увеличение по клику)
user posted image

Что не так делаю? И как вообще создать список папок как в эксплорере?


Это сообщение отредактировал(а) CasperSC - 17.11.2010, 13:18
PM MAIL   Вверх
WolfTheGrey
Дата 17.11.2010, 15:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 21.1.2009
Где: forum.vingrad.ru

Репутация: 2
Всего: 2



Да, ты прав. Все не правельно.
И скажи честно. откудова ты этот код взял? Он какраз то ки и есть мегосупер замудренный.
PM MAIL   Вверх
CasperSC
Дата 17.11.2010, 15:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: 1
Всего: 1



Сам написал. Не откуда я его не копировал. Я хотел сам попробовать написать это дело всё, но ничего не получилось. Вообще этот WPF замудрён. С чего вы взяли, что я его откуда-то скопировал? Что там сложного в нём? Обобщённая коллекция, которая как-то там сообщает о изменениях, хранит дочерние узлы. И поле хранящее путь к папке. Ну и конструктора два, короче синтаксис С# я более менее знаю, но с конкретно WPF не лады пока. Я вот всякие там IEnumerator'ы пока не особо понимаю, знать бы где про это дело можно почитать подробно, где написано человеческим языком.

Так, что не правильно то? Я просто не пойму, что там нужно вообще сделать, чтобы в результате получить, то о чём писал в первом своём сообщении.


Update:
Кстати я в курсе, что для получения всего дерева, надо получить все папки, пройдясь по ним рекурсивно в цикле например. Меня интересует, как вообще дерево сделать, чтобы отображалось примерно как в эксплорере.

Это сообщение отредактировал(а) CasperSC - 17.11.2010, 16:31
PM MAIL   Вверх
WolfTheGrey
Дата 17.11.2010, 16:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 207
Регистрация: 21.1.2009
Где: forum.vingrad.ru

Репутация: 2
Всего: 2



Суть заключается в том, что TreeWiew хранит в себе коллекции TreeWiewItem, которые тоже в себе хранат коллекции TreeWiewItem.
Вот код:
Код

<Window x:Class="SuperPapka.DirektoryTrrey"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="DirektoryTrrey" SizeToContent="Height" Width="300">
    <StackPanel>
        <TreeView Height="353" Margin="12,12,11,0" Name="treeView" VerticalAlignment="Top" TreeViewItem.Expanded="treeView_Expanded" />
    </StackPanel>
</Window>


Код

using System.IO;

namespace SuperPapka
{
    /// <summary>
    /// Логика взаимодействия для DirektoryTrrey.xaml
    /// </summary>
    public partial class DirektoryTrrey : Window
    {
        public DirektoryTrrey()
        {
            InitializeComponent();
            DriveInfo[] drive = DriveInfo.GetDrives();
            foreach (DriveInfo dr in drive)
            {
                TreeViewItem item = new TreeViewItem();
                item.Header = dr.ToString();
                item.Tag = dr;
                item.Items.Add("*");
                treeView.Items.Add(item);
            }
        }

        private void treeView_Expanded(object sender, RoutedEventArgs e)
        {
            TreeViewItem item = (TreeViewItem)e.OriginalSource;
            item.Items.Clear();

            TreeViewItem sItem;
            DirectoryInfo[] dirs;
            FileInfo[] files = null;
            if (item == null) return;

            if (item.Tag is DriveInfo)
                dirs = new DirectoryInfo(item.Header.ToString()).GetDirectories();
            else
            {
                dirs = ((DirectoryInfo)item.Tag).GetDirectories();
                 files = ((DirectoryInfo)item.Tag).GetFiles();
            }
            foreach (DirectoryInfo dir in dirs)
            {
                sItem = new TreeViewItem();
                sItem.Header = dir.ToString();
                sItem.Tag = dir;
                sItem.Items.Add("*");
                item.Items.Add(sItem);                 
            }
            if(files!=null)
            foreach (FileInfo file in files)
                item.Items.Add(file);

        }
    } 


писал от себя, но студия одобрила (ошибок нет). Благодарности не надо smile

Если хочешь могу развить тему в сторону биндинга. стилей, и тем.... ??

Добавлено через 4 минуты и 41 секунду
Я использовал событие TreeViewItem.Expanded, чтоб код срабатывал на открытие, и осматривал только заданную папку, а не шерстил весь диск.
PM MAIL   Вверх
CasperSC
Дата 17.11.2010, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: 1
Всего: 1



О, спасибо! Не тестил ещё, но в общем мне надо было самому догадаться, что надо добавлять TreeViewItem'ы в TreeView, по сути это же очевидно =).  Я просто на этих ItemSource зациклился и это меня сбило с толку. 

Конечно. Если вы серьёзно, то можно развить тему в ту сторону.

Это сообщение отредактировал(а) CasperSC - 17.11.2010, 16:38
PM MAIL   Вверх
CasperSC
Дата 18.11.2010, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 203
Регистрация: 27.11.2009

Репутация: 1
Всего: 1



Странно, но почему-то событие не срабатывает. Я ставил точку останова, не срабатывает и всё.

Код

     Expander.Expanded="treeView_Expanded"


Это сообщение отредактировал(а) CasperSC - 18.11.2010, 10:08
PM MAIL   Вверх
KelTron
Дата 18.11.2010, 19:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 745
Регистрация: 8.10.2006
Где: Красноярск

Репутация: 2
Всего: 38





--------------------
Тысячами незримых нитей обвивает тебя Закон. Разрубишь одну - преступник. Десять - смертник. Все - Бог.
Эвенгар Салладорский, основатель Школы Тьмы.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | WPF и Silverlight | Следующая тема »


 




[ Время генерации скрипта: 0.0734 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.