背水一战 Windows 10 (99) - 关联启动: 关联指定的文件类型, 关联指定的协议
背水一战 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
[源码下载]