重新想象 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
[源码下载]

目录
相关文章
|
6天前
|
Python Windows
在 Windows 平台下打包 Python 多进程代码为 exe 文件的问题及解决方案
在使用 Python 进行多进程编程时,在 Windows 平台下可能会出现将代码打包为 exe 文件后无法正常运行的问题。这个问题主要是由于在 Windows 下创建新的进程需要复制父进程的内存空间,而 Python 多进程机制需要先完成父进程的初始化阶段后才能启动子进程,所以在这个过程中可能会出现错误。此外,由于没有显式导入 Python 解释器,也会导致 Python 解释器无法正常工作。为了解决这个问题,我们可以使用函数。
13 5
|
1月前
|
存储 数据安全/隐私保护 iOS开发
应用在App Store上被拒重新提交审核流程指南
该文本是关于iOS应用发布的步骤说明
31 2
|
1月前
|
安全 数据安全/隐私保护 Windows
Windows文件搜索神器Everything安装配置结合内网穿透实现公网查询本地文件
Windows文件搜索神器Everything安装配置结合内网穿透实现公网查询本地文件
|
1月前
|
Apache 项目管理 数据安全/隐私保护
Windows安装TortoiseSVN客户端结合Cpolar实现公网提交文件到本地服务器
Windows安装TortoiseSVN客户端结合Cpolar实现公网提交文件到本地服务器
|
1月前
|
Oracle Java 关系型数据库
windows 下 win11 JDK17安装与环境变量的配置(配置简单详细,包含IJ中java文件如何使用命令运行)
本文介绍了Windows 11中安装JDK 17的步骤,包括从官方网站下载JDK、配置环境变量以及验证安装是否成功。首先,下载JDK 17的安装文件,如果没有Oracle账户,可以直接解压缩文件到指定目录。接着,配置系统环境变量,新建`JAVA_HOME`变量指向JDK安装路径,并在`Path`变量中添加。然后,通过命令行(cmd)验证安装,分别输入`java -version`和`javac -version`检查版本信息。最后,作者分享了如何在任意位置运行Java代码,包括在IntelliJ IDEA(IJ)中创建的Java文件,只需去掉包声明,就可以通过命令行直接运行。
601 1
|
1月前
|
Java 程序员 Windows
【windows自带exe】使用`findstr.exe`来搜索包含某个字符串的文件
【windows自带exe】使用`findstr.exe`来搜索包含某个字符串的文件
64 0
|
1月前
|
安全 Linux 网络安全
Windows搭建Emby媒体库服务器,无公网IP远程访问本地影音文件
Windows搭建Emby媒体库服务器,无公网IP远程访问本地影音文件
37 0
|
2天前
|
编解码 Java Android开发
FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流
RTMP Streamer是一款开源的安卓直播推流框架,支持RTMP、RTSP和SRT协议,适用于各种直播场景。它支持H264、H265、AV1视频编码和AAC、G711、OPUS音频编码。本文档介绍了如何使用Java版的RTMP Streamer,建议使用小海豚版本的Android Studio (Dolphin)。加载项目时,可添加国内仓库加速依赖下载。RTMP Streamer包含五个模块:app、encoder、rtmp、rtplibrary和rtsp。完成加载后,可以在手机上安装并运行APP,提供多种直播方式。开发者可以从《FFmpeg开发实战:从零基础到短视频上线》获取更多信息。
27 7
FFmpeg开发笔记(三十一)使用RTMP Streamer开启APP直播推流
|
15天前
|
移动开发 小程序 视频直播
FFmpeg开发笔记(二十七)解决APP无法访问ZLMediaKit的直播链接问题
本文讲述了在使用ZLMediaKit进行视频直播时,遇到移动端通过ExoPlayer和微信小程序播放HLS直播地址失败的问题。错误源于ZLMediaKit对HTTP地址的Cookie校验导致401无权限响应。通过修改ZLMediaKit源码,注释掉相关鉴权代码并重新编译安装,解决了此问题,使得ExoPlayer和小程序能成功播放HLS视频。详细解决方案及FFmpeg集成可参考《FFmpeg开发实战:从零基础到短视频上线》一书。
26 3
FFmpeg开发笔记(二十七)解决APP无法访问ZLMediaKit的直播链接问题
|
4天前
|
开发框架 移动开发 JavaScript
SpringCloud微服务实战——搭建企业级开发框架(四十七):【移动开发】整合uni-app搭建移动端快速开发框架-添加Axios并实现登录功能
在uni-app中,使用axios实现网络请求和登录功能涉及以下几个关键步骤: 1. **安装axios和axios-auth-refresh**: 在项目的`package.json`中添加axios和axios-auth-refresh依赖,可以通过HBuilderX的终端窗口运行`yarn add axios axios-auth-refresh`命令来安装。 2. **配置自定义常量**: 创建`project.config.js`文件,配置全局常量,如API基础URL、TenantId、APP_CLIENT_ID和APP_CLIENT_SECRET等。