WPF 文件夹浏览器






4.87/5 (15投票s)
一个 WPF 文件夹浏览器。
引言
这是一个 WPF 文件夹浏览器,类似于 Windows Forms 中找到的文件夹浏览器。WPF 当前没有提供文件夹浏览器对话框,最接近的是 WPF 的 PresentationFramework.dll 程序集中的 Microsoft.Win32.OpenFileDialog
类,它允许用户指定多个文件来打开。

Using the Code
代码仅包含一个 XAML 文件,其中包含对话框的不同部分。该对话框大致基于 Windows 文件/文件夹对话框模型,因为它具有一个常用的已选文件夹区域和一个 Windows 资源管理器风格的 treeview
。所选文件夹显示在对话框底部的 textbox
中。该代码使用 MVVM,并且依赖于最新的 Prism 二进制文件,但仅用于 DelegateCommand
。主要的 ViewModel
,即对话框绑定的对象是 BrowserViewModel
,它将 treeview
初始化为指向机器上的所有驱动器。它具有一个 SelectedFolder
属性和一个 FolderSelected DelegateCommand
,当用户在左侧选择一个常用文件夹时会调用该属性。
public DelegateCommand<object> FolderSelectedCommand
{
get
{
return new DelegateCommand<object>(it => SelectedFolder =
Environment.GetFolderPath((Environment.SpecialFolder)it));
}
}
文件夹本身以 FolderViewModel
的形式表示,它接收一个 ObservableCollection
的 FolderViewModels
来表示子文件夹。文件夹对话框中的 treeview
绑定到这个 FolderViewModel
。FolderViewModel
实现 IsExpanded
和 IsSelected
属性,以向 TreeViewItem
状态添加功能,例如,在选择/展开节点时动态加载子文件夹。选择一个节点也会像 Windows 资源管理器一样展开它。
private void LoadFolders()
{
try
{
if (Folders.Count > 0)
return;
string[] dirs = null;
string fullPath = Path.Combine(FolderPath, FolderName);
if (FolderName.Contains(':'))//This is a drive
fullPath = string.Concat(FolderName, "\\");
else
fullPath = FolderPath;
dirs = Directory.GetDirectories(fullPath);
Folders.Clear();
foreach (string dir in dirs)
Folders.Add(new FolderViewModel
{ Root = this.Root, FolderName = Path.GetFileName(dir),
FolderPath = Path.GetFullPath(dir),
FolderIcon = "Images\\FolderClosed.png" });
if (FolderName.Contains(":"))
FolderIcon = "Images\\HardDisk.ico";
Root.SelectedFolder = FolderPath;
}
catch (UnauthorizedAccessException ae)
{
Console.WriteLine(ae.Message);
}
catch (IOException ie)
{
Console.WriteLine(ie.Message);
}
}
关注点
我在创建此控件时遇到的一个问题是,Environment
类中的 SpecialFolder enum
的 WPF 绑定不起作用。最初我认为这是由于 enum
是嵌套的,但实际上是因为 XAML 不支持嵌套类型。对此的解决方法是,对于嵌套的 enum
,使用 '+
' 代替 '.
' (例如:Environment+SpecialFolder.Desktop
)。
历史
- 2010 年 10 月 14 日:初始版本
- 2010 年 10 月 15 日:将 Prism 二进制文件添加到下载 zip 文件中