【WP 8.1开发】文件选取器的使用方法
在以往的WP7x/8.0开发中,我们使用选择器可以浏览并打开图片、音频、视频等一些特殊文件,在8.0 SDK中的运行时API(从Win 8 app中移植)尽管提供了Windows.Storage.Pickers命名空间,但里面的Picker是不能用的,到了8.1,随着移植的深入和WP的完善,这些Picker们终于可以派上用场了,比如用于打开文件的FileOpenPicker类,用来保存文件的FileSavePicker类等。
使用Picker的好处在于,文件类型不必被限制为特定的几个,而是可以根据实际需要设置文件扩展名,Picker们要比图片、音乐等选择器要灵活。当然,事情没有绝对的,我并没有说过去的选择器不好,只是要看用途而定,如果你的应用程序只需要选择图片,那么使用以前的PhotoChooserTask类也是不错的,至少用户不能乱选。
当应用程序要选取更多类型的文件时,使用Picker会更合理。一切没有最好,只有最合适,合适就好。
下文我会以打开文件的FileOpenPicker类为例,给各位讲讲如何使用Picker们。如果你了解过Win 8 app开发,你肯定会记得PickSingleFileAsync方法用来选取单个文件,PickMultipleFilesAsync方法用来选取多个文件,但是,这些方法在WP 8.1不再使用。WP 8.1中改用PickSingleFileAndContinue方法和PickMultipleFilesAndContinue方法,至于为什么,我估计是为了优化应用程序的UI线程资源。在WP8.1调用这些方法,会发生以下几件事:
1、离开当前应用程序;
2、显示用来选取文件的用户界面,用户可以在这里查找要选择的文件列表;
3、用户确认/放弃选择后,关闭选取界面,重新激活应用程序。所选取的文件将通过Windows.ApplicationModel.Activation.FileOpenPickerContinuationEventArgs类的Files属性获取。
我们可以根据以上内容,画一个大致的示意图。
应用程序首次启动时,应用页面是全新创建的,当然是以New方式;当选择文件时打开文件选取界面,只是暂时离开应用程序页面,而应用程序仍然存在于后台,因此,当选择完文件后,再次回到应用程序页面时,就会以Back方式导航到原来的应用程序页面。
对于运行时API比较好处理,在选择文件后会返回应用程序,可以通过重写Windows.UI.Xaml.Application.OnActivated()方法来得到用户选择的文件。那么,如果使用Silverlight框架呢?能够接收到文件吗?Silerlight框架中的Application类没有这些方法啊。
不用急,微软既然把API移植过来了,自然会相应的方法来处理的,接下来的例子也是以Silverlight框架为主的,你要是仅仅为WP开发应用而不考虚给Win平板开发应用的话,优先选用Silverlight框架会较好,因为:
1、SL在WP上经过从7到8的演进,比较成熟;
2、SL框架API包括的许多API比较适合手机应用,如启动器和选择器,这些在Win App中是没有的。
这里我先卖个关子,不把话完全说破,随后的示例完成过程中我会给大家说明。
1、打开VS开发环境,新建一个项目,项目模板为“空白应用程序(Silverlight)”。
2、现在,打开App.xaml.cs文件,你仔细找一下,是不是找到以下代码?
找到InitializePhoneApplication方法,看看里面是不是有这么一行代码?
private void InitializePhoneApplication ()
{
…… // 处理协定激活(如文件打开或保存选取器)
PhoneApplicationService.Current.ContractActivated += Application_ContractActivated; ……
}
看到没有?对,这就是这个ContractActivated事件,只要处理这个事件,当Picker选择文件后返回应用程序时,会调用这个方法,这样我们就可以接收到文件了。
private void Application_ContractActivated ( object sender, Windows.ApplicationModel.Activation.IActivatedEventArgs e )
{
……
}
到了这里,估计有经验的朋友已经知道怎么做了。
3、为了方便在应用页面代码中访问到被选取的文件列表,我们可以独立封装一个类,并公开一个静态的属性,里面包含用户选择的文件列表。
class PickFiles
{
private static List<StorageFile> files = null;
static PickFiles ()
{
if (files == null)
{
files = new List<StorageFile>();
}
} public static List<StorageFile> PickedFiles
{
get { return files; }
}
}
这样做的好处在于,在同一个应用程序内,无论哪里,代码都能访问到该类。
4、咱们开始设计界面,XAML代码如下:
<StackPanel>
<Button Content="选择文件" Click="OnClick"/>
<TextBlock Name="tb"
TextWrapping="Wrap"
FontSize="25"/>
</StackPanel>
界面严重简单,TextBlock用来显示被选取的文件的路径,按钮就不用介绍,当然是用来打开Picker界面的了。
5、处理代码如下:
private void OnClick ( object sender, RoutedEventArgs e )
{
FileOpenPicker picker = new FileOpenPicker();
picker.FileTypeFilter.Add("*");
picker.PickSingleFileAndContinue();
}
首先new一个FileOpenPicker,然后通过向FileTypeFilter列表中添加过滤字符,必须以点(.)开头,即文件的扩展名,你希望用户能浏览哪些文件,就添加相应的扩展名,如“.jpg”、“.docx”等,上面代码用了一个星号(*),表示可以查看所有文件,注意,只需要一个星号(*)即可,不要写成“*.*”。
随后调用PickSingleFileAndContinue方法就可以打开文件选取界面了。
6、前面说过,当用户结束文件选择操作后,会返回应用程序,这时候,PhoneApplicationService对象的ContractActivated事件会被触发,于是,接下来,我们要在App.xaml.cs文件中的Application_ContractActivated方法中加入代码,接收用户选择的文件,并存放到刚才自定义的PickFiles类的静态属性中。
private void Application_ContractActivated ( object sender, Windows.ApplicationModel.Activation.IActivatedEventArgs e )
{
if (e.Kind == Windows.ApplicationModel.Activation.ActivationKind.PickFileContinuation)
{
Windows.ApplicationModel.Activation.FileOpenPickerContinuationEventArgs ca = e as Windows.ApplicationModel.Activation.FileOpenPickerContinuationEventArgs;
PickFiles.PickedFiles.Clear();
foreach (var f in ca.Files)
{
PickFiles.PickedFiles.Add(f);
}
}
}
因为激活应用程序的协定可能很多,比如URI激活等,所以一定要用e.Kind来判断一下,是不是确实因为文件选取操作完成后导致应用程序被激活的,如果是,e的类型应为 Windows.ApplicationModel.Activation.FileOpenPickerContinuationEventArgs,因此需要进行一下类型转换。
接着通过foreach把用户选择的文件添加到自定义的类属性中。
7、回到应用程序页面的代码文件,前面说过,当Picker关闭后,会重新以Back方式导航回到我们的应用页面。故这里我们要重写页面的OnNavigatedTo方法,来显示文件的路径。
protected override void OnNavigatedTo ( NavigationEventArgs e )
{
if (e.NavigationMode == NavigationMode.Back && PickFiles.PickedFiles.Count > )
{
StorageFile file = PickFiles.PickedFiles[];
tb.Text = file.Path;
}
}
运行应用程序,点击按钮,选择一个文件,界面上会看到文件的路径。
为了证明当Picker关闭后,应用程序会返回到之前离开时的页面,本例使用了两个页面,打开Picker的是Page2.xaml页面,当用户完成文件选取操作后,应用程序会回到Page2.xaml页面而不是MainPage.xaml(除非你做了手脚)。
示例代码下载:http://files.cnblogs.com/tcjiaan/pickFileApp.zip
【WP 8.1开发】文件选取器的使用方法的更多相关文章
- Windows Store App JavaScript 开发:文件选取器
正如前面章节C#语言中所介绍的,文件选取器是应用与系统进行交互的一个接口,通过文件选取器可以在应用中直接与文件系统进行交互,访问不同位置的文件或文件夹,或者将文件存储在指定位置.文件选取器分为对文件进 ...
- Windows Store App 文件选取器
使用文件选取器可以访问除上面介绍的"应用程序存储"和"用户库"两个位置之外的本地文件或者文件夹.文件选取器是应用与系统进行交互的一个接口,通过文件选取器可以在应 ...
- Windows Store App JavaScript 开发:选取文件和文件夹
前面提到过,文件打开选取器由FileOpenPicker类表示,用于选取或打开文件,而文件夹选取器由FolderPicker类表示,用来选取文件夹.在FileOpenPicker类中,pickSing ...
- UWP入门(十一)--使用选取器打开文件和文件夹
原文:UWP入门(十一)--使用选取器打开文件和文件夹 很漂亮的功能,很有趣 重要的 API FileOpenPicker FolderPicker StorageFile 通过让用户与选取器交互来访 ...
- 重新想象 Windows 8 Store Apps (26) - 选取器: 自定义文件选取窗口, 自定义文件保存窗口
原文:重新想象 Windows 8 Store Apps (26) - 选取器: 自定义文件选取窗口, 自定义文件保存窗口 [源码下载] 重新想象 Windows 8 Store Apps (26) ...
- 背水一战 Windows 10 (95) - 选取器: 自定义文件保存选取器
[源码下载] 背水一战 Windows 10 (95) - 选取器: 自定义文件保存选取器 作者:webabcd 介绍背水一战 Windows 10 之 选取器 自定义文件保存选取器 示例1.演示如何 ...
- 背水一战 Windows 10 (94) - 选取器: 自定义文件打开选取器
[源码下载] 背水一战 Windows 10 (94) - 选取器: 自定义文件打开选取器 作者:webabcd 介绍背水一战 Windows 10 之 选取器 自定义文件打开选取器 示例1.演示如何 ...
- iOS开发-分页栏和选取器的使用
一.分页栏 创建一个新的项目,Subclass of的值选中UIViewController,然后在storyboard中删除根视图,在右下方拖出一个Tab Bar Controller 新增分页,只 ...
- 重新想象 Windows 8 Store Apps (25) - 选取器: 文件选取窗口, 文件夹选取窗口, 文件保存窗口
原文:重新想象 Windows 8 Store Apps (25) - 选取器: 文件选取窗口, 文件夹选取窗口, 文件保存窗口 [源码下载] 重新想象 Windows 8 Store Apps (2 ...
随机推荐
- Mac:文件夹树型展示 tree
目标: 想要在MAC的Terminal中查看文件夹中所有文件的树型结构及文件夹.文件树统计. 安装方法: 1.brew安装 官网:http://brew.sh/ brew是Mac中安装软件的神器,一定 ...
- javascript练习-子类调用父类的构造函数和方法
function NonNullSet(){ Set.apply(this,arguments); } NonNullSet.prototype = inherit(Set.prototype); N ...
- 在mac下svn冲突或其它什么原因无法更新svn副本或是必须要删除svn信息时,如何清除svn信息
find . -type d -name ".svn"|xargs rm -rf 出处: http://blog.csdn.net/springsky_/article/detai ...
- web
1.linux下交换文件 .index.php.swp 有时可查看源码2.当php后缀被过滤的时候可以直接对ph开头的后缀进行一个fuzz测试可以上传的文件后缀名3.curl -x 123.45.67 ...
- Windows下Oracle安装图解----oracle-win-64-11g 详细安装步骤
一. Oracle 下载 官方下地址 http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.htm ...
- 用canvas制作酷炫射击游戏--part3
今天介绍下 游戏中的sprite模块,也就是构建玩家及怪物的模块.有了这个模块,就可以在咱们的游戏里加入人物了. 想必用过css的朋友都知道sprite,一种将需要加载的图片拼接在一张图里以减少请求的 ...
- 【C++】自绘控件基础
由于我们对控件的功能.外观的需求,公共控件并不能很好地满足这一点,所以我们就得自绘控件. 自绘控件有许多方法,比如:处理WM_PAINT消息,设置ownDraw风格,处理WM_CTLCOLOR消息,等 ...
- Resellerclub –Cpanel 主机中如何设置 index 缺省首页
管理面板,点击[文件管理器],如图: ],如图 1. 进入 cPanel 管理面板,点击[文件管理器],如图: 选中[主目录] 显示隐藏文件],如图: ],如图 2. 选中[主目录]和[显示隐藏文件] ...
- Nodejs学习路线图
前言 用Nodejs已经1年有余,陆陆续续写了48篇关于Nodejs的博客文章,用过的包有上百个.和所有人一样,我也从Web开发开始,然后到包管 理,再到应用系统的开发,最后开源自己的Nodejs项目 ...
- vs的dll引用机制
vs2012编译的时候,遇到一个问题就是项目A中运行时缺失dll的问题,项目A引用类库B,类库B引用了x,y等dll,编译A项目的时候,出现x没拷贝到bin 目录. 通过跟踪编译输出发现,x没拷贝的原 ...