Win10的开发经常需要进行文件的操作,因此文件的选择对话框FileOpenPicker、文件保存对话框FileSavePicker以及文件夹选择对话框FolderPicker十分重要。这三者的操作也比较简单。但有一些小细节可能许多人没注意到,听我慢慢道来,精彩留在后面。

三个对话框的操作在MSDN文档中也讲解的比较细致了,同时也有许多相似之处,我分开一个个做个简单的介绍。

FileOpenPicker:

MSDN文档:链接

属性:(主要)

ViewMode:文件的展示形式。有两个可选的枚举值,PickerViewMode.Thumbnail(缩略图形式)和PickerViewMode.List(列表形式)

SuggestedStartLocation:对话框打开时的默认路径。枚举值,详见 MSDN文档

FileTypeFilter:可选择的文件类型。也就是你要打开的是什么类型的文件,如txt、doc、jpg等。可以使用其Add方法添加类型。这个很重要,如果不设置会抛出异常

方法:

FileOpenPicker只有两个方法,PickSingleFileAsync和PickMultipleFilesAsync。两者都是打开对话框,需要await修饰,区别从方法签名就可以看出。使用PickSingleFileAsync,用户只能选取一个文件,使用PickMultipleFilesAsync,用户可以选取多个文件。

下面是FileOpenPicker的简单操作:

 private async void FileOpen_Click(object sender, RoutedEventArgs e)
{
FileOpenPicker picker = new FileOpenPicker();
picker.ViewMode = PickerViewMode.List; //设置文件的现实方式,这里选择的是图标
picker.SuggestedStartLocation =PickerLocationId.PicturesLibrary; //设置打开时的默认路径,这里选择的是图片库
picker.FileTypeFilter.Add("*"); //添加可选择的文件类型,这个必须要设置 "*"表示所有文件
file = await picker.PickSingleFileAsync(); //只能选择一个文件 if (file!=null)
{
//to do something
}
}

FileSavePicker:

msdn文档:链接

属性:(主要)

DefaultFileExtension:默认文件的拓展名

FileTypeChoices:文件的保存类型

SuggestedFileName:默认保存的文件名

SuggestedStartLocation:默认的文件保存位置

方法:

FileSavePicker只有一个方法:PickSaveFileAsync,打开对话框,需要await修饰

示例:

private async void FileSave_Click()
{
FileSavePicker picker = new FileSavePicker();
picker.DefaultFileExtension = ".txt";
picker.FileTypeChoices.Add("Plain Text", new List<string>() { ".txt" });
picker.SuggestedFileName = "New Document";
picker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
StorageFile file = await picker.PickSaveFileAsync();
}

效果图:

尼玛,说好的精彩在后面呢?其实并没有什么精彩的,只是后面比前面的稍微比较有价值点

FolderPicker:

msdn文档:链接

属性:(主要)

几个主要的属性ViewMode、SuggestedStartLocation和FileTypeFilter都跟FileOpenPicker一样,就不多废话了。不过似乎设置FileTypeFilter并没有什么卵用,稍后说这个问题。

方法:QueryOptions

FolderPicker有两个方法,PickSingleFolderAsync和PickFolderAndContinue,打开文件夹选择器,都需要await修饰。前者用于WP中,后者用于PC上。

调用PickSingleFolderAsync获得folder之后,可以调用其.GetFilesAsync()方法获取当前文件夹下的文件。现在来说说那个没有什么卵用的FileTypeFilter。

看看下面几行代码:

private async void Folder_Click()
{
FolderPicker picker = new FolderPicker();
picker.FileTypeFilter.Add(".srt");
StorageFolder folder = await picker.PickSingleFolderAsync();
var files = await folder.GetFilesAsync();
int num = files.Count;
}

我的目的是读取桌面上的字幕文件(.srt)。运行后num的值为6,然而我的桌面是这样的,问题不言而喻了吧。没错虽然设置了FileTypeFilter,然而并没有什么卵用。

在传统的桌面程序中可以这么写,就可以得到正确的结果:

var file = Directory.GetFiles(folder, "*.srt");

解决方案:使用QueryOptions类

属性:

FileTypeFilter:同前面的一样,指定可选择的文件类型

FolderDepth:指示搜索查询是否应生成文件夹内容的浅表视图或所有文件和子文件夹的深递归视图。指示查询文件夹的深度的值。默认值为 FolderDepth.Shallow。预定义查询通常重写此属性并将其更改为 FolderDepth.Deep。(这是官方说的,其实我看不懂是什么东西)

IndexerOption:指定是否使用系统索引或文件系统来检索查询结果的值

然后就可以这么用了:

 private async void Folder_Click()
{
FolderPicker picker = new FolderPicker();
picker.FileTypeFilter.Add(".srt");
StorageFolder folder = await picker.PickSingleFolderAsync(); var queryOptions = new QueryOptions();
queryOptions.FileTypeFilter.Add(".srt");
//queryOptions.FolderDepth = FolderDepth.Shallow;
//queryOptions.IndexerOption = IndexerOption.DoNotUseIndexer; var query = folder.CreateFileQueryWithOptions(queryOptions);
var files = await query.GetFilesAsync(); int num = files.Count;
}

运行结果num为2,是正确的。到此FolderPicker的功能基本讲解完毕。

其实在查阅资料时,还发现了这么一个类:FileInformationFactory,官方解释是“用于从查询结果加载有关文件和文件夹的信息,并将这些文件系统项绑定到 JavaScript ListView 或 XAML ListView 和 GridView 控件。加载信息后,应用程序可使用同步操作快速访问该信息。”不太懂这段话的意思,以后用到了再回来补充吧。

最新文章

  1. C#GDI+编程基础(二)
  2. WPFの三种方式实现快捷键
  3. makefile 中 $@ $^ %&lt; 使用【转】
  4. 【英语】Bingo口语笔记(12) - Put系列
  5. 车牌识别LPR(三)-- LPR系统整体结构
  6. WIN7建立网络映射磁盘
  7. HDU4619+匈牙利
  8. 级联分类器训练-----OpenCV
  9. iOS关于应用内分享
  10. java基础(十五章)
  11. Ubuntu软件中心卡在正在应用更改的解决办法
  12. dubbox系列【一】——dubbox简介
  13. 用挂载,使用NTFS移动硬盘,拷贝iPhone里的照片,拷到MAC
  14. WEB 实时推送技术的总结
  15. MATLAB数值积分法
  16. Django后端项目---- rest framework(3)
  17. Tomcat指定JDK路径(Linux+Windows)
  18. python2和3的区别 高清大图:)
  19. [原]C# 常用函数统计
  20. 论文笔记:语音情感识别(二)声谱图+CRNN

热门文章

  1. Touch ID使用
  2. android gradle NDK简介
  3. C语言基于GTK+Libvlc实现的简易视频播放器(二)
  4. Mysql时间类型处理
  5. 《java JDK7 学习笔记》之对象封装
  6. oracle数据库rman备份计划及恢复
  7. ORACLE 解锁、找回表和找回程序语句
  8. Android原生游戏开发:使用JustWeEngine开发微信打飞机
  9. HTTPS----安全超文本传输协议
  10. 2016的ChinaJoy沦为ChinaVR?