原文:重新想象 Windows 8 Store Apps (26) - 选取器: 自定义文件选取窗口, 自定义文件保存窗口

[源码下载]

重新想象 Windows 8 Store Apps (26) - 选取器: 自定义文件选取窗口, 自定义文件保存窗口

作者:webabcd

介绍
重新想象 Windows 8 Store Apps 之 选取器

  • FileOpenPickerUI - 自定义文件打开选取器
  • FileSavePickerUI - 自定义文件保存选取器

示例
1、 开发一个自定义文件选取窗口。注:如果需要激活自定义的文件选取窗口,请在弹出的选取器窗口的左上角选择对应 Provider
Picker/MyOpenPicker.xaml

<Page
x:Class="XamlDemo.Picker.MyOpenPicker"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XamlDemo.Picker"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<StackPanel Margin="120 0 0 0"> <TextBlock Name="lblMsg" FontSize="14.667" /> <Button Name="btnPickLocalFile" Content="选择一个本地文件" Click="btnPickLocalFile_Click_1" Margin="0 10 0 0" /> <Button Name="btnPickRemoteFile" Content="选择一个远程文件" Click="btnPickRemoteFile_Click_1" Margin="0 10 0 0" /> </StackPanel>
</Grid>
</Page>

Picker/MyOpenPicker.xaml.cs

/*
* 演示如何开发自定义文件打开选取器
*
* 1、在 Package.appxmanifest 中新增一个“文件打开选取器”声明,并做相关配置
* 2、在 App.xaml.cs 中 override void OnFileOpenPickerActivated(FileOpenPickerActivatedEventArgs args),如果 app 是由文件打开选取器激活的,则可以在此获取其相关信息
*
* FileOpenPickerActivatedEventArgs - 通过“文件打开选取器”激活应用程序时的事件参数
* FileOpenPickerUI - 获取 FileOpenPickerUI 对象
* PreviousExecutionState, Kind, SplashScreen - 各种激活 app 的方式的事件参数基本上都有这些属性,就不多说了
*
* FileOpenPickerUI - 自定义文件打开选取器的帮助类
* AllowedFileTypes - 允许的文件类型,只读
* SelectionMode - 选择模式(FileSelectionMode.Single 或 FileSelectionMode.Multiple)
* Title - 将在“自定义文件打开选取器”上显示的标题
* CanAddFile(IStorageFile file) - 是否可以将指定的文件添加进选中文件列表
* AddFile(string id, IStorageFile file) - 将文件添加进选中文件列表,并指定 id
* ContainsFile(string id) - 选中文件列表中是否包含指定的 id
* RemoveFile(string id) - 根据 id 从选中文件列表中删除对应的文件
* FileRemoved - 从选中文件列表中删除文件时触发的事件
* Closing - 用户关闭“自定义文件打开选取器”时触发的事件
*/ using System;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.Storage;
using Windows.Storage.Pickers.Provider;
using Windows.Storage.Provider;
using Windows.Storage.Streams;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation; namespace XamlDemo.Picker
{
public sealed partial class MyOpenPicker : Page
{
private FileOpenPickerUI _fileOpenPickerUI; public MyOpenPicker()
{
this.InitializeComponent();
} protected override void OnNavigatedTo(NavigationEventArgs e)
{
// 获取 FileOpenPickerUI 对象
var args = (FileOpenPickerActivatedEventArgs)e.Parameter;
_fileOpenPickerUI = args.FileOpenPickerUI; _fileOpenPickerUI.Title = "自定义文件打开选取器"; // _fileOpenPickerUI.Closing += _fileOpenPickerUI_Closing;
// _fileOpenPickerUI.FileRemoved += _fileOpenPickerUI_FileRemoved;
} protected override void OnNavigatedFrom(NavigationEventArgs e)
{
// _fileOpenPickerUI.Closing -= _fileOpenPickerUI_Closing;
// _fileOpenPickerUI.FileRemoved -= _fileOpenPickerUI_FileRemoved;
} // 选择一个本地文件
private async void btnPickLocalFile_Click_1(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
/*
* 注意:
* 1、选择的文件的扩展名必须匹配 FileOpenPicker.FileTypeFilter 中的定义
* 2、如果通过 KnownFolders.DocumentsLibrary 等选择文件,除了要在 Package.appxmanifest 选择对应的“库”功能外,还必须在 Package.appxmanifest 中的“文件类型关联”声明中增加对相应的的扩展名的支持
*/ StorageFile file = await Package.Current.InstalledLocation.GetFileAsync(@"Assets\Logo.png");
AddFileResult result = _fileOpenPickerUI.AddFile("myFile", file); lblMsg.Text = "选择的文件: " + file.Name;
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "AddFileResult: " + result.ToString();
} // 选择一个远程文件
private async void btnPickRemoteFile_Click_1(object sender, Windows.UI.Xaml.RoutedEventArgs e)
{
Uri uri = new Uri("http://images.cnblogs.com/mvpteam.gif", UriKind.Absolute); // 扩展名必须匹配 FileOpenPicker.FileTypeFilter 中的定义
StorageFile file = await StorageFile.CreateStreamedFileFromUriAsync("mvp.gif", uri, RandomAccessStreamReference.CreateFromUri(uri));
AddFileResult result = _fileOpenPickerUI.AddFile("myFile", file); lblMsg.Text = "选择的文件: " + file.Name;
lblMsg.Text += Environment.NewLine;
lblMsg.Text += "AddFileResult: " + result.ToString();
}
}
}

判断程序是否是由文件打开选取器激活,在 App.xaml.cs 中 override void OnFileOpenPickerActivated(FileOpenPickerActivatedEventArgs args)

// 通过文件打开选取器激活应用程序时所调用的方法
protected override void OnFileOpenPickerActivated(FileOpenPickerActivatedEventArgs args)
{
var rootFrame = new Frame();
rootFrame.Navigate(typeof(XamlDemo.Picker.MyOpenPicker), args);
Window.Current.Content = rootFrame; Window.Current.Activate();
}

2、 开发一个自定义文件保存窗口。注:如果需要激活自定义的文件保存窗口,请在弹出的选取器窗口的左上角选择对应 Provider
Picker/MySavePicker.xaml

<Page
x:Class="XamlDemo.Picker.MySavePicker"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:local="using:XamlDemo.Picker"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"> <Grid Background="Transparent">
<StackPanel Margin="120 0 0 0"> <TextBlock Name="lblMsg" FontSize="14.667" /> </StackPanel>
</Grid>
</Page>

Picker/MySavePicker.xaml.cs

/*
* 演示如何开发自定义文件保存选取器
*
* 1、在 Package.appxmanifest 中新增一个“文件保存选取器”声明,并做相关配置
* 2、在 App.xaml.cs 中 override void OnFileSavePickerActivated(FileSavePickerActivatedEventArgs args),如果 app 是由文件保存选取器激活的,则可以在此获取其相关信息
*
* FileSavePickerActivatedEventArgs - 通过“文件保存选取器”激活应用程序时的事件参数
* FileSavePickerUI - 获取 FileSavePickerUI 对象
* PreviousExecutionState, Kind, SplashScreen - 各种激活 app 的方式的事件参数基本上都有这些属性,就不多说了
*
* FileSavePickerUI - 自定义文件保存选取器的帮助类
* AllowedFileTypes - 允许的文件类型,只读
* Title - 将在“自定义文件保存选取器”上显示的标题
* FileName - 需要保存的文件名(包括文件名和扩展名),只读
* TrySetFileName(string value) - 尝试指定需要保存的文件名(包括文件名和扩展名)
* FileNameChanged - 用户在文件名文本框中更改文件名或在文件类型下拉框中更改扩展名时触发的事件
* TargetFileRequested - 用户提交保存时触发的事件(事件参数:TargetFileRequestedEventArgs)
*
* TargetFileRequestedEventArgs
* Request - 返回 TargetFileRequest 对象
*
* TargetFileRequest
* TargetFile - 目标文件对象,用于返回给 client
* GetDeferral() - 获取异步操作对象,同时开始异步操作,之后通过 Complete() 通知完成异步操作
*/ using System;
using Windows.ApplicationModel.Activation;
using Windows.Storage;
using Windows.Storage.Pickers.Provider;
using Windows.UI.Core;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation; namespace XamlDemo.Picker
{
public sealed partial class MySavePicker : Page
{
private FileSavePickerUI _fileSavePickerUI; public MySavePicker()
{
this.InitializeComponent();
} protected override void OnNavigatedTo(NavigationEventArgs e)
{
// 获取 FileSavePickerUI 对象
var args = (FileSavePickerActivatedEventArgs)e.Parameter;
_fileSavePickerUI = args.FileSavePickerUI; _fileSavePickerUI.Title = "自定义文件保存选取器"; _fileSavePickerUI.TargetFileRequested += _fileSavePickerUI_TargetFileRequested;
} protected override void OnNavigatedFrom(NavigationEventArgs e)
{
_fileSavePickerUI.TargetFileRequested -= _fileSavePickerUI_TargetFileRequested;
} private async void _fileSavePickerUI_TargetFileRequested(FileSavePickerUI sender, TargetFileRequestedEventArgs args)
{
// 异步操作
var deferral = args.Request.GetDeferral(); try
{
// 在指定的地址新建一个没有任何内容的空白文件
StorageFile file = await ApplicationData.Current.LocalFolder.CreateFileAsync(sender.FileName, CreationCollisionOption.GenerateUniqueName); // 设置 TargetFile,“自定义文件保存选取器”的调用端会收到此对象
args.Request.TargetFile = file;
}
catch (Exception ex)
{
// 输出异常信息
OutputMessage(ex.ToString());
}
finally
{
// 完成异步操作
deferral.Complete();
}
} private async void OutputMessage(string msg)
{
await Dispatcher.RunAsync(CoreDispatcherPriority.Normal, () =>
{
lblMsg.Text = msg;
});
}
}
}

判断程序是否是由文件保存选取器激活,在 App.xaml.cs 中 override void OnFileSavePickerActivated(FileSavePickerActivatedEventArgs args)

// 通过文件保存选取器激活应用程序时所调用的方法
protected override void OnFileSavePickerActivated(FileSavePickerActivatedEventArgs args)
{
var rootFrame = new Frame();
rootFrame.Navigate(typeof(XamlDemo.Picker.MySavePicker), args);
Window.Current.Content = rootFrame; Window.Current.Activate();
}

OK
[源码下载]

重新想象 Windows 8 Store Apps (26) - 选取器: 自定义文件选取窗口, 自定义文件保存窗口的更多相关文章

  1. 重新想象 Windows 8 Store Apps (40) - 剪切板: 复制/粘贴文本, html, 图片, 文件

    [源码下载] 重新想象 Windows 8 Store Apps (40) - 剪切板: 复制/粘贴文本, html, 图片, 文件 作者:webabcd 介绍重新想象 Windows 8 Store ...

  2. 重新想象 Windows 8 Store Apps 系列文章索引

    [源码下载][重新想象 Windows 8.1 Store Apps 系列文章] 重新想象 Windows 8 Store Apps 系列文章索引 作者:webabcd 1.重新想象 Windows ...

  3. 重新想象 Windows 8 Store Apps (28) - 选取器: CachedFileUpdater(缓存文件更新程序)

    原文:重新想象 Windows 8 Store Apps (28) - 选取器: CachedFileUpdater(缓存文件更新程序) [源码下载] 重新想象 Windows 8 Store App ...

  4. 重新想象 Windows 8 Store Apps (27) - 选取器: 联系人选取窗口, 自定义联系人选取窗口

    原文:重新想象 Windows 8 Store Apps (27) - 选取器: 联系人选取窗口, 自定义联系人选取窗口 [源码下载] 重新想象 Windows 8 Store Apps (27) - ...

  5. 重新想象 Windows 8 Store Apps (25) - 选取器: 文件选取窗口, 文件夹选取窗口, 文件保存窗口

    原文:重新想象 Windows 8 Store Apps (25) - 选取器: 文件选取窗口, 文件夹选取窗口, 文件保存窗口 [源码下载] 重新想象 Windows 8 Store Apps (2 ...

  6. 重新想象 Windows 8 Store Apps (37) - 契约: Settings Contract

    [源码下载] 重新想象 Windows 8 Store Apps (37) - 契约: Settings Contract 作者:webabcd 介绍重新想象 Windows 8 Store Apps ...

  7. 重新想象 Windows 8 Store Apps (60) - 通信: 获取网络信息, 序列化和反序列化

    [源码下载] 重新想象 Windows 8 Store Apps (60) - 通信: 获取网络信息, 序列化和反序列化 作者:webabcd 介绍重新想象 Windows 8 Store Apps ...

  8. 重新想象 Windows 8 Store Apps (69) - 其它: 自定义启动屏幕, 程序的运行位置, 保持屏幕的点亮状态, MessageDialog, PopupMenu

    [源码下载] 重新想象 Windows 8 Store Apps (69) - 其它: 自定义启动屏幕, 程序的运行位置, 保持屏幕的点亮状态, MessageDialog, PopupMenu 作者 ...

  9. 重新想象 Windows 8 Store Apps (19) - 动画: 线性动画, 关键帧动画, 缓动动画

    原文:重新想象 Windows 8 Store Apps (19) - 动画: 线性动画, 关键帧动画, 缓动动画 [源码下载] 重新想象 Windows 8 Store Apps (19) - 动画 ...

随机推荐

  1. [docker]docker的四种网络方式

    声明: 本博客欢迎转发,但请保留原作者信息! 博客地址:http://blog.csdn.net/halcyonbaby 内容系本人学习.研究和总结,如有雷同,实属荣幸! bridge方式(默认) H ...

  2. 如何制作python安装模块(setup.py)

    Python模块的安装方法: 1. 单文件模块:直接把文件拷贝到$python_dir/lib 2. 多文件模块,带setup.py:python setup.py install 3. egg文件, ...

  3. No-Touch Integration 在SharePoint中使用社区支持的Silverlight应用程序

    No-Touch Integration 在SharePoint中使用社区支持的Silverlight应用程序         No-Touch Integration应该是最简单的方法了.将Silv ...

  4. HTML5系列之——applicationCache对象

    ApplicationCache主要简单介绍: applicationCache对象实现HTML5相应WEB离线功能.以下我们来主要解说applicationCache对象的一些主要功能和方法 app ...

  5. Android开发 - ActivityLifecycleCallbacks用法初探

    ActivityLifecycleCallbacks是什么? Application通过此接口提供了一套回调方法,用于让开发人员对Activity的生命周期事件进行集中处理. 为什么用Activity ...

  6. matlab矩阵的表示和简单操作

    原地址:http://www.cnblogs.com/Ran_Ran/archive/2010/12/11/1903070.html 一.矩阵的表示在MATLAB中创建矩阵有以下规则: a.矩阵元素必 ...

  7. 在Sublime Text3中运行PHP代码

    一.前言 最近由于工作需要要与第三方系统对接,另外由于文档中关于其中几个接口就只有很简单的描述,弄了半天都没有弄成功.跟第三方负责的人沟通后还是没有找到具体问题出在哪里,另外因为他们没有开发人员懂.n ...

  8. 6 款好用的 PC+Android 同步 GTD 软件

    6 款好用的 PC+Android 同步 GTD 软件 最近老鼠工作积极性比较高(其实只要是买平板电脑的欲望在鼓舞着干劲),所以每天很多任务安排,为了不混乱,免不了要用 GTD(Go to do)软件 ...

  9. poj1804(归并排序求逆序数)

    逆序数.也就是说,对于n个不同的元素,先规定各元素之间有一个标准次序(比如n个 不同的自然数,可规定从小到大为标准次序),于是在这n个元素的任一排列中,当某两个元素的先后次序与标准次序不同一时候,就说 ...

  10. 《javascript高级编程》读书笔记(三)变量、范围和内存的问题

     第四章:变量.范围和内存的问题 检測类型:typeof是确定一个变量是字符串.数值.布尔值,还是undefined的最佳工具.可是假设变量的值是一个对象或null,typeof仅仅会返回" ...