背水一战 Windows 10 (94) - 选取器: 自定义文件打开选取器

[源码下载]

作者:webabcd

介绍
背水一战 Windows 10 之 选取器

  • 自定义文件打开选取器

示例
1、演示如何开发自定义文件打开选取器
App.xaml.cs

        // 通过文件打开选取器激活应用程序时所调用的方法
        protected override void OnFileOpenPickerActivated(FileOpenPickerActivatedEventArgs args)
        {
            var rootFrame = new Frame();
            rootFrame.Navigate(typeof(Windows10.Picker.MyOpenPicker), args);
            Window.Current.Content = rootFrame;

            Window.Current.Activate();
        }

Picker/MyOpenPicker.xaml

<Page
    x:Class="Windows10.Picker.MyOpenPicker"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.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="10 0 10 10">

            <TextBlock Name="lblMsg" Margin="5" />

            <Button Name="btnPickLocalFile" Content="选择一个本地文件" Click="btnPickLocalFile_Click" Margin="5" />

            <Button Name="btnPickRemoteFile" Content="选择一个远程文件" Click="btnPickRemoteFile_Click" Margin="5" />

        </StackPanel>
    </Grid>
</Page>

Picker/MyOpenPicker.xaml.cs

/*
 * 演示如何开发自定义文件打开选取器
 *
 * 1、在 Package.appxmanifest 中新增一个“文件打开选取器”声明,并做相关配置
 * 2、在 App.xaml.cs 中 override void OnFileOpenPickerActivated(FileOpenPickerActivatedEventArgs args),如果 app 是由文件打开选取器激活的,则会调用此方法
 *
 * FileOpenPickerActivatedEventArgs - 通过“文件打开选取器”激活应用程序时的事件参数
 *     FileOpenPickerUI - 获取 FileOpenPickerUI 对象
 *     Kind - 此 app 被激活的类型(ActivationKind 枚举)
 *         比如,如果是通过“文件打开选取器”激活的话,则此值为 FileOpenPicker
 *     PreviousExecutionState - 此 app 被激活前的状态(ApplicationExecutionState 枚举)
 *         比如,如果此 app 被激活前就是运行状态的或,则此值为 Running
 *     SplashScreen - 获取此 app 的 SplashScreen 对象
 *     CallerPackageFamilyName - 获取激活了此 app 的应用的包名(但是实际测试发现,获取到的却是此 app 的包名)
 *     User - 获取激活了此 app 的 User 对象
 *
 * 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 从选中文件列表中删除对应的文件
 *     Closing - 用户关闭“自定义文件打开选取器”时触发的事件
 *
 *
 * 注意:测试时发现如果此 app 作为文件打开选取器激活之前是运行状态的话,则在作为文件打开选取器时会出现控件事件无法触发的情况(但是有的时候是正常的),不知道为什么,这一点开发和测试时要注意
 */

using System;
using System.Collections.Generic;
using Windows.ApplicationModel;
using Windows.ApplicationModel.Activation;
using Windows.Storage;
using Windows.Storage.Pickers.Provider;
using Windows.Storage.Streams;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Navigation;

namespace Windows10.Picker
{
    public sealed partial class MyOpenPicker : Page
    {
        private FileOpenPickerUI _fileOpenPickerUI;

        public MyOpenPicker()
        {
            this.InitializeComponent();
        }

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            // 获取 FileOpenPickerUI 对象(从 App.xaml.cs 传来的)
            FileOpenPickerActivatedEventArgs args = (FileOpenPickerActivatedEventArgs)e.Parameter;
            _fileOpenPickerUI = args.FileOpenPickerUI;

            _fileOpenPickerUI.Title = "自定义文件打开选取器";

            // 注意:选择的文件的扩展名必须匹配 AllowedFileTypes 中的定义(其是在调用端的 FileOpenPicker.FileTypeFilter 中配置的)
            IReadOnlyList<string> allowedFileTypes = _fileOpenPickerUI.AllowedFileTypes;
            lblMsg.Text = "allowedFileTypes: " + string.Join(",", allowedFileTypes);
            lblMsg.Text += Environment.NewLine;

            lblMsg.Text += "Kind: " + args.Kind;
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "SplashScreen.ImageLocation: " + args.SplashScreen.ImageLocation;
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "PreviousExecutionState: " + args.PreviousExecutionState;
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "CallerPackageFamilyName: " + args.CallerPackageFamilyName;
            lblMsg.Text += Environment.NewLine;
            lblMsg.Text += "User.NonRoamableId: " + args.User.NonRoamableId;
            lblMsg.Text += Environment.NewLine;

            // _fileOpenPickerUI.Closing += _fileOpenPickerUI_Closing;

            base.OnNavigatedTo(e);
        }

        protected override void OnNavigatedFrom(NavigationEventArgs e)
        {
            // _fileOpenPickerUI.Closing -= _fileOpenPickerUI_Closing;

            base.OnNavigatedFrom(e);
        }

        // 选择一个本地文件
        private async void btnPickLocalFile_Click(object sender, RoutedEventArgs e)
        {
            StorageFile file = await Package.Current.InstalledLocation.GetFileAsync(@"Assets\hololens.jpg");
            if (_fileOpenPickerUI.CanAddFile(file))
            {
                AddFileResult result = _fileOpenPickerUI.AddFile("myFile", file);

                lblMsg.Text = "选择的文件: " + file.Name;
                lblMsg.Text += Environment.NewLine;
                lblMsg.Text += "AddFileResult: " + result.ToString();
            }
        }

        // 选择一个远程文件
        private async void btnPickRemoteFile_Click(object sender, 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));
            if (_fileOpenPickerUI.CanAddFile(file))
            {
                AddFileResult result = _fileOpenPickerUI.AddFile("myFile", file);

                lblMsg.Text = "选择的文件: " + file.Name;
                lblMsg.Text += Environment.NewLine;
                lblMsg.Text += "AddFileResult: " + result.ToString();
            }
        }
    }
}

2、演示如何调用自定义文件打开选取器
Picker/MyOpenPickerDemo.xaml

<Page
    x:Class="Windows10.Picker.MyOpenPickerDemo"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.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="10 0 10 10">

            <TextBlock Name="lblMsg" TextWrapping="Wrap" Margin="5">
                <Run>
                    如果需要激活自定义的文件选取窗口,请在弹出的选取器窗口的左侧的导航列表中选择相应的 app
                </Run>
                <LineBreak />
                <Run>
                    测试时发现如果此 app 作为文件打开选取器激活之前是运行状态的话,则在作为文件打开选取器时会出现控件事件无法触发的情况(但是有的时候是正常的),不知道为什么,这一点开发和测试时要注意
                </Run>
            </TextBlock>

            <Button Name="btnMyOpenPicker" Content="弹出文件选择窗口" Click="btnMyOpenPicker_Click" Margin="5" />

        </StackPanel>
    </Grid>
</Page>

Picker/MyOpenPickerDemo.xaml.cs

/*
 * 演示如何调用自定义文件打开选取器
 *
 * 自定义文件打开选取器参见 MyOpenPicker.xaml
 */

using System;
using Windows.Storage;
using Windows.Storage.Pickers;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;

namespace Windows10.Picker
{
    public sealed partial class MyOpenPickerDemo : Page
    {
        public MyOpenPickerDemo()
        {
            this.InitializeComponent();
        }

        private async void btnMyOpenPicker_Click(object sender, RoutedEventArgs e)
        {
            // 选择一个文件
            FileOpenPicker openPicker = new FileOpenPicker();
            openPicker.CommitButtonText = "选中此文件";
            openPicker.FileTypeFilter.Add("*");

            // 弹出文件选择窗口
            StorageFile file = await openPicker.PickSingleFileAsync();
            if (file != null)
            {
                lblMsg.Text = "选中文件: " + file.Name;
            }
            else
            {
                lblMsg.Text = "取消了";
            }
        }
    }
}

OK
[源码下载]

原文地址:https://www.cnblogs.com/webabcd/p/9185812.html

时间: 2024-10-08 05:03:39

背水一战 Windows 10 (94) - 选取器: 自定义文件打开选取器的相关文章

背水一战 Windows 10 (98) - 关联启动: 使用外部程序打开一个文件, 使用外部程序打开一个 Uri

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 关联启动 使用外部程序打开一个文件 使用外部程序打开一个 Uri 示例1.演示如何使用外部程序打开一个文件AssociationLaunching/LaunchFile.xaml <Page x:Class="Windows10.AssociationLaunching.LaunchFile" xmlns="http://schemas.microsoft.com/winfx/2006/xaml

windows 10 桌面ctrl alt 自定义快捷键打开程序慢 响应很慢 延迟问题

思路为:关闭后台应用 具体步骤如下: 1.)设置,搜索 隐私 2.)找到隐私设置 3.)关闭后台 这些后台应用,我都不需要,所以直接全部关闭了,如果有需要可以逐个实验,查找出来到底是哪个后问题 本人亲测可以解决问题 原文地址:https://www.cnblogs.com/noteless/p/12162685.html

背水一战 Windows 10 (11) - 资源: CustomResource, ResourceDictionary, 加载外部的 ResourceDictionary 文件

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 资源 CustomResource ResourceDictionary 加载外部的 ResourceDictionary 文件 示例1.演示“CustomResource”相关知识点CustomResourceTest.cs /* * 本例是一个自定义 CustomXamlResourceLoader,用于演示 CustomResource 的使用 */ using Windows.UI.Xaml.Resources;

背水一战 Windows 10 (64) - 控件(WebView): 加载指定 HttpMethod 的请求, 自定义请求的 http header, app 与 js 的交互

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 控件(WebView) 加载指定 HttpMethod 的请求 自定义请求的 http header app 与 js 的交互 示例1.演示 WebView 如何加载指定 HttpMethod 的请求以及如何自定义请求的 http headerWebApi/Controllers/WebViewPostController.cs /* * 用于 WebView 演示“如何加载指定 HttpMethod 的请求,以及如何自

背水一战 Windows 10 (20) - 绑定: DataContextChanged, UpdateSourceTrigger, 对绑定的数据做自定义转换

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 绑定 DataContextChanged - FrameworkElement 的 DataContext 发生变化时触发的事件 UpdateSourceTrigger - 数据更新的触发方式 对绑定的数据做自定义转换 示例1.演示 DataContextChanged 的用法Bind/DataContextChanged.xaml <Page x:Class="Windows10.Bind.DataContex

背水一战 Windows 10 (86) - 文件系统: 获取文件夹的属性, 获取文件夹的缩略图

原文:背水一战 Windows 10 (86) - 文件系统: 获取文件夹的属性, 获取文件夹的缩略图 [源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 获取文件夹的属性 获取文件夹的缩略图 示例1.演示如何获取文件夹的属性FileSystem/FolderProperties.xaml <Page x:Class="Windows10.FileSystem.FolderProperties" xmlns="http://schema

背水一战 Windows 10 (87) - 文件系统: 获取文件的属性, 修改文件的属性, 获取文件的缩略图

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 获取文件的属性 修改文件的属性 获取文件的缩略图 示例1.演示如何获取文件的属性,修改文件的属性FileSystem/FileProperties.xaml <Page x:Class="Windows10.FileSystem.FileProperties" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentatio

背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理

[源码下载] 背水一战 Windows 10 (90) - 文件系统: 获取 Package 中的文件, 可移动存储中的文件操作, “库”管理 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 获取 Package 中的文件 可移动存储中的文件操作 “库”管理 示例1.演示如何获取 Package 中的文件FileSystem/PackageData/Demo.xaml <Page x:Class="Windows10.FileSystem.PackageData.D

背水一战 Windows 10 (88) - 文件系统: 操作文件夹和文件

[源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 文件系统 创建文件夹,重命名文件夹,删除文件夹,在指定的文件夹中创建文件 创建文件,复制文件,移动文件,重命名文件,删除文件 打开文件,获取指定的本地 uri 的文件,通过 StreamedFileDataRequest 或远程 uri 创建文件或替换文件 示例1.演示如何创建文件夹,重命名文件夹,删除文件夹,在指定的文件夹中创建文件FileSystem/FolderOperation.xaml <Page x:Clas