ページマッピングを利用した分かりやすいUriの利用
ページマッピングとは、ユーザーがリクエストする分かりやすいUriと、実際に配置されているXAMLファイルやHTMLファイルのパスをひもづける(マッピングする)機能のことで、ナビゲーションフレームワークでは、これまで紹介したようにページを直に指定する代わりに、UriMapperクラスを利用することで、分かりやすいUriを利用してページのナビゲーションを行うことができます。
たとえばUriMapperを利用することで、リスト4で「/Views/DrinkPage.xaml?name=cafee」と指定していたリクエストを、シンプルな「/Drink/caffe」というようなリクエストに置き換えることができます。
MainPage.xamlのUriMapperを利用したバージョン
リスト7はMainPage.xamlを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になっていることを確認できると思います。
URIマッピング
URIマッピングについて少し整理しておきましょう。UriMapperコントロールでは表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}にヒットしてしまいます。
| 定義される順番 | 定義されたUri |
| 1 | Uri=/{page} |
| 2 | Uri=/Top |
| 3 | Uri=/Drink/{item} |
/Topや/Drink/{item}にも適用させるためには、/{page}の優先順位を下げるために、一番下に定義する必要があります。

