65.9K
CodeProject 正在变化。 阅读更多。
Home

WPF 文件夹浏览器

2010年10月15日

Ms-PL

2分钟阅读

viewsIcon

181619

downloadIcon

9292

一个 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 的形式表示,它接收一个 ObservableCollectionFolderViewModels 来表示子文件夹。文件夹对话框中的 treeview 绑定到这个 FolderViewModelFolderViewModel 实现 IsExpandedIsSelected 属性,以向 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 文件中
© . All rights reserved.