WPF自带FileDialog选择文件夹对话框,但是有时候为了界面风格统一,需要改变其自带样式,这就比较困难了。所以自己实现了一个简易的选择文件夹对话框功能,可根据需要自行改变样式,参考文章(https://www.codeproject.com/Tips/673071/WPF-TreeView-with-WinForms-Style-Fomat、https://www.cnblogs.com/DoNetCoder/p/3856231.html)。效果如下:
1、工程目录:
2、FolderBrowserModel.cs源码:
using FileDialogDemo.Helper;
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
namespace FileDialogDemo.Model
{
public class FolderBrowserModel : INotifyPropertyChanged
{
private string fileName;
private string itemImagePath;
private string fullName;
private bool isSelected;
private bool isExpanded;
private bool isGetFileItems;
private FolderType type;
private ObservableCollection<FolderBrowserModel> children;
/// <summary>
/// 是否展示文件
/// </summary>
public bool IsGetFileItems
{
get
{
return isGetFileItems;
}
set
{
if (isGetFileItems != value)
{
isGetFileItems = value;
}
}
}
/// <summary>
/// 是否展开
/// </summary>
public bool IsExpanded
{
get
{
return isExpanded;
}
set
{
if (isExpanded != value)
{
isExpanded = value;
OnPropertyChanged("IsExpanded");
}
}
}
/// <summary>
/// 是否选中
/// </summary>
public bool IsSelected
{
get
{
return isSelected;
}
set
{
if (isSelected != value)
{
isSelected = value;
OnPropertyChanged("IsSelected");
}
}
}
/// <summary>
/// 文件(夹)的名称
/// </summary>
public string FileName
{
get
{
return fileName;
}
set
{
if (fileName != value)
{
fileName = value;
OnPropertyChanged("FileName");
}
}
}
/// <summary>
/// 节点图标的路径
/// </summary>
public string ItemImagePath
{
get
{
return itemImagePath;
}
set
{
if (itemImagePath != value)
{
itemImagePath = value;
OnPropertyChanged("ItemImagePath");
}
}
}
/// <summary>
/// 文件(夹)的全路径
/// </summary>
public string FullName
{
get
{
return fullName;
}
set
{
if (fullName != value)
{
fullName = value;
OnPropertyChanged("FullName");
}
}
}
/// <summary>
/// 文件项类型
/// </summary>
public FolderType Type
{
get
{
return type;
}
set
{
switch (value)
{
case FolderType.Directory:
{
ItemImagePath = "/Image/folder.png";
break;
}
case FolderType.Disk:
{
ItemImagePath = "/Image/disk.png";
break;
}
case FolderType.File:
{
ItemImagePath = "/Image/file.png";
break;
}
default:
{
ItemImagePath = "/Image/folder.png";
break;
}
}
type = value;
}
}
/// <summary>
/// 子目录(文件 + 文件夹)
/// </summary>
public ObservableCollection<FolderBrowserModel> Children
{
get
{
try
{
if (children != null)
{
return children;
}
children = new ObservableCollection<FolderBrowserModel>();
switch (Type)
{
case FolderType.Disk:
case FolderType.Directory:
{
foreach (var item in DictionaryHelper.GetDirectoryChildrenItems(FullName, true, IsGetFileItems, false))
{
FolderBrowserModel model = new FolderBrowserModel();
model.FileName = item.Name;
model.FullName = item.FullName;
model.IsGetFileItems = IsGetFileItems;
if (string.IsNullOrEmpty(item.Extension))
model.Type = FolderType.Directory;
else
model.Type = FolderType.File;
children.Add(model);
}
break;
}
default: