Introduction
This is a folder browser for WPF similar to the one found in Windows forms. WPF currently does not provide a Folder browser dialog and the only thing near enough is the Microsoft.Win32.OpenFileDialog
class in WPF's PresentationFramework.dll assembly which lets users specify multiple files to open.
Using the Code
The code contains only one XAML file which houses different parts of the dialog. The dialog is loosely based on the Windows file/ folder dialog model as it has a commonly selected folder area and a Windows explorer style treeview
. The selected folder is displayed in the textbox
at the bottom of the dialog. The code uses MVVM and has a dependency on the latest prism binaries but this is for the DelegateCommand
only. The main ViewModel
which the dialog binds to is the BrowserViewModel
, this initializes the treeview
to point to all the drives on the machine. It has a SelectedFolder
property & a FolderSelected DelegateCommand
which is invoked when the user selects a common folder on the left.
public DelegateCommand<object> FolderSelectedCommand
{
get
{
return new DelegateCommand<object>(it => SelectedFolder =
Environment.GetFolderPath((Environment.SpecialFolder)it));
}
}
The folders themselves are expressed in terms of a FolderViewModel
which takes an ObservableCollection
of FolderViewModels
to represent sub folders. The treeview
in the folder dialog is bound to this FolderViewModel
. The FolderViewModel
implements IsExpanded
& IsSelected
properties to add functionality to the TreeViewItem
state, i.e., to dynamically load sub folders on selection/expansion of a node. Selecting a node also expands it similar to the Windows Explorer.
private void LoadFolders()
{
try
{
if (Folders.Count > 0)
return;
string[] dirs = null;
string fullPath = Path.Combine(FolderPath, FolderName);
if (FolderName.Contains(':')) 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);
}
}
Points of Interest
One of the things I came across while creating this control was that the WPF binding for the SpecialFolder enum
in the Environment
class did not work. Initially I thought that this was due to the enum
being nested, but actually it is due to the fact that nested types are not supported in XAML. A workaround for this was to append a '+
' instead of a '.
' for the nested enum
(e.g.: Environment+SpecialFolder.Desktop
).
History
- 14th October, 2010: Initial version
- 15th October, 2010: Added Prism binaries to download zip