KeiStory

WPF TreeView 를 이용해 파일탐색기 만들기

 

TreeView 이용하여 파일구조를 보는 방법을 알아 봅니다.

 

 DiskDirectory.cs

using System.Collections.Generic;
using System.IO;
 
namespace WpfApp
{
    public class DiskDirectory
    {
        /// <summary>
        /// 대렉토리 정보입니다.
        /// </summary>
        DirectoryInfo directoryInfo;
 
        /// <summary>
        /// 생성자입니다.
        /// </summary>
        /// <param name="directoryInfo"></param>
        public DiskDirectory(DirectoryInfo directoryInfo)
        {
            this.directoryInfo = directoryInfo;
        }
 
        /// <summary>
        /// 디렉토리 명입니다.
        /// </summary>
        public string Name
        {
            get { return directoryInfo.Name; }
        }
 
        /// <summary>
        /// 디렉토리의 자식 디렉토리입니다.
        /// </summary>
        public List<DiskDirectory> Subdirectories
        {
            get
            {
                List<DiskDirectory> diskDirectoryList = new List<DiskDirectory>();
                DirectoryInfo[] subDirectoryInfos;
 
                try
                {
                    subDirectoryInfos = directoryInfo.GetDirectories();
                }
                catch
                {
                    return diskDirectoryList;
                }
 
                foreach (DirectoryInfo subDirectoryInfo in subDirectoryInfos)
                {
                    diskDirectoryList.Add(new DiskDirectory(subDirectoryInfo));
                }
 
                return diskDirectoryList;
            }
        }
    }
}

 

MainWindow.xaml.cs

using System;
using System.IO;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
 
namespace WpfApp
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();
 
            Title = "Template the Tree";
 
            // TreeView 를 정의합니다.
            TreeView treevue = new TreeView();
            Content = treevue;
 
            // DiskDirectory 를 기반으로 하는 HierarchicalDataTemplate 을 만듭니다.
            HierarchicalDataTemplate template = new HierarchicalDataTemplate(typeof(DiskDirectory));
 
            // template 의 ItemSource 에 바인딩될 항목을 정의합니다.("Subdirectories")
            template.ItemsSource = new Binding(nameof(DiskDirectory.Subdirectories));
 
            // 화면에 라벨로 표시될 TextBlock 을 위한 FrameworkElementFactory 를 정의합니다.
            FrameworkElementFactory factoryTextBlock = new FrameworkElementFactory(typeof(TextBlock));
 
            // TextBlock 에 바인딩될 항목을 정의합니다. ("Name")
            factoryTextBlock.SetBinding(TextBlock.TextProperty, new Binding(nameof(DiskDirectory.Name)));
 
            // template 의 VisualTree 에 Textblock 을 설정합니다.
            // 참고 : https://docs.microsoft.com/ko-kr/dotnet/framework/wpf/advanced/trees-in-wpf?redirectedfrom=MSDN
            template.VisualTree = factoryTextBlock;
 
            DiskDirectory dir = new DiskDirectory(new DirectoryInfo(Path.GetPathRoot(Environment.SystemDirectory)));
 
            // TreeViewItem 을 생성하여 루트요소를 바인딩하고 template 를 설정합니다.
            TreeViewItem item = new TreeViewItem();
            item.Header = dir.Name;
            item.ItemsSource = dir.Subdirectories;
            item.ItemTemplate = template;
 
            treevue.Items.Add(item);
 
            item.IsExpanded = true;
 
            // 모두 펼칩니다. (항목이 많은경우 시간 오래 걸림)
            //item.ExpandSubtree();
        }
    }
}

결과

 

반응형

공유하기

facebook twitter kakaoTalk kakaostory naver band