SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Silverlight 3徹底入門

Silverlight 3で作る業務アプリケーションの要
「ナビゲーションフレームワーク」

Silverlight 3徹底入門(5)

ページマッピングを利用した分かりやすいUriの利用

 ページマッピングとは、ユーザーがリクエストする分かりやすいUriと、実際に配置されているXAMLファイルやHTMLファイルのパスをひもづける(マッピングする)機能のことで、ナビゲーションフレームワークでは、これまで紹介したようにページを直に指定する代わりに、UriMapperクラスを利用することで、分かりやすいUriを利用してページのナビゲーションを行うことができます。

 たとえばUriMapperを利用することで、リスト4で「/Views/DrinkPage.xaml?name=cafee」と指定していたリクエストを、シンプルな「/Drink/caffe」というようなリクエストに置き換えることができます。

MainPage.xamlのUriMapperを利用したバージョン

 リスト7はMainPage.xamlをUriMapperに変更したバージョンです。まずはコードを確認しましょう。

リスト7 リスト1のUriMapperバージョン
<UserControl 
  xmlns:navigation="clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls.Navigation"
  xmlns:uriMapper="clr-namespace:System.Windows.Navigation;assembly=System.Windows.Controls.Navigation"
  x:Class="CodezineNavigation.MainPage"
    略
  >
  <StackPanel x:Name="LayoutRoot">
    <!-- ヘッダーパネル -->
           略
    <StackPanel Orientation="Horizontal">
      <!-- メニューパネル -->
      <Border Margin="5,5,5,5" BorderThickness="1" BorderBrush="Black">
        <StackPanel MinWidth="75" MinHeight="150">
          <HyperlinkButton Content="トップ" NavigateUri="/Top" />
          <HyperlinkButton Content="概要" NavigateUri="/About" />
          <HyperlinkButton Content="二郎" NavigateUri="/Drink/jiro" />
          <HyperlinkButton Content="CodeZine" NavigateUri="/CodeZine" />
        </StackPanel>
      </Border>

      <!-- ナビゲーションフレームパネル -->
      <StackPanel Margin="0,5,5,5">
        <navigation:Frame x:Name="ContentsFrame" Source="/Top" >
          <!-- ページマッピング -->
<navigation:Frame.UriMapper>
<uriMapper:UriMapper>
<uriMapper:UriMapping Uri="" MappedUri="/Views/TopPage.xaml" />
<uriMapper:UriMapping Uri="/Top" MappedUri="/Views/TopPage.xaml" />
<uriMapper:UriMapping Uri="/Drink/{item}"
MappedUri="/Views/DrinkPage.xaml?item={item}" />
<uriMapper:UriMapping Uri="/CodeZine" MappedUri="http://codezine.jp" />
<uriMapper:UriMapping Uri="/{Name}" MappedUri="/Views/{Name}Page.xaml" />
</uriMapper:UriMapper>
</navigation:Frame.UriMapper>
</navigation:Frame> </StackPanel></StackPanel></StackPanel></UserControl>
1. 名前空間の定義(3行目)

 UriMapperコントロールはSystem.Windows.Controls.NavigationアセンブリーのSystem.Windows.Navigation名前空間に含まれます。Frameコントロールと同じようにxmlの名前空間定義を行います。

2. ページマッピングの定義(38行目から47行目)

 リクエストされたUriと実際のパスにたするUriマッピングを定義し、FrameコントロールのUriMapperプロパティーに設定します。

3. NavigateUriプロパティーとSourceプロパティー

 2で設定したUriのパターンのUriを指定することで、マッピングされたUriのファイルへリンクされます。

 実際のページの指定がFrameコントロールのUriMapperで管理されたことで、HyperlinkButtonコントロールでそれぞれ指定していたUriが分かりやすいUriになっているのが分かるかと思います。

 実行すると図15のように図13とほぼ同じような結果になりますが、Uriの部分が、ページの物理パスでなく、マッピングに利用したUriになっていることを確認できると思います。

図15 UriMapper使用時の実行結果
図15 UriMapper使用時の実行結果

URIマッピング

 URIマッピングについて少し整理しておきましょう。UriMapperコントロールでは表1のようなマッピングを利用することができます。

表1 マッピングの種類
No リクエストするUri マッピングルール マッピングされたUri
1 /Top Uri="/Top" MappedUri="/Views/TopPage.xaml" /Views/TopPage.xaml
2 /CodeZine Uri="/CodeZine" MappedUri="http://codezine.jp" http://codezine.jp
3 /About Uri="/{page}" MappedUri="/Views/{page}Page.xaml" /Views/AboutPage.xaml
4 /Drink/Jiro Uri="/Drink/{item}" MappedUri="/Views/{category}Page.xaml?item={item}" /Views/DrinkPage.xaml?item=Jiro
単純なパターンのマッピング

 1の例ではリクエストされたUriが/Topである場合に/Views/TopPage.xamlにUriを変換します。

 2も同様に/CodeZineである場合に、http://codezine.jpにUriを変換します。

プレースフォルダーを利用したページのマッピング

 3の例ではリクエストされたUriが「/」(スラッシュ)から始まるUriである場合に、「/」以降の文字列を利用してMappedUriのUriに変換しています。

 この例では、/Aboutが/Views/AboutPage.xamlに変換されています。

プレースフォルダーを利用したパラメーターのマッピング

 4の例ではリクエストされたUriが/Drink/から始まるUriである場合に、/Drink/以降の文字列を利用してMappedUriのUriに変換しています。

 ページマッピングは単なる文字列の変換処理です。プレースフォルダーは3の例のようにページ名だけでなくパラメーター名にも適用できます。

 この例では、/Drink/Jiroが/Views/DrinkPage.xaml?item=jiroに変換されています。

マッピングの解決順序

 Uriの解決はUriMapperに定義されたUriMappingで一番最初にヒットしたパターンが採用されます。つまりリスト6のUriPappingのUriが表2の順番で定義されていると、/Topや/Drink/Jiroといったリクエストもすべて一番最初に定義されている/{page}にヒットしてしまいます。

表2 間違ったマッピングの順序
定義される順番 定義されたUri
1 Uri=/{page}
2 Uri=/Top
3 Uri=/Drink/{item}

 /Topや/Drink/{item}にも適用させるためには、/{page}の優先順位を下げるために、一番下に定義する必要があります。

次のページ
コードによるナビゲーション

この記事は参考になりましたか?

Silverlight 3徹底入門連載記事一覧

もっと読む

この記事の著者

山田 祥寛(ヤマダ ヨシヒロ)

静岡県榛原町生まれ。一橋大学経済学部卒業後、NECにてシステム企画業務に携わるが、2003年4月に念願かなってフリーライターに転身。Microsoft MVP for Visual Studio and Development Technologies。執筆コミュニティ「WINGSプロジェクト」代表。主な著書に「独習シリーズ(Java・C#・Python・PHP・Ruby・JSP&サーブレットなど)」「速習シリーズ(ASP.NET Core・Vue.js・React・TypeScript・ECMAScript、Laravelなど)」「改訂3版JavaScript本格入門」「これからはじめるLaravel実践入門」「はじめてのAndroidアプリ開発 Kotlin編 」他、著書多数

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

WINGSプロジェクト かるあ (杉山 洋一)(カルア(スギヤマ ヨウイチ))

WINGSプロジェクトについて>有限会社 WINGSプロジェクトが運営する、テクニカル執筆コミュニティ(代表 山田祥寛)。主にWeb開発分野の書籍/記事執筆、翻訳、講演等を幅広く手がける。 2026年時点での登録メンバは約50名で、現在も執筆メンバを募集中。興味のある方は、どしどし応募頂きたい。著書記事多数。 RSS X: @WingsPro_info(公式)、@WingsPro_info/wings(メンバーリスト) Facebook

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/4810 2010/02/10 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー