Win8和Windows Phone 8.1资源桥梁:FileOpenPicker

鉴于之前我有一篇博客讲访问手机SD卡中的文件的,那个是原先知道了文件的路径或者说知道了文件放在那里,所以

通过代码直接获取,当然是行得通的。但是很多情况下我们不知道我们要的文件在SD卡的哪里,我们要慢慢逐层查

找,然后选中后才行。这时就需要FileOpenPicker了。

访问手机SD卡文件的博客地址:Windows Phone8.1中SD卡文件的读取写入方法汇总

打个比方,一张自拍照,大部分女生呢要用美图秀秀啊等美图软件修的美美的才能上传到各个社交网站上去。当我们

要完成这个需求,我们的步骤是什么呢?

第一种呢,当然可以直接打开相册,找到自拍照,选择编辑方式,链接到美图秀秀软件打开即可(这种链接应用的方

式也很常用,有必要掌握,这篇博客不做介绍)

第二种呢,性子急的是直接打开美图秀秀,然后美图里有个按钮让你选择你手机相册中的具体那张图片,这时跳出来

的让你再手机中逐层查找图片,最终选择到自拍照的过程就是FileOpenPicker来实现的。

微软官方链接:FileOpenPicker

好了,知道了为什么需要这个东西,那么该了解下FilePicker的一些常见的属性:

(很多属性按字面意思来思考即可,并不是很难理解。其实看微软官方链接更好更详细,很有帮助)

1.ViewMode(PickerViewMode类型) ------   呈现项目的视图模式  List/Thumbnail  项的列表/缩略图像集

2.SuggestedStartLocation(PickerLoactionId类型)  --------- 呈现给我们的文件的起始位置 documents/videos

/pictures/musicLibary  downloads   desktop    homeGroup

3.CommitButtonText  ------  选择文件后我们要按的确认按钮上面的文字

4.SettingIdentifier   -------   用到多个FileOpenPicker时给单个FileOpenPicker作的标识以示区分

注意:以上属性在Windows Phone 8.1中无效

5.FileTypeFilter  ------  文档类型集合,其实就可以看作是文件格式的过滤器,只筛选我们想要看的格式的文件

搞定了属性,有了一个大概的了解,就可以动手了

对于Windows 8及8.1的平台,两者可能有一些小不同,但是基本都是一致的,版本的升级没有改动多少。

直接上伪代码:

FileOpenPicker picker = new FileOpenPicker();
//设置打开的显示模式
picker.ViewMode = PickerViewMode.List;
//起始打开文档显示的窗口,这边选择的是桌面
picker.SuggestedStartLocation = PickerLocationId.Desktop;
//其实就是过滤的作用,规定你要打开的是.txt文件
picker.FileTypeFilter.Add(".txt");
// PickMultipleFilesAsync是选取多个文件,
// PickSingleFileAsync选取单个文件
StorageFile file = await picker.PickSingleFileAsync();
if (file != null)
{
	//返回的是文件名
	txtTitle.Text = file.Name;
	//返回的是文件路径
	//txtTitle.Text = file.Path;
	var stream = await file.OpenStreamForReadAsync();
	StreamReader sr = new StreamReader(stream);
	//这个是在你的.txt文本是以ANSI(国标)编码的时候要规定encoding
	//StreamReader sr = new StreamReader(stream,Encoding.GetEncoding("GB2312"));
	string txt = await sr.ReadToEndAsync();
	txtContent.Text = txt;
}

而Windows Phone平台的就不一样了,远比Windows来的麻烦些,WP8与WP8.1间的版本迭代也是有一些不同的

那么Windows Phone麻烦在哪里呢。

其一是手机存在着当FileOpenPicker起作用的时候,应用被挂起了,当FileOpenPicker选择完成后,应用又要恢复过

来的情况,所以这个时候重写OnActivated事件和ContinueFileOpenPicker函数就显得关键和必要了

其二是Windows平台中的FileOpenPicker的选取单个或者多个文件的属性对应着PickerSingleFileAsync()和

PickMultipleFilesAsync(),虽说是异步的,就一个async和一个await就搞定了。而Windows Phone平台就只能

PickSingleFileAndContinue()和PickMultipleFilesAndContinue(),这个就是配合第一点的,处理起来麻烦。

总之一点,麻烦就麻烦在如何在调用文件选取器后继续运行 Windows Phone 应用。下面给出微软的解释和解决方

案,大家看一下基本上就明白了,如果还是觉得太凌乱了,我的也可以将就看看了。

官方的解释和解决方案:如何在调用文件选取器后继续运行 Windows Phone 应用 (XAML)

麻烦归麻烦,问题终究要解决的。而解决此问题分三大步,至于每一步的原因上面都做了解答。

首先要在App.xaml.cs中重写OnActivated()事件

protected override void OnActivated(IActivatedEventArgs args)
{
    if(args is FileOpenPickerContinuationEventArgs)
    {
        Frame rootFrame = Window.Current.Content as Frame;
        if(!rootFrame.Navigate(typeof(RepresentBook)))
        {
            throw new Exception("Failed to create target page");
        }

        var page = rootFrame.Content as RepresentBook;
        page.FileOpenPickerEvent = (FileOpenPickerContinuationEventArgs)args;
    }
    Window.Current.Activate();
}

其次在对应的页面的.cs中实例化FileOpenPicker对象,把该有的属性都设置好

private void findBtn_Click(object sender, RoutedEventArgs e)
{
    //清空错误信息
    txtTip.Text = "";

    //实例化FileOpenPicker对象-文件选取器
    FileOpenPicker picker = new FileOpenPicker();
    //设置打开的显示模式,这个在WP8.1上不起作用,而在Win8.1上还是有用的
    //picker.ViewMode = PickerViewMode.Thumbnail;
    //其实打开文档显示的窗口,这个在WP8.1上不起作用,而在Win8.1上还是有用的
    //picker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
    //规定打开的文件格式
    picker.FileTypeFilter.Add(".txt");
    //利用ContinuationData 来记录一些信息,以保证应用恢复时能获取应用挂起的信息
    picker.ContinuationData["Operation"] = "Text";
    //提交按钮上显示的文本,在WP8.1上不起作用,在Win8.1上还是有用的
    //picker.CommitButtonText = "找书";
    //设置可选取单个文件还是多个文件
    picker.PickSingleFileAndContinue();
}

最后利用FileOpenPicker的页面处理函数ContinueFileOpenPicker处理返回的数据

这个首先要给页面这个类定义一个属性,就是get,set嘛

private FileOpenPickerContinuationEventArgs _fileOpenPickerEventArgs = null;

public FileOpenPickerContinuationEventArgs FileOpenPickerEvent
{
    get { return _fileOpenPickerEventArgs; }
    set
    {
        _fileOpenPickerEventArgs = value;
        ContinueFileOpenPicker(_fileOpenPickerEventArgs);
    }
}

然后利用ContinueFileOpenPicker函数处理返回数据

public void ContinueFileOpenPicker(FileOpenPickerContinuationEventArgs args)
{
    if ((args.ContinuationData["Operation"] as string) == "Text" && args.Files != null && args.Files.Count > 0)
    {
        StorageFile file = args.Files[0];

        List<BookInfo> bookinfo = new List<BookInfo>();

        Random random = new Random();
        int ran = random.Next(1, 6);
        string imguri = "Assets/Images/" + ran + ".jpg";

        int length = localSettings.Values.Count+1;
        string key = "booklist" + length.ToString();
        if (!localSettings.Containers.ContainsKey(key))
        {
            ApplicationDataCompositeValue composite = new ApplicationDataCompositeValue();
            composite["bookimg"] = imguri;
            composite["bookname"] = file.Name;
            composite["bookpath"] = file.Path;

            if(localSettings.Values.Count==0)
            {
                localSettings.Values[key] = composite;
            }
            else
            {
                for (int i = 1; i < localSettings.Values.Count + 1; i++)
                {
                    ApplicationDataCompositeValue composite2 = new ApplicationDataCompositeValue();
                    composite2 = (ApplicationDataCompositeValue)localSettings.Values["booklist" + i.ToString()];
                    if (composite2["bookname"].ToString()==file.Name)
                    {
                        txtTip.Text = "列表中已存在此书籍!";
                    }
                }
                if(txtTip.Text=="")
                {
                    localSettings.Values[key] = composite;
                }
            }

        }
        if(localSettings.Values.Count!=0)
        {
            for (int i = 1; i < localSettings.Values.Count+1;i++ )
            {
                ApplicationDataCompositeValue composite = new ApplicationDataCompositeValue();
                composite = (ApplicationDataCompositeValue)localSettings.Values["booklist" + i.ToString()];
                bookinfo.Add(new BookInfo { bookImg = composite["bookimg"].ToString(), bookName = composite["bookname"].ToString(), bookPath = composite["bookpath"].ToString() });
            }
            listbox.ItemsSource = bookinfo;
        }

    }
}

以上都是伪代码,大家弄清楚思想即可。

推荐链接:

编程小梦:windows phone 8.1开发:文件选择器FileOpenPicker

时间: 2024-11-09 00:47:18

Win8和Windows Phone 8.1资源桥梁:FileOpenPicker的相关文章

Windows Server 2012 将资源发布到 AD DS

企业IT资源丰富起来之后,会发现查找和使用某个资源很费劲,那么管理员可以使用 AD DS 资源发布功能来将IT资源发布到AD DS中,以便于域用户查找和使用.可以发布的资源包含用户对象.计算机对象.共享打印机.共享文件夹等等,下面咱们就介绍一下如果将比较常用的两类对象发布出来. 示例:将server01中的共享文件夹public发布到AD  DS中,供企业员工访问 步骤1:Server01服务器上将public文件夹共享起来,这个比较简单,如下图所示: 然后,我们打开管理工具----Active

Windows Server 2008共享资源所遇到问题设置步骤详解

很多人认为访问共享资源很简单,只要先找到共享资源,之后双击共享目标,再登录进去就可以进行访问操作了.事实上,这其中的每一步操作都可能会受到Windows系统的限制;这不,当我们尝试访问Windows Server 2008系统中的共享资源时,该系统就对其中的每一个环节设置了障碍,我们必须对症下药进行合理设置,才能扫清障碍,让共享访问一路绿灯. 1.扫清看不见障碍 按理来说,从局域网中的普通计算机中,打开网上邻居窗口就能看到目标共享资源了;可是,Windows Server 2008系统中的共享资

Windows Store App 全球化 资源匹配规则

上面几个小节通过示例介绍了如何引用资源以及设置应用语言来显示不同语言的信息,这些示例都只是添加了简体中文和英语两种语言来显示资源,而在一些复杂的应用程序中,字符串资源可能会被定义成多种语言,文件资源也可能为了根据不同的环境显示不同的效果而在程序中存储多种版本,这时应用程序就需要根据使用情况选取最匹配的资源作为应用的首选资源,本小节将通过示例模拟应用选取匹配资源的过程. 1.匹配规则 在应用程序运行时,应用对资源的选取受许多方面的因素的影响,例如系统的语言.屏幕的大小.分辨率和对比度等.应用程序的

windows 编程 —— 菜单以及其他资源

目录: 1.资源的种类 2.资源的定义方法(IDE:VC++) 3.资源的获取 4.资源的使用与消息处理函数   1.资源的种类 windows 的常用的资源包括:图示 .游标. 字符串. 自订资源. 菜单. 键盘快捷键. 对话框. 位图 等 2.资源的定义方法(IDE:VC++)

Windows Server 2008 R2 域服务安装与配置

什么是域 域英文叫DOMAIN,是Windows网络中独立运行的单位,域之间相互访问则需要建立信任关系(即Trust Relation).信任关系是连接在域与域之间的桥梁.当一个域与其他域建立了信任关系后,2个域之间不但可以按需要相互进行管理,还可以跨网分配文件和打印机等设备资源,使不同的域之间实现网络资源的共享与管理. 域既是 Windows 网络操作系统的逻辑组织单元,也是Internet的逻辑组织单元,在 Windows 网络操作系统中,域是安全边界.域管理员只能管理域的内部,除非其他的域

无法删除 NTFS 盘上的文件或文件夹(对Windows文件的各种情况有比较详细的描述)

简介 本文介绍您可能无法删除 NTFS 文件系统卷上的文件或文件夹的原因,以及如何分析造成此问题的不同原因从而解决此问题. 更多信息 注意:在内部,NTFS 将文件夹作为特殊类型的文件进行处理.因此,本文中的“文件”一词可能指文件,也可能指文件夹. 原因 1:文件使用了 ACL 如果某个文件使用了访问控制列表 (ACL),您可能无法删除该文件.要解决此问题,请更改该文件上的权限.您可能需要拥有这些文件的所有权才能更改权限. 管理员具有取得任何文件所有权的隐含能力,即使未明确向他们授予针对此文件的

PCI/PCIe接口卡Windows驱动程序(4)- 驱动程序代码(源文件)

本篇文章将对PCIe驱动程序的源文件代码作详细解释与说明.整个WDF驱动程序工程共包含4个头文件(已经在上篇文章中讲解)和3个.c文件(Driver.c  Device.c   Queue.c) Driver.c 在看复杂的代码前,先给出程序流程图 1 #include "driver.h" 2 #include "driver.tmh" 3 4 #ifdef ALLOC_PRAGMA 5 #pragma alloc_text (INIT, DriverEntry)

exchange 2010 资源邮箱

下面我们来创建资源邮箱.(资源邮箱包括会议室邮箱与设备邮箱,这里我们只创建会议室邮箱) 打开EMC-收件人-邮箱,右键-新建邮箱-选择 会议室邮箱 输入邮箱基本信息 新建成功 双击windows,点击资源常规,其中的资源容量表示这个会议室可以容纳多少人,这里我们填20 资源自定义属性,点击添加,这里未有任何自定义属性,我们需要添加自定义属性. 打开EMS-Exchange manager shell 输入 $ResourceConfiguration = Get-ResourceConfig -

【转】分析Linux和windows动态库

原文地址:http://www.cnblogs.com/chio/archive/2008/11/13/1333119.html 摘要:动态链接库技术实现和设计程序常用的技术,在Windows和Linux系 统中都有动态库的概念,采用动态库可以有效的减少程序大小,节省空间,提高效率,增加程序的可扩展性,便于模块化管理.但不同操作系统的动态库由 于格式不同,在需要不同操作系统调用时需要进行动态库程序移植.本文分析和比较了两种操作系统动态库技术,并给出了将Visual C++编制的动态库移植到Lin