Я пишу эту историю тем людям, которые спрашивают меня о методах реализации настраиваемого элемента управления TreeView File Explorer в WPF с использованием командных интерпретаторов.

Результат этого урока ниже.

Пожалуйста, следуйте приведенной ниже реализации, чтобы получить результаты, указанные выше.

Необходимые ссылки

Реализуйте класс PropertyNotifier

В WPF, чтобы изменения свойства класса отражались в пользовательском интерфейсе, интерфейс INotifyPropertyChanged должен быть реализован на уровне класса. При каждом изменении свойства метод OnPropertyChanged должен вызываться вручную для всплытия событий.

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

Реализуйте класс BaseObject

Этот класс будет базовым классом для всех объектов класса, которые мы собираемся использовать в этом руководстве. При этом будет использоваться класс PropertyNotifier, поэтому он унаследует все поведение событий изменения свойства.

Совместимость

Нам нужно напрямую взаимодействовать с ядром Windows, и вызовы этого действительны только при импорте shell32.dll и user32.dll и вызове нужных методов.

В пределах упомянутых dll данные методы «оболочки» требуют некоторых конкретных переменных для получения значений. Я называю переменные «SHGFI», что означает ShellGetFileInfo, метод использования с тех пор, как я начал программировать на Visual Basic 6.0.

Нам нужно реализовать следующие классы, структуры и перечисления ниже.

ShellFileInfo.cs

Это класс, который будет хранить извлеченную информацию об оболочках.

FileAttribute.cs

Перечисление для атрибута файла при вызове оболочки.

ShellAttribute.cs

Перечисление для атрибута shells.

IconSize.cs

Перечисление, определяющее размер значка.

ItemState.cs

Перечисление, используемое для определения состояния значка (может использоваться на уровне папки).

ItemType.cs

Перечисление, используемое для определения типа извлечения.

FileSystemObjectInfo.cs и DummyFileSystemObjectInfo.cs

Этот класс - самый важный класс в этом руководстве. Он будет содержать информацию обо всех дисках, папках и файлах из системы. Он также будет обрабатывать все взаимодействия между пользователем и пользовательским интерфейсом.

Сначала мы создаем конструкторы.

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

С другой стороны, нам нужно создать фиктивный эквивалент этого класса. Это будет полезно на пути к тому, как мы собираемся манипулировать деревом. Это всего лишь простой трюк, с которым мы можем поиграть.

В FileSystemObjectInfo.cs добавьте следующие события:

Затем добавьте следующие свойства ниже.

Добавьте следующие методы, чтобы обмануть элемент управления TreeView и разрешить срабатывание триггера в событии Expanded.

Исследуйте каталоги

Этот метод используется для исследования системных каталогов. Он использует классы пространства имен System.IO.

Обратите внимание, как e использовал события BeforeExplore и AfterExplore.

ExploreFiles

Этот метод используется для исследования системных файлов каталога.

Мы почти закончили, остались только классы, которые возвращают фактические значки системы с использованием библиотек DLL ядра.

При этом нам нужно реализовать некоторые классы менеджеров.

ShellManager

Этот класс используется для получения реальных значков системы на основе предоставленного пути. Он использует все переменные и методы взаимодействия, которые мы определили в предыдущем разделе этого руководства.

FolderManager

Класс, который используется для получения значков папки из системы.

Файловый менеджер

Класс, который используется для получения значков файлов из системы.

Собираем все на свои места

К этому моменту мы уже объявили и реализовали все необходимые классы этого руководства. Все, что нам нужно сделать, это реализовать в пользовательском интерфейсе.

Но перед этим нам нужно поместить следующие коды в класс FileSystemObjectInfo.

В конструкторе:

Также добавьте этот метод:

Обратите внимание, как мы используем событие PropertyChange, как описано выше в классе IPropertyNotifier, WPF должен получать уведомления, когда мы взаимодействуем с элементами управления через INotifyProperyChanged интерфейс.

Windows XAML

В файл MainWindow.xaml поместите приведенный ниже код.

Примечание. Вам необходимо изменить пространство имен TreeViewFileExplorer в зависимости от желаемого пространства имен.

А ниже приведен код класса MainWindow.xaml .

Вуаля ~~! Запустив программу, вы получите желаемый результат этого урока.

Это конец этого урока.

Ссылки

Все на месте, и все это можно найти в моем аккаунте Github.

Проект: https://github.com/mikependon/Tutorials/tree/master/WPF/TreeViewFileExplorer