Добавить все файлы и подкаталоги в TreeView

243
29 июня 2018, 22:20

Есть код:

static void Main(string[] args)
{
    Scan("folder");
    Console.ReadKey();
}
static void Scan(string path)
{
    foreach (string f in Directory.GetFiles(path))
    {
        Console.WriteLine(f);
    }
    foreach (string d in Directory.GetDirectories(path))
    {
        Console.WriteLine(d);
        Scan(d);
    }
}

Вывод:

И вопрос: как это все добавить в TreeView, который в WPF, чтоб выглядело примерно на картинке? Типа обозреватель файлов

Answer 1

OK, для того, чтобы отобразить данные в TreeView, их нужно правильно приготовить. Элемент должен быть иерархическим, т.е. он должен иметь внутри себя ссылку на список дочерних элементов такого же типа. Не мудрствуя лукаво, я написал такой простейший класс:

class FileSystemEntry
{
    public string Name { get; }
    public IEnumerable<FileSystemEntry> Children { get; }
    public FileSystemEntry(string name, params FileSystemEntry[] children)
    {
        Name = name;
        Children = children;
    }
}

Я не стал заморачиваться, этот класс будет использоваться у меня и для файлов и для папок. Для файла достаточно передать один параметр-имя в конструктор, для папки дополнительно передаем массив дочерних элементов.

Теперь нам надо завести коллекцию корневых элементов (элементов верхнего уровня):

public IEnumerable<FileSystemEntry> FileSystemEntries { get; }

и как-то ее заполнить.

Метод для сканирования из вопроса нам не подходит, т. к. он выводит всё в консоль, но принцип, в нем использованный – то что нужно. Я переписываю так:

IEnumerable<FileSystemEntry> Scan(string path)
{
    // Папки будут идти в начале
    foreach (var dir in Directory.EnumerateDirectories(path))
        yield return new FileSystemEntry(Path.GetFileName(dir), Scan(dir).ToArray());
    // Файлы потом
    foreach (var file in Directory.EnumerateFiles(path))
        yield return new FileSystemEntry(Path.GetFileName(file));
}

Остается только вызвать этот метод с каким-то параметром:

var path = @"C:\Program Files\Microsoft Visual Studio";
FileSystemEntries = Scan(path).ToArray();

Коллекция заполнена, надо только привязать ее в GUI:

<TreeView ItemsSource="{Binding FileSystemEntries}">
    <TreeView.ItemTemplate>
        <HierarchicalDataTemplate ItemsSource="{Binding Children}">
            <ContentPresenter Content="{Binding Name}"/>
        </HierarchicalDataTemplate>
    </TreeView.ItemTemplate>
</TreeView>

Должно получиться что-то вроде:

READ ALSO
Требуется имя метода C#

Требуется имя метода C#

Помогите, пожалуйста, исправить ошибку, ошибка в rnd

673
Загрузка моделей 3Ds Max

Загрузка моделей 3Ds Max

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

250
C# MDI ограничить появление дочерних форм

C# MDI ограничить появление дочерних форм

Есть родительская форма MainForm, и 2 дочерние формы: 1 - StudentsTable и 2 - TeacherTableОткрыть только по каждому экземпляра (т

268
Как установить C# версии 7.2?

Как установить C# версии 7.2?

Хотел потестить модификатор доступа private protected (готовлюсь к зачёту), но пишет, что это доступно только в версии 72

232