天天看點

【Win10應用開發】協定-下篇:自定義多個協定

前面介紹了如何為應用程式自定義協定,于是有朋友會問,我希望為我的應用注冊多個協定,不同的協定處理不同的事情,能嗎?答案是能的。

方法主要在配置清單檔案上,這裡我給出一個例子,示例應用将注冊兩個協定,分别為music:和video:。

在清單檔案中找到Package/Applications/Application節點,在Application元素下增加Extensions節點,表示為應用程式聲明的擴充,可以包含N個uap:Extension元素,一定要加上uap字首,表明是用于通用應用的。正是利用了uap:Extension元素這個特點,可以為應用程式定義多個協定,但是,一定要記住:一個uap:Extension元素隻能聲明一個協定。

既然要多個協定,那就定義多個uap:Extension元素,如本例的清單檔案定義如下:

<Extensions>
        <uap:Extension Category="windows.protocol">
          <uap:Protocol Name="music"/>
        </uap:Extension>
        <uap:Extension Category="windows.protocol">
          <uap:Protocol Name="video"/>
        </uap:Extension>
      </Extensions>      

Protocol元素的Name特性指定協定的名字。

接下來在App類中重寫OnActivated方法,主要是從參數中取出激活應用程式的URI,再判斷應用程式是被哪個協定激活的。

protected override void OnActivated(IActivatedEventArgs args)
        {
            if (args.Kind == ActivationKind.Protocol)
            {
                ProtocolActivatedEventArgs parg = (ProtocolActivatedEventArgs)args;
                Uri uri = parg.Uri;
                string data = null;
                // 判斷是哪個協定激活
                switch (uri.Scheme)
                {
                    case "music":
                        data = "音樂";
                        break;
                    case "video":
                        data = "視訊";
                        break;
                    default:
                        data = null;
                        break;
                }

                // 顯示頁面
                Frame rootframe = Window.Current.Content as Frame;
                if (rootframe == null)
                {
                    rootframe = new Frame();
                    Window.Current.Content = rootframe;
                }
                rootframe.Navigate(typeof(MainPage), data);
            }
            Window.Current.Activate();
        }      

 args.Kind的值很關鍵,因為應用程式可能被其他方式激活,如檔案關聯,是以這裡必須判斷。取得URI後,Scheme屬性可以得到URI的架構名,即協定的名字,如上面定義的music、video。進而判斷哪個協定激活了應用。

下面再寫一個示例應用,用來通過協定激活上面的應用,在代碼中可以用Launcher類的LaunchUriAsync方法來啟動一個URI。

Uri uri = new Uri(txt1.Text);
            await Windows.System.Launcher.LaunchUriAsync(uri);      

測試結果如下圖所示。

【Win10應用開發】協定-下篇:自定義多個協定

注意,在使用協定時,協定名稱後面一定要加上冒号(英文),如music:。

示例下載下傳位址:https://files.cnblogs.com/files/tcjiaan/protocol-part2.zip

繼續閱讀