728x90
반응형

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();

        }

    }

}

 

 

 

 

728x90
반응형

+ Recent posts