ファイルの種類の関連付けとプロトコル

 Metro Style App では、拡張子を登録して関連付けによる起動を行ったり、独自プロトコルを登録して URL による情報の受け渡しを行う事ができます。
 ファイルや URL を指定して実行する処理は、Launcher クラスの LaunchFileAsync や LaunchUriAsync を使う事で実装できます。
 今回は、拡張子やプロトコルを登録して情報を受け取る側のアプリを作成してみます。

画面

 画面は単純に関連付けによる起動で渡されたファイルパスや独自プロトコルで渡された URL を表示するだけの物です。

ファイルの種類の関連付け

 関連付けを行うためにはアプリケーションマニフェストファイルに宣言を追加する必要があります。
 プロジェクトのPackage.appxmanifestを開き、宣言タブでファイル種類の関連付けを追加します。

 赤丸でXが表示されている項目は必須項目です。
 名前を metroabc、ファイルの種類を .metroabc としてみます。

 関連付けにより起動された場合、Application クラス の OnFileActivated が呼び出されます。
 パラメータとして渡される FileActivatedEventArgs に情報が設定されていますので、これをそのまま Page のパラメータとして受け渡します。

protected override void OnFileActivated(FileActivatedEventArgs args)
{
    var rootFrame = new Frame();
    rootFrame.Navigate(typeof(BlankPage), args);

    Window.Current.Content = rootFrame;
    Window.Current.Activate();
}

 Page の最初でファイルパスを取り出して TextBox に設定します。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    var args = e.Parameter as IActivatedEventArgs;
    if (args != null)
    {
        if (args.Kind == ActivationKind.File)
        {
            var fileArgs = args as FileActivatedEventArgs;
            fileText.Text = fileArgs.Files[0].Path;
        }
    }
}

 アプリケーションを配置するために一度実行します。
 配置された状態で、任意のフォルダーに拡張子が .metroabc のファイルを作成し、作成したファイルをダブルクリックするとアプリが起動され、取得したファイルパスが表示されます。

独自プロトコルの登録

 独自プロトコルマニフェストファイルに宣言を追加する必要があります。
 宣言タブでプロトコルを追加し、名前を metroabc としてみます。

 独自プロトコルで起動された場合、Application クラス の OnActivated が呼び出されます。
 パラメータとして渡される IActivatedEventArgs に情報が設定されていますので、Page のパラメータとして受け渡します。

protected override void OnActivated(IActivatedEventArgs args)
{
    if (args.Kind == ActivationKind.Protocol)
    {
        var rootFrame = new Frame();
        rootFrame.Navigate(typeof(BlankPage), args);

        Window.Current.Content = rootFrame;
        Window.Current.Activate();
    }
}

 Page の最初で URL を取り出して TextBox に設定する処理を追加します。

protected override void OnNavigatedTo(NavigationEventArgs e)
{
    var args = e.Parameter as IActivatedEventArgs;
    if (args != null)
    {
        if (args.Kind == ActivationKind.File)
        {
            var fileArgs = args as FileActivatedEventArgs;
            fileText.Text = fileArgs.Files[0].Path;
        }
        else if (args.Kind == ActivationKind.Protocol)
        {
            var protocolArgs = args as ProtocolActivatedEventArgs;
            urlText.Text = protocolArgs.Uri.ToString();
        }
    }
}

 アプリケーションを配置するために一度実行します。
 配置された状態で、IE から "metroabc://test/" にアクセスすると、アプリが起動され取得した URL が表示されます。