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

简介: 原文:重新想象 Windows 8 Store Apps (26) - 选取器: 自定义文件选取窗口, 自定义文件保存窗口[源码下载] 重新想象 Windows 8 Store Apps (26) - 选取器: 自定义文件选取窗口, 自定义文件保存窗口 作者:webabcd介绍重新想象 Windows 8 Store Apps 之 选取器 FileOpenPickerUI - 自定义文件打开选取器 FileSavePickerUI - 自定义文件保存选取器 示例1、 开发一个自定义文件选取窗口。
原文: 重新想象 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
[源码下载]

目录
相关文章
|
2月前
|
安全 前端开发 API
【Azure 应用服务】Azure Web App 服务默认支持一些 Weak TLS Ciphers Suite,是否有办法自定义修改呢?
【Azure 应用服务】Azure Web App 服务默认支持一些 Weak TLS Ciphers Suite,是否有办法自定义修改呢?
|
2月前
|
Linux C++ Windows
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
【Azure 应用服务】Azure App Service(Windows)环境中如何让.NET应用调用SAP NetWeaver RFC函数
|
2月前
|
Java 应用服务中间件 开发工具
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
[App Service for Windows]通过 KUDU 查看 Tomcat 配置信息
|
2月前
|
Java 应用服务中间件 Windows
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
【App Service for Windows】为 App Service 配置自定义 Tomcat 环境
|
2月前
|
PHP Windows
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
【Azure App Service for Windows】 PHP应用出现500 : The page cannot be displayed because an internal server error has occurred. 错误
|
2月前
|
PHP 开发工具 git
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
【Azure 应用服务】在 App Service for Windows 中自定义 PHP 版本的方法
|
2月前
|
开发框架 .NET Docker
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
【Azure 应用服务】App Service .NET Core项目在Program.cs中自定义添加的logger.LogInformation,部署到App Service上后日志不显示Log Stream中的问题
|
2月前
|
网络安全 API 数据安全/隐私保护
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
【Azure App Service】.NET代码实验App Service应用中获取TLS/SSL 证书 (App Service Windows)
|
2月前
|
Shell PHP Windows
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
【Azure App Service】Web Job 报错 UNC paths are not supported. Defaulting to Windows directory.
|
2月前
|
存储 Linux Windows
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例
【应用服务 App Service】App Service For Windows 如何挂载Storage Account File Share 示例
下一篇
无影云桌面