酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

クラスライブラリ(dll)に定義したページへ遷移する方法

Marketplaceに登録しているアプリも増えてきたので、自作のアプリ一覧ページを作成して、各アプリの項目をタップしたらMarketplaceへ遷移出来るようにしようかなって考えてます。

Windows Marketplace for Mobile(Windows Mobile)時代に登録したのもあって、「和田健司」で登録しています。App Hubもひどくって、publisherの名前が2バイト文字で登録されていると、MarketplaceSearchTaskを使っての検索でその作者のアプリの一覧が表示させられないんですよね(Web Marketplaceの方は検索出来た)。

んで、その回避策として一番最初の案に至ります。ただ、アプリごとにソリューションにアプリ一覧表示用のコードを突っ込むと、アプリ毎にメンテが発生してしまい非常に面倒くさいので、今回はdllにまとめてしまいましょう。各アプリではdllを参照して、NavigationService.Navigate(Uri)をコールするだけで簡単。

構成

構成としては以下のようなソリューションになっています。

AppListTestApp Windows Phone アプリケーション
Softbuild.AppList Windows Phone クラスライブラリ

ソリューションエクスプローラーのスクリーンショットを撮影してみました。

AppListTestAppアプリケーションからSoftbuild.AppList.dllに含まれているApplicationListPage.xamlへ遷移します。

アプリ側からdllのページへの遷移処理

AppListTestAppアプリケーションのMainPageのボタンをタップしたら、NavigationService.Navigateメソッドを使って画面遷移を行います。このメソッド遷移するときに「/{アセンブリ名};component/{ページ名}.xaml」の形でUriを指定します。

  var uriString = "/Softbuild.AppList;component/ApplicationListPage.xaml";

「Softbuild.AppList」の部分がアセンブリ名、「ApplicationListPage.xaml」の部分がページ名です。ページ名はソリューションエクスプローラーを見たらすぐに確認できますが、クラスライブラリのアセンブリ名を調べる場合は、クラスライブラリのプロパティを開いて頂いて、アセンブリ名の項目を見てください。

下記に全体のコードを示します。

using System;
using System.Windows;
using Microsoft.Phone.Controls;

namespace AppListTestApp {
    public partial class MainPage : PhoneApplicationPage {
        // コンストラクター
        public MainPage() {
            InitializeComponent();
            Language = System.Windows.Markup.XmlLanguage.GetLanguage(
                System.Globalization.CultureInfo.CurrentUICulture.Name);
        }

        private void button1_Click(object sender, RoutedEventArgs e) {
            // Softbuild.AppList.dllのApplicationListPage.xamlへ遷移する
            var uriString = "/Softbuild.AppList;component/ApplicationListPage.xaml";
            NavigationService.Navigate(new Uri(uriString, UriKind.Relative));
        }
    }
}

これだけで良いです。この方法を流用すれば、他のアプリでも共通して使いそうなTwitterFacebookの認証画面を別アセンブリdllにまとめるという事も出来ますね。