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();
}
}
}
결과
WPF IValueConverter 사용하기 (0) | 2024.07.10 |
---|---|
DispatcherObject를 상속받은 WPF의 모든 public 클래스를 트리로 보여주는 프로그램 (0) | 2024.07.10 |
WPF 프로그램 하단에 시계 표시하기 (0) | 2024.07.10 |
WPF KeyGesture 사용해 키 이벤트 처리하기 (0) | 2024.07.10 |
WPF SetBinding 을 이용해 ListBox 선택에 따른 배경색 변경하기 (0) | 2024.07.10 |