在Windows 7 中有些我们经常使用的库(Libraries),例如:音乐库、文档库、视频库、图片库等。还有几十个系统已知文件夹(Known Folders),System、Windows、My Music等。本篇将介绍如何通过Windows API Code Pack 在应用程序中调用这些公共文件夹。
将Microsoft.WindowsAPICodePack.dll、Microsoft.WindowsAPICodePack.Shell.dll 加入项目中,编写如下XAML 代码,两个<ComboBox> 用来显示Known Folders 和Libraries 选项。
<Grid> <Label Content="Know Folders:" Height="30" Width="100" Margin="47,70,356,211" /> <Label Content="Libraries:" Height="30" Width="100" Margin="48,191,355,90" /> <ComboBox x:Name="knowFolders" Width="200" Height="25" Margin="186,70,117,211" /> <ComboBox x:Name="libraries" Width="200" Height="25" Margin="186,190,117,90" /> <Button x:Name="openKF" Click="openKF_Click" Content="Open Dialog" Height="30" Width="90" Margin="296,126,116,155" /> <Button x:Name="openLB" Click="openLB_Click" Content="Open Dialog" Height="30" Width="90" Margin="296,250,117,31" /> </Grid>
在C# 中加入如下命名空间,Shell 用于支持加载公共文件夹,Dialogs用于调用文件夹对话框。
using Microsoft.WindowsAPICodePack.Shell; using Microsoft.WindowsAPICodePack.Dialogs;
接下了编写一个ComboBox 加载方法填充上面提到的两个<ComboBox> 内容,通过IKnownFolder 接口获取所有KnownFolders 类中的系统已知文件夹。
private void LoadCombox() { knowFolders.Items.Clear(); foreach (IKnownFolder kf in KnownFolders.All) { if (kf != null && kf.CanonicalName != null) { knowFolders.Items.Add(kf.CanonicalName); } } if (knowFolders.Items.Count > 0) { SortDescription kfSort = new SortDescription(); knowFolders.Items.SortDescriptions.Add(kfSort); knowFolders.SelectedIndex = 0; } libraries.Items.Clear(); libraries.Items.Add("Documents"); libraries.Items.Add("Music"); libraries.Items.Add("Pictures"); libraries.Items.Add("Videos"); libraries.SelectedIndex = 0; }
Known Foloder “Open Dialog” 按钮Click 事件,通过CommonOpenFileDialog 类创建对话框,将KnowFolder 初始化为ShellContainer。
private void openKF_Click(object sender, RoutedEventArgs e) { CommonOpenFileDialog cfd = new CommonOpenFileDialog(); string kfString = knowFolders.SelectedItem as string; IKnownFolder kf = KnownFolderHelper.FromCanonicalName(kfString); cfd.InitialDirectoryShellContainer = kf as ShellContainer; cfd.ShowDialog(); }
Libraries “Open Dialog” 按钮Click 事件:
private void openLB_Click(object sender, RoutedEventArgs e) { string selection = libraries.SelectedItem as string; ShellContainer selectedFolder = null; switch (selection) { case "Documents": selectedFolder = KnownFolders.DocumentsLibrary as ShellContainer; break; case "Music": selectedFolder = KnownFolders.MusicLibrary as ShellContainer; break; case "Pictures": selectedFolder = KnownFolders.PicturesLibrary as ShellContainer; break; case "Videos": selectedFolder = KnownFolders.VideosLibrary as ShellContainer; break; } CommonOpenFileDialog cfd = new CommonOpenFileDialog(); cfd.EnsureReadOnly = true; cfd.InitialDirectoryShellContainer = selectedFolder; cfd.ShowDialog(); }
编译测试:
源代码 CommonFileDialog.zip