zoukankan      html  css  js  c++  java
  • Windows Phone 8.1 FilePicker API

    在 Windows Phone 8.1 中,增加了 FilePicker 的方式与文件打交道,最大的亮点在于这种方式不仅可以浏览手机上的文件,还可以浏览符合协议的应用里的文件

    比如点击 OneDrive 就会打开 OneDrive 应用:


    (1)FileOpenPicker

    FileOpenPicker 也就是选择文件,可以设置打开单选界面或多选界面。

    1)实例化 FileOpenPicker 对象,并设置 ContinuationData

    private void openFileButton_Click(object sender, RoutedEventArgs e)
    {
        FileOpenPicker imageOpenPicker = new FileOpenPicker();
    
        imageOpenPicker.FileTypeFilter.Add(".jpg");
        imageOpenPicker.FileTypeFilter.Add(".png");
        
    imageOpenPicker.SuggestedStartLocation = PickerLocationId.PicturesLibrary;
    imageOpenPicker.ContinuationData[
    "Operate"] = "OpenImage"; imageOpenPicker.PickSingleFileAndContinue(); }

    FileOpenPicker 可以设置 FileTypeFilter,方便文件的浏览;还可以设置选择界面的开始目录(SuggestedStartLocation)。

    因为在打开选择文件的界面后当前应用会挂起,所以需要 ContinuationData 来记录一些信息,以保证当应用恢复时能够保持之前的信息。

     

    2)重写 App.xaml.cs 的 OnActivated 方法

    当用户选择了文件之后会返回到之前的应用,这时需要重写 OnActivated 方法让应用跳转到指定页面,并传递用户选择的文件。

    protected override void OnActivated(IActivatedEventArgs args)
    {
        if( args is FileOpenPickerContinuationEventArgs )
        {
            Frame rootFrame = Window.Current.Content as Frame;
    
            if( rootFrame == null )
            {
                rootFrame = new Frame();
    
                rootFrame.CacheSize = 1;
    
                Window.Current.Content = rootFrame;
            }
    
            if( rootFrame.Content == null )
            {
                if( rootFrame.ContentTransitions != null )
                {
                    this.transitions = new TransitionCollection();
                    foreach( var c in rootFrame.ContentTransitions )
                    {
                        this.transitions.Add(c);
                    }
                }
    
                rootFrame.ContentTransitions = null;
                rootFrame.Navigated += this.RootFrame_FirstNavigated;
    
                if( !rootFrame.Navigate(typeof(MainPage)) )
                {
                    throw new Exception("Failed to create first page");
                }
            }
    
            if( !rootFrame.Navigate(typeof(MainPage)) )
            {
                throw new Exception("Failed to create target page");
            }
    
            MainPage targetPage = rootFrame.Content as MainPage;
            targetPage.FilePickerEventArgs = (FileOpenPickerContinuationEventArgs)args;
    
            Window.Current.Activate();
        }
    }

    首先是要判断之前的行为是不是 FileOpenPicker 引起的,然后获取 Frame 并跳转到指定页面,将包含用户选择文件的信息 args 传递到指定页面中。

     

    3)添加 FileOpenPickerContinuationEventArgs 属性和 ContinuFileOpenPicker 方法

    当应用将 args 传递到页面去后,剩下的就是处理文件了:

    private FileOpenPickerContinuationEventArgs filePickerEventArgs;
    public FileOpenPickerContinuationEventArgs FilePickerEventArgs
    {
        get { return filePickerEventArgs; }
        set
        {
            filePickerEventArgs = value;
            ContinuFileOpenPicker(filePickerEventArgs);
        }
    }
    
    private async void ContinuFileOpenPicker(FileOpenPickerContinuationEventArgs args)
    {
        if( args.ContinuationData["Operate"] as string == "OpenImage" && args.Files != null && args.Files.Count > 0 )
        {
            StorageFile file = args.Files[0];
    
            BitmapImage image = new BitmapImage();
            await image.SetSourceAsync(await file.OpenAsync(FileAccessMode.Read));
    
            myImage.Source = image;
        }
    }

    (2)AccessCache

    AccessCache 也就是指对用户选择文件或文件夹的缓存,包括 MostRecentlyUsedList 和 FutureAccessList。

    MostRecentlyUsedList 可以保存 25 项,并会根据用户使用情况自动排序,当新的进来后超过 25 项了则会自动将最旧的删除。

    FutureAccessList 则可以保存 1000 项,但不会自动排序,需要开发者自行管理。

    保存方法:

    private async void ContinuFileOpenPicker(FileOpenPickerContinuationEventArgs args)
    {
        if( args.ContinuationData["Image"] as string == "OpenImage" && args.Files != null && args.Files.Count > 0 )
        {
            StorageFile file = args.Files[0];
    
            BitmapImage image = new BitmapImage();
            await image.SetSourceAsync(await file.OpenAsync(FileAccessMode.Read));
    
            myImage.Source = image;
    
            StorageApplicationPermissions.MostRecentlyUsedList.Add(file, "20140528");
            StorageApplicationPermissions.FutureAccessList.Add(file, "20140528");
        }
    }

    读取方法:

    private async void NavigationHelper_LoadState(object sender, LoadStateEventArgs e)
    {
        var mruList = StorageApplicationPermissions.MostRecentlyUsedList.Entries;
    foreach( var item in mruList )
        {
            StorageFile file = await StorageApplicationPermissions.MostRecentlyUsedList.GetFileAsync(item.Token);
    
            BitmapImage image = new BitmapImage();
            await image.SetSourceAsync(await file.OpenAsync(FileAccessMode.Read));
    
            Image img = new Image();
            img.Source = image;
            img.Stretch = Stretch.Uniform;
            img.Margin = new Thickness(0, 0, 0, 10);
            imagesStackPanel.Children.Add(img);
        }
    }

    开发者可以灵活使用这两个列表,方便用户浏览最近使用过的文件。

    (3)FileSavePicker

    既然有 OpenPicker,自然就有 SavePicker。

    FileSavePicker 的使用方法与 FileOpenPicker 非常相似。

    1)实例化 FileSavePicker 对象,并设置 ContinuationData

    private void saveButton_Click(object sender, RoutedEventArgs e)
    {
        FileSavePicker imageSavePicker = new FileSavePicker();
    
        imageSavePicker.SuggestedStartLocation = PickerLocationId.DocumentsLibrary;
        imageSavePicker.SuggestedFileName = "Test";
        imageSavePicker.FileTypeChoices.Add("Txt", new List<string>() { ".txt" });
    
        imageSavePicker.ContinuationData["Txt"] = "SaveTxt";
        imageSavePicker.PickSaveFileAndContinue();
    }

    实例化 FileSavePicker 对象后,设置 FileName 和 FileType。

    当用户选择了某个文件夹后,系统就会在该文件夹中新建一个该 FileName 和 FileType 的文件,并将该文件放到 FileSavePickerContinuationEventArgs 中。

    2)重写 App.xaml.cs 的 OnActivated 方法

    与 FileOpenPicker 一样,同样需要重写 OnActivated 方法,这次要检查的 args 类型为 FileSavePickerContinuationEventArgs:

    protected override void OnActivated(IActivatedEventArgs args)
    {
        if( args is FileSavePickerContinuationEventArgs )
        {
            Frame rootFrame = Window.Current.Content as Frame;
    
            // 不要在窗口已包含内容时重复应用程序初始化,
            // 只需确保窗口处于活动状态
            if( rootFrame == null )
            {
                // 创建要充当导航上下文的框架,并导航到第一页
                rootFrame = new Frame();
    
                // TODO: 将此值更改为适合您的应用程序的缓存大小
                rootFrame.CacheSize = 1;
    
                if( args.PreviousExecutionState == ApplicationExecutionState.Terminated )
                {
                    // TODO: 从之前挂起的应用程序加载状态
                }
    
                // 将框架放在当前窗口中
                Window.Current.Content = rootFrame;
            }
    
            if( rootFrame.Content == null )
            {
                // 删除用于启动的旋转门导航。
                if( rootFrame.ContentTransitions != null )
                {
                    this.transitions = new TransitionCollection();
                    foreach( var c in rootFrame.ContentTransitions )
                    {
                        this.transitions.Add(c);
                    }
                }
    
                rootFrame.ContentTransitions = null;
                rootFrame.Navigated += this.RootFrame_FirstNavigated;
    
                // 当导航堆栈尚未还原时,导航到第一页,
                // 并通过将所需信息作为导航参数传入来配置
                // 新页面
                if( !rootFrame.Navigate(typeof(MainPage)) )
                {
                    throw new Exception("Failed to create initial page");
                }
            }
    
            if( !rootFrame.Navigate(typeof(MainPage)) )
            {
                throw new Exception("Failed to create target page");
            }
    
            MainPage targetPage = rootFrame.Content as MainPage;
            targetPage.SavePickerArgs = (FileSavePickerContinuationEventArgs)args;
    
            // 确保当前窗口处于活动状态
            Window.Current.Activate();
        }
    }
    OnActivated

    3)添加 FileSavePickerContinuationEventArgs 属性和 ContinuFileSavePicker 方法

    最后在 ContinuFileSavePicker 方法中对要保存的文件进行操作:

    private FileSavePickerContinuationEventArgs savePickerArgs;
    public FileSavePickerContinuationEventArgs SavePickerArgs
    {
        get { return savePickerArgs; }
        set
        {
            savePickerArgs = value;
            ContinuFileSavePicker(savePickerArgs);
        }
    }
    
    private async void ContinuFileSavePicker(FileSavePickerContinuationEventArgs args)
    {
        if( args.ContinuationData["Txt"] as string == "SaveTxt" && args.File != null )
        {
            StorageFile txt = args.File;
    await FileIO.WriteTextAsync(txt, "1224677");
        }
    }
  • 相关阅读:
    Linux find 用法示例
    [转载]进程的概念与结构
    linux vi命令详解
    vi快捷键必知必会
    vim分屏操作
    硬连接和软连接的区别
    javascript_console调试常用方法
    javascript_错误处理机制
    Array详解
    react--setState使用
  • 原文地址:https://www.cnblogs.com/xiaoshi3003/p/3757828.html
Copyright © 2011-2022 走看看