posts - 615, comments - 10486, trackbacks - 594, articles - 0
  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理

公告

背水一战 Windows 10 (99) - 关联启动: 关联指定的文件类型, 关联指定的协议

Posted on 2018-06-19 10:58 webabcd 阅读(...) 评论(...) 编辑 收藏

[源码下载]


背水一战 Windows 10 (99) - 关联启动: 关联指定的文件类型, 关联指定的协议



作者:webabcd


介绍
背水一战 Windows 10 之 关联启动

  • 关联指定的文件类型
  • 关联指定的协议



示例
1、演示如何关联指定的文件类型(即用本程序打开指定类型的文件)
App.xaml.cs

        // 通过打开文件激活应用程序时所调用的方法
        protected override void OnFileActivated(FileActivatedEventArgs args)
        {
            Frame rootFrame = new Frame();
            rootFrame.Navigate(typeof(Windows10.AssociationLaunching.FileTypeAssociation), args);
            Window.Current.Content = rootFrame;

            Window.Current.Activate();
        }

AssociationLaunching/FileTypeAssociation.xaml

<Page
    x:Class="Windows10.AssociationLaunching.FileTypeAssociation"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.AssociationLaunching"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Name="grid" Background="Transparent">
        
        <TextBlock Name="lblMsg" TextWrapping="Wrap" Margin="5">
            <Run>本程序可以打开 .webabcd 类型的文件</Run>
            <LineBreak />
            <Run>测试方法:在桌面新建一个文本文件,随便输一些字符,然后将后缀名改为 .webabcd,最后打开文件,本程序会显示其文本内容</Run>
        </TextBlock>
        
    </Grid>
</Page>

AssociationLaunching/FileTypeAssociation.xaml.cs

/*
 * 演示如何关联指定的文件类型(即用本程序打开指定类型的文件)
 * 
 * 1、在 Package.appxmanifest 中新增一个“文件类型关联”声明,并做相关配置
 *    本例中的这部分的配置如下
 *    <uap:Extension Category="windows.fileTypeAssociation">
 *      <uap:FileTypeAssociation Name=".webabcd">
 *        <uap:DisplayName>打开 .webabcd 文件</uap:DisplayName>
 *        <uap:Logo>Assets\StoreLogo.png</uap:Logo>
 *        <uap:InfoTip>用 win10 demo 打开 .webabcd 文件</uap:InfoTip>
 *        <uap:SupportedFileTypes>
 *          <uap:FileType>.webabcd</uap:FileType>
 *        </uap:SupportedFileTypes>
 *      </uap:FileTypeAssociation>
 *    </uap:Extension>
 * 2、在 App.xaml.cs 中 override void OnFileActivated(FileActivatedEventArgs args),以获取相关的文件信息
 * 
 * FileActivatedEventArgs - 通过打开文件激活应用程序时的事件参数
 *     Files - 相关的文件信息
 *     Kind - 此 app 被激活的类型(ActivationKind 枚举)
 *         比如,如果是通过“打开文件”激活的话,则此值为 File
 *     PreviousExecutionState - 此 app 被激活前的状态(ApplicationExecutionState 枚举)
 *         比如,如果此 app 被激活前就是运行状态的或,则此值为 Running
 *     NeighboringFilesQuery - 获取当前文件的相邻文件
 *     SplashScreen - 获取此 app 的 SplashScreen 对象
 *     User - 获取激活了此 app 的 User 对象
 */

using System;
using Windows.ApplicationModel.Activation;
using Windows.Storage;
using Windows.UI;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

namespace Windows10.AssociationLaunching
{
    public sealed partial class FileTypeAssociation : Page
    {
        private FileActivatedEventArgs _fileActivated;

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

        protected async override void OnNavigatedTo(NavigationEventArgs e)
        {
            // 获取 FileActivatedEventArgs 对象(从 App.xaml.cs 传来的)
            _fileActivated = e.Parameter as FileActivatedEventArgs;

            // 获取文件中的文本内容,并显示
            if (_fileActivated != null)
            {
                grid.Background = new SolidColorBrush(Colors.Blue);
                lblMsg.Foreground = new SolidColorBrush(Colors.White);

                IStorageFile isf = _fileActivated.Files[0] as IStorageFile;
                lblMsg.Text = $"激活程序的文件是“{isf.Name}”,其文本内容为:{await FileIO.ReadTextAsync(isf)}";
            }
        }
    }
}


2、演示如何关联指定的协议(即用本程序处理指定的协议)
App.xaml.cs

        protected override void OnActivated(IActivatedEventArgs args)
        {
            // 通过协议激活应用程序时(参见 AssociationLaunching/ProtocolAssociation.xaml.cs 中的示例)
            if (args.Kind == ActivationKind.Protocol)
            {
                ProtocolActivatedEventArgs protocolArgs = args as ProtocolActivatedEventArgs;

                Frame rootFrame = new Frame();
                rootFrame.Navigate(typeof(Windows10.AssociationLaunching.ProtocolAssociation), protocolArgs);
                Window.Current.Content = rootFrame;
            }
        }

AssociationLaunching/ProtocolAssociation.xaml

<Page
    x:Class="Windows10.AssociationLaunching.ProtocolAssociation"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Windows10.AssociationLaunching"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d">

    <Grid Name="grid" Background="Transparent">
        
        <StackPanel Margin="10 0 10 10">
            <TextBlock Name="lblMsg" Margin="5">
                <Run>本程序可以处理 webabcd: 协议</Run>
            </TextBlock>

            <Button Name="btnProtocol" Content="打开自定义协议 webabcd:data" Click="btnProtocol_Click" Margin="5" />
        </StackPanel>
        
    </Grid>
</Page>

AssociationLaunching/ProtocolAssociation.xaml.cs

/*
 * 演示如何关联指定的协议(即用本程序处理指定的协议)
 * 
 * 1、在 Package.appxmanifest 中新增一个“协议”声明,并做相关配置
 *    本例中的这部分的配置如下,协议名必须全小写
 *    <uap:Extension Category="windows.protocol">
 *      <uap:Protocol Name="webabcd">
 *        <uap:Logo>Assets\StoreLogo.png</uap:Logo>
 *      </uap:Protocol>
 *    </uap:Extension>
 * 2、在 App.xaml.cs 中 override void OnActivated(IActivatedEventArgs args),以获取相关的协议信息
 * 
 * 
 * ProtocolActivatedEventArgs - 通过协议激活应用程序时的事件参数
 *     Uri - 协议的 uri
 *     CallerPackageFamilyName - 激活当前 app 的 app 的 PackageFamilyName
 *     Kind - 此 app 被激活的类型(ActivationKind 枚举)
 *         本例为 ActivationKind.Protocol
 *     PreviousExecutionState - 此 app 被激活前的状态(ApplicationExecutionState 枚举)
 *         比如,如果此 app 被激活前就是运行状态的或,则此值为 Running
 *     SplashScreen - 获取此 app 的 SplashScreen 对象
 *     User - 获取激活了此 app 的 User 对象
 */

using System;
using Windows.ApplicationModel.Activation;
using Windows.System;
using Windows.UI;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;

namespace Windows10.AssociationLaunching
{
    public sealed partial class ProtocolAssociation : Page
    {
        private ProtocolActivatedEventArgs _protocolArgs;

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

        protected override void OnNavigatedTo(NavigationEventArgs e)
        {
            // 获取 ProtocolActivatedEventArgs 对象(从 App.xaml.cs 传来的)
            _protocolArgs = e.Parameter as ProtocolActivatedEventArgs;

            // 显示协议的详细信息
            if (_protocolArgs != null)
            {
                grid.Background = new SolidColorBrush(Colors.Blue);
                lblMsg.Foreground = new SolidColorBrush(Colors.White);

                lblMsg.Text = "激活程序的自定义协议为: " + _protocolArgs.Uri.AbsoluteUri;
            }
        }

        private async void btnProtocol_Click(object sender, RoutedEventArgs e)
        {
            // 打开自定义协议 webabcd:data
            Uri uri = new Uri("webabcd:data");
            await Launcher.LaunchUriAsync(uri);

            // 打开 IE 浏览器,在地址栏输入 webabcd:data,即会打开本程序来处理此协议
        }
    }
}



OK
[源码下载]