ナビゲーションの概要

更新 : 2008 年 7 月

Windows Presentation Foundation (WPF) は、2 種類のアプリケーション (スタンドアロン アプリケーションと XAML ブラウザ アプリケーション (XBAP)) で使用可能なブラウザ スタイルのナビゲーションをサポートします。ナビゲーション用にコンテンツをパッケージ化するために、WPF は Page クラスを提供します。Page 間は、Hyperlink を使用して宣言したり、NavigationService を使用してプログラムによってナビゲートできます。WPF は、ナビゲート元のページを記録して、それらのページに戻るために履歴を使用します。

PageHyperlinkNavigationService、および履歴は、WPF によって提供されるナビゲーション サポートの中核を形成しています。この概要では、Loose Extensible Application Markup Language (XAML) ファイル、HTML ファイル、およびオブジェクトへのナビゲーションを含む高度なナビゲーション サポートについて説明する前に、それらの機能について詳細に説明します。

メモ :

ここでは、"ブラウザ" という用語は、WPF のアプリケーションをホスト可能なブラウザのみを指しています。現在のところ、これには Internet Explorer 7、Microsoft Internet Explorer 6、Firefox 2.0 以降が含まれます。特定の WPF 機能が特定のブラウザでのみサポートされる場合は、ブラウザ バージョンを示します。

このトピックには次のセクションが含まれています。

  • WPF アプリケーションでのナビゲーション
  • NavigationWindow クラス
  • Frame クラス
  • ナビゲーション ホスト
  • XAML ページ以外のコンテンツへのナビゲート
  • セキュリティ
  • 関連トピック

WPF アプリケーションでのナビゲーション

ここでは、WPF の主なナビゲーション機能の概要について説明します。このトピックでは、XBAP のコンテキスト内でこれらの機能について説明します。これらの機能はスタンドアロン アプリケーションと XBAP の両方で使用できます

メモ :

ここでは、XBAP をビルドして配置する方法については説明しません。XBAP の詳細については、「Windows Presentation Foundation XAML ブラウザ アプリケーションの概要」を参照してください。

ナビゲーションの次の側面について説明します。

  • ページの実装

  • 開始ページの構成

  • ホスト ウィンドウのタイトル、幅、および高さの構成

  • ハイパーリンク ナビゲーション

  • フラグメント ナビゲーション

  • ナビゲーション サービス

  • ナビゲーション サービスを使用するプログラム ナビゲーション

  • ナビゲーションの有効期間

  • 履歴によるナビゲーションの記録

  • ページの有効期間と履歴

  • ナビゲーション履歴を使用したコンテンツ状態の保持

  • Cookie

  • 構造化ナビゲーション

ページの実装

WPF では、.NET Framework オブジェクト、カスタム オブジェクト、列挙値、ユーザー コントロール、XAML ファイル、および HTML ファイルを含むさまざまなコンテンツ タイプにナビゲートできます。ただし、コンテンツをパッケージ化する最も一般的で便利な方法は、Page を使用することです。さらに、Page はナビゲーション固有の機能を実装し、それらの外観を向上して開発を単純化します。

Page を使用すると、次のようなマークアップを使用して、XAML コンテンツのナビゲート可能なページを宣言によって実装できます。

<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation" />

XAML マークアップで実装される Page には、ルート要素としての Page があり、WPF XML 名前空間宣言が必要です。Page 要素には、ナビゲートして表示するコンテンツが格納されます。コンテンツは、次のマークアップに示すように、Page.Content プロパティ要素を設定して追加します。

<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation">
  <Page.Content>
    <!-- Page Content -->
    Hello, Page!
  </Page.Content>
</Page>

Page.Content には 1 つの子要素のみを格納できます。前の例では、コンテンツは単一の文字列 "Hello, Page!" です。実際の開発では、一般的に、レイアウト コントロールを子要素として使用し (「レイアウト システム」を参照)、コンテンツを格納して構成します。

Page 要素の子要素は、Page のコンテンツと見なされるため、明示的な Page.Content 宣言を使用する必要はありません。次のマークアップは、前のサンプルの宣言と同等です。

<Page xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation">
  <!-- Page Content -->
  Hello, Page!
</Page>

この場合、Page.Content は、Page 要素の子要素を使用して自動的に設定されます。詳細については、「WPF のコンテンツ モデル」を参照してください。

マークアップのみの Page は、コンテンツを表示するとき役立ちます。ただし、Page はユーザーによるページの操作を可能にするコントロールも表示し、イベントを処理してアプリケーション ロジックを呼び出すことによって、ユーザー操作に応答できます。対話形式の Page は、次の例に示すように、マークアップと分離コードの組み合わせを使用して実装されます。

マークアップ ファイルと分離コード ファイルを連携させるには、次の構成が必要です。

  • マークアップの Page 要素に、x:Class 属性を含める必要があります。アプリケーションのビルド時にマークアップ ファイルに x:Class が含まれていると、Microsoft ビルド エンジン (MSBuild) は、x:Class 属性で指定された名前を持つ、Page から派生したpartialクラスを作成します。そのためには、XAML スキーマ (xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml") に XML 名前空間宣言を追加する必要があります。生成されたpartialクラスは InitializeComponent を実装します。これを呼び出すとイベントが登録され、マークアップで実装されるプロパティが設定されます。

  • 分離コードでは、クラスは、マークアップ内の x:Class 属性で指定されている名前を持つpartialクラスでなければなりません。また、Page から派生する必要があります。これによって、分離コード ファイルと、アプリケーションのビルド時にマークアップ ファイル用に生成されるpartialクラスとが関連付けられます (「WPF アプリケーション (WPF) のビルド」を参照)。

  • 分離コードでは、Page クラスが実装するコンストラクタで InitializeComponent メソッドを呼び出す必要があります。InitializeComponent は、マークアップ ファイル用に生成されたpartialクラスによって実装されるもので、イベントの登録と、マークアップで定義されたプロパティの設定を実行します。

メモ :

Microsoft Visual Studio を使用してプロジェクトに新しい Page を追加すると、ここでの説明したように、マークアップと分離コードの両方を使用して Page が実装され、マークアップ ファイルと分離コード ファイル間の関連付けの作成に必要な構成が組み込まれます。

Page を作成すると、これにナビゲートできるようになります。アプリケーションがナビゲートする最初の Page を指定するには、開始 Page を構成する必要があります。

開始ページの構成

XBAP では、一定の量のアプリケーション インフラストラクチャをブラウザでホストする必要があります。WPF では、Application クラスは、必要なアプリケーション インフラストラクチャを確立するアプリケーション定義の一部です (「アプリケーション管理の概要」を参照)。

アプリケーション定義は、通常、マークアップと分離コードの両方を使用して、MSBuild ApplicationDefinition 項目として構成されたマークアップ ファイルで実装されます。XBAP のアプリケーション定義を次に示します。

XBAP では、そのアプリケーション定義を使用して開始 Page を指定できます。このページは、XBAP が起動したときに自動的に呼び出される Page です。これを行うには、StartupUri プロパティを目的の Page の 統一リソース識別子 (URI) に設定します。

メモ :

ほとんどの場合、Page はアプリケーションにコンパイルされるか、アプリケーションと共に配置されます。このような場合、Page を識別する URI は、パッケージ URI です。この URI は、パッケージ スキームに準拠した URI です。パッケージ URI については、「Windows Presentation Foundation におけるパッケージの URI」で詳細に説明します。以下で説明する http スキームを使用してコンテンツにナビゲートすることもできます。

次の例に示すように、マークアップで宣言によって StartupUri を設定できます。

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App"
    StartupUri="PageWithHyperlink.xaml" />

この例では、HomePage.xaml を識別する相対パッケージ URI によって StartupUri 属性を設定します。XBAP が起動すると、自動的に HomePage.xaml にナビゲートしてこのページが表示されます。次の図に、Web サーバーから起動された XBAP を示します。

XBAP ページ

メモ :

XBAP の開発および配置の詳細については、「Windows Presentation Foundation XAML ブラウザ アプリケーションの概要」と「WPF アプリケーションの配置 (WPF)」を参照してください。

ホスト ウィンドウのタイトル、幅、および高さの構成

前の図を見て気付くことは、ブラウザとタブ パネルのタイトルがどちらも XBAP の URI になっていることです。タイトルは、長いだけでなく、見た目が良いわけでも役立つ情報になっているわけでもありません。このため、Page には、WindowTitle プロパティを設定することによってタイトルを変更する方法が用意されています。さらに、WindowWidthWindowHeight を設定して、ブラウザ ウィンドウのそれぞれ幅と高さを構成することができます。

WindowTitleWindowWidth、および WindowHeight は、次の例に示すように、マークアップで宣言して設定できます。

<Page
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.HomePage"
    WindowTitle="Page Title"
    WindowWidth="500"
    WindowHeight="200">
  Hello, from the XBAP HomePage!
</Page>

結果は次の図のようになります。

ウィンドウのタイトル、高さ、幅

ハイパーリンク ナビゲーション

一般的な XBAP は複数のページで構成されます。あるページから別のページにナビゲートする最も簡単な方法は、Hyperlink を使用することです。次のマークアップに示すように、Hyperlink 要素を使用すると、Hyperlink を Page に宣言によって追加できます。

<Page
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  WindowTitle="Page With Hyperlink"
  WindowWidth="250"
  WindowHeight="250">


...


<Hyperlink NavigateUri="UriOfPageToNavigateTo.xaml">
  Navigate to Another Page
</Hyperlink>


...


</Page>

Hyperlink 要素には次のものが必要です。

  • NavigateUri 属性によって指定される、ナビゲート先の Page のパッケージ URI。

  • テキストやイメージなど、ナビゲーションを開始するときにクリック可能なコンテンツ (Hyperlink 要素に格納可能なコンテンツについては、Hyperlink を参照)。

Hyperlink が存在する Page を持つ XBAP を次の図に示します。

ハイパーリンクを含むページ

想定されるとおり、Hyperlink をクリックすると、XBAP が NavigateUri 属性によって識別される Page にナビゲートします。さらに、XBAP は前の Page のエントリを、Internet Explorer 7 の [最近表示したページ] の一覧に追加します。これを次の図に示します。

[戻る] ボタンと [次に進む] ボタン

Page 間のナビゲーションをサポートすると同時に、Hyperlink は、フラグメント ナビゲーションもサポートします。

フラグメント ナビゲーション

フラグメント ナビゲーションは、現在の Page または別の Page にあるコンテンツ フラグメントへのナビゲーションです。WPF では、コンテンツ フラグメントは名前付き要素に格納されるコンテンツです。名前付き要素とは、Name 属性が設定されている要素です。コンテンツ フラグメントが格納された TextBlock 要素を次のマークアップに示します。

<Page
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    WindowTitle="Page With Fragments" >


...


<!-- Content Fragment called "Fragment1" -->
<TextBlock Name="Fragment1">
  Ea vel dignissim te aliquam facilisis ...
</TextBlock>


...


</Page>

コンテンツ フラグメントにナビゲートする Hyperlink の場合、NavigateUri 属性に次のものを含める必要があります。

  • ナビゲート先のコンテンツ フラグメントがある Page の URI。

  • "#" 文字。

  • コンテンツ フラグメントがある Page 上の要素の名前。

フラグメント URI の形式は、次のとおりです。

PageURI#ElementName

コンテンツ フラグメントにナビゲートするように構成されている Hyperlink の例を次に示します。

<Page
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  WindowTitle="Page That Navigates To Fragment" >


...


<Hyperlink NavigateUri="PageWithFragments.xaml#Fragment1">
  Navigate To pack Fragment
</Hyperlink>


...


</Page>

フラグメント ナビゲーションの詳細な例については、「フラグメント ナビゲーションのサンプル」を参照してください。

メモ :

ここでは、WPF でのデフォルト フラグメント ナビゲーション実装について説明します。WPF では、NavigationService.FragmentNavigation イベントの処理などが必要な独自のフラグメント ナビゲーション スキームを実装することもできます。

重要 :

Loose XAML ページ (ルート要素として Page を持つマークアップのみの XAML ファイル) 内のフラグメントには、HTTP を使用してページを参照可能な場合のみナビゲートできます。

ただし、Loose XAML ページは、自身のフラグメントにナビゲートできます。

ナビゲーション サービス

Hyperlink を使用すると、ユーザーは特定の Page へのナビゲーションを開始できますが、ページの位置の特定とダウンロードは NavigationService クラスによって実行されます。基本的に、NavigationServiceHyperlink などのクライアント コードの代わりに、ナビゲーション要求を処理できます。さらに、NavigationService はナビゲーション要求の追跡および制御の高レベルなサポートを実装します。

Hyperlink がクリックされると、WPF は NavigationService.Navigate を呼び出し、指定されたパッケージ URI にある Page を特定してダウンロードします。ダウンロードされた Page は、ルート オブジェクトが、ダウンロードされた Page のインスタンスとなっているオブジェクトのツリーに変換されます。ルート Page オブジェクトへの参照は、NavigationService.Content プロパティに格納されます。ナビゲート先のコンテンツのパッケージ URI は、NavigationService.Source プロパティに格納されますが、NavigationService.CurrentSource にはナビゲート先の最後のページのパッケージ URI が格納されます。

メモ :

WPF アプリケーションには、現在アクティブな NavigationService が複数存在していてもかまいません。詳細については、このトピックで後述する「ナビゲーション ホスト」を参照してください。

ナビゲーション サービスを使用するプログラム ナビゲーション

ナビゲーションが、Hyperlink を使用してマークアップで宣言として実装されている場合は、開発者が NavigationService について認識していなくてもかまいません。Hyperlink が自動的に NavigationService を使用するためです。つまり、Hyperlink の直接または間接的な親がナビゲーション ホスト (「ナビゲーション ホスト」を参照) である場合、Hyperlink は、そのナビゲーション ホストのナビゲーション サービスを発見および使用して、ナビゲーション要求を処理できます。

ただし、次の場合は NavigationService を直接使用する必要があります。

  • 既定以外のコンストラクタを使用して Page をインスタンス化する必要がある場合。

  • ナビゲートする前に Page のプロパティを設定する必要がある場合。

  • どの Page にナビゲートするかが、実行時まで決定できない場合。

これらの場合は、NavigationService オブジェクトの Navigate メソッドを呼び出して、プログラムよってナビゲーションを開始するためのコードを記述する必要があります。そのためには、NavigationService への参照を取得する必要があります。

「ナビゲーション ホスト」で説明する理由によって、WPF アプリケーションには複数の NavigationService が存在していてもかまいません。これは、コードに NavigationService (通常は、現在の Page にナビゲートした NavigationService) を検索する方法が必要なことを意味します。NavigationService への参照は、static NavigationService.GetNavigationService メソッドを呼び出して取得できます。特定の Page にナビゲートした NavigationService を取得するには、参照を GetNavigationService メソッドの引数として Page に渡します。現在の PageNavigationService を取得する方法を次のコードに示します。

using System.Windows.Navigation; // NavigationServce


...


// Get a reference to the NavigationService that navigated to this Page
NavigationService ns = NavigationService.GetNavigationService(this);

PageNavigationService を検索するショートカットとして、PageNavigationService プロパティを実装します。これを次の例に示します。

using System.Windows.Navigation; // NavigationServce


...


// Get a reference to the NavigationService that navigated to this Page
NavigationService ns = this.NavigationService;
メモ :

Page によって Loaded イベントが発生した場合、Page は、その NavigationService への参照のみを取得できます。

ページ オブジェクトへのプログラム ナビゲーション

NavigationService を使用して、Page にプログラムによってナビゲートする方法を次の例に示します。ナビゲート先の Page は、1 つの既定以外のコンストラクタを使用した場合にのみインスタンス化できるため、プログラム ナビゲーションが必要になります。既定以外のコンストラクタを持つ Page を、次のマークアップおよびコードに示します。

<Page
    x:Class="SDKSample.PageWithNonDefaultConstructor"
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    Title="PageWithNonDefaultConstructor">

  <!-- Content goes here -->

</Page>
using System.Windows.Controls; // Page

namespace SDKSample
{
    public partial class PageWithNonDefaultConstructor : Page
    {
        public PageWithNonDefaultConstructor(string message)
        {
            InitializeComponent();

            this.Content = message;
        }
    }
}

既定以外のコンストラクタを持つ Page にナビゲートする Page を、次のマークアップおよびコードに示します。

<Page
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.NSNavigationPage">

  <Hyperlink Click="hyperlink_Click">
    Navigate to Page with Non-Default Constructor
  </Hyperlink>

</Page>
using System.Windows; // RoutedEventArgs
using System.Windows.Controls; // Page
using System.Windows.Navigation; // NavigationService

namespace SDKSample
{
    public partial class NSNavigationPage : Page
    {
        public NSNavigationPage()
        {
            InitializeComponent();
        }

        void hyperlink_Click(object sender, RoutedEventArgs e)
        {
            // Instantiate the page to navigate to
            PageWithNonDefaultConstructor page = new PageWithNonDefaultConstructor("Hello!");

            // Navigate to the page, using the NavigationService
            this.NavigationService.Navigate(page);
        }
    }
}

この Page 上の Hyperlink がクリックされると、既定以外のコンストラクタを使用して NavigationService.Navigate メソッドを呼び出し、ナビゲート先の Page をインスタンス化することによって、ナビゲーションが開始されます。Navigate は、パッケージ URI ではなく、NavigationService がナビゲートするオブジェクトへの参照を受け取ります。

パッケージ URI を使用するプログラム ナビゲーション

パッケージ URI をプログラムによって構築する必要がある場合 (たとえば、実行時にのみパッケージ URI を決定できる場合など) は、NavigationService.Navigate メソッドを使用できます。これを次の例に示します。

<Page
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.NSUriNavigationPage">
  <Hyperlink Click="hyperlink_Click">Navigate to Page by Pack URI</Hyperlink>
</Page>
using System; // Uri, UriKind
using System.Windows; // RoutedEventArgs
using System.Windows.Controls; // Page
using System.Windows.Navigation; // NavigationService

namespace SDKSample
{
    public partial class NSUriNavigationPage : Page
    {
        public NSUriNavigationPage()
        {
            InitializeComponent();
        }

        void hyperlink_Click(object sender, RoutedEventArgs e)
        {
            // Create a pack URI
            Uri uri = new Uri("AnotherPage.xaml", UriKind.Relative);

            // Get the navigation service that was used to 
            // navigate to this page, and navigate to 
            // AnotherPage.xaml
            this.NavigationService.Navigate(uri);
        }
    }
}

現在のページの更新

Page が、NavigationService.Source プロパティに格納されているパッケージ URI と同じパッケージ URI を持つ場合、このページはダウンロードされません。WPF で現在のページを再度強制的にダウンロードするには、次の例に示すように NavigationService.Refresh メソッドを呼び出します。

<Page
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.NSRefreshNavigationPage">
 <Hyperlink Click="hyperlink_Click">Refresh this page</Hyperlink>
</Page>
using System.Windows; // RoutedEventArgs
using System.Windows.Controls; // Page
using System.Windows.Navigation; // NavigationService

namespace SDKSample
{
    public partial class NSRefreshNavigationPage : Page
    {


...


        void hyperlink_Click(object sender, RoutedEventArgs e)
        {
            // Force WPF to download this page again
            this.NavigationService.Refresh();
        }
    }
}

ナビゲーションの有効期間

これまで説明したように、ナビゲーションを開始するには多くの方法があります。ナビゲーションを開始すると、ナビゲーションの進行中は、NavigationService によって実装された次のイベントを使用して、ナビゲーションを追跡および制御できます。

  • 新しいナビゲーションが要求されたときに発生します。ナビゲーションのキャンセルに使用できます。

  • ダウンロード中に定期的に発生して、ナビゲーションの進行状況に関する情報を提供します。

  • ページの位置の特定とダウンロードが完了したときに発生します。

  • ナビゲーションが (StopLoading の呼び出しによって) 中止されたときや、現在のナビゲーションの進行中に新しいナビゲーションが要求されたときに発生します。

  • 要求されたコンテンツにナビゲートするときにエラーが発生した場合に発生します。

  • ナビゲート先のコンテンツが読み込まれ、解析されて、レンダリングが開始されると発生します。

  • FragmentNavigation. コンテンツ フラグメントへのナビゲーションが開始されたときに、次のタイミングで発生します。

    • 目的のフラグメントが現在のコンテンツに含まれる場合はすぐに発生します。

    • 目的のフラグメントが別のコンテンツに含まれる場合は、ソース コンテンツが読み込まれた後で発生します。

ナビゲーション イベントが発生する順序を次の図に示します。

ページ ナビゲーションのフロー チャート

通常、Page はこれらのイベントの影響を受けません。アプリケーションはこれらのイベントの影響を受ける可能性が高いため、これらのイベントは Application クラスによっても発生します。

NavigationService によってイベントが発生するたびに、Application クラスによって対応するイベントが発生します。Frame および NavigationWindow は、それぞれのスコープ内でナビゲーションを検出する同じイベントを提供します。

場合によっては、Page がこれらのイベントに関与することがあります。たとえば、PageNavigationService.Navigating イベントを処理して、ページ外へのナビゲーションをキャンセルするかどうかを決定する場合があります。これを次の例に示します。

<Page
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.CancelNavigationPage">
  <Button Click="button_Click">Navigate to Another Page</Button>
</Page>
using System; // Uri, UriKind
using System.Windows; // RoutedEventArgs, MessageBox, MessageBoxResult
using System.Windows.Controls; // Page
using System.Windows.Navigation; // NavigationService, NavigatingCancelEventArgs

namespace SDKSample
{
    public partial class CancelNavigationPage : Page
    {
        public CancelNavigationPage()
        {
            InitializeComponent();

            // Can only access the NavigationService when the page has been loaded
            this.Loaded += new RoutedEventHandler(CancelNavigationPage_Loaded);
            this.Unloaded += new RoutedEventHandler(CancelNavigationPage_Unloaded);
        }

        void button_Click(object sender, RoutedEventArgs e)
        {
            // Force WPF to download this page again
            this.NavigationService.Navigate(new Uri("AnotherPage.xaml", UriKind.Relative));
        }

        void CancelNavigationPage_Loaded(object sender, RoutedEventArgs e)
        {
            this.NavigationService.Navigating += new NavigatingCancelEventHandler(NavigationService_Navigating);
        }

        void CancelNavigationPage_Unloaded(object sender, RoutedEventArgs e)
        {
            this.NavigationService.Navigating -= new NavigatingCancelEventHandler(NavigationService_Navigating);
        }

        void NavigationService_Navigating(object sender, NavigatingCancelEventArgs e)
        {
            // Does the user really want to navigate to another page?
            MessageBoxResult result;
            result = MessageBox.Show("Do you want to leave this page?", "Navigation Request", MessageBoxButton.YesNo);

            // If the user doesn't want to navigate away, cancel the navigation
            if (result == MessageBoxResult.No) e.Cancel = true;
        }
    }
}

前の例で行ったように、Page からのナビゲーション イベントを含むハンドラを登録する場合、イベント ハンドラの登録を解除する必要もあります。解除しない場合、WPF ナビゲーションが履歴を使用して Page ナビゲーションを記録する方法に関して副作用が発生する可能性があります。

履歴によるナビゲーションの記録

WPF は、"戻る" スタックと "進む" スタックの 2 つのスタックを使用して、ナビゲート元のページを記録します。現在の Page から新しい Page にナビゲートするか、既存の Page に進む場合、現在の Page が "戻る" スタックに追加されます。現在の Page から前の Page に戻る場合、現在の Page が "進む" スタックに追加されます。"戻る" スタック、"進む" スタック、およびそれらを管理する機能を、まとめて履歴と呼びます。"戻る" スタックと "進む" スタックの各項目は、JournalEntry クラスのインスタンスです。これを履歴エントリと呼びます。

Internet Explorer 7 からの履歴のナビゲート

概念として、履歴は Internet Explorer 7 の [戻る] ボタンおよび [進む] ボタンと同じように機能します。次の図に例を示します。

[戻る] ボタンと [次に進む] ボタン

Internet Explorer 7 によってホストされる XBAP の場合、WPF は履歴を Internet Explorer 7 のナビゲーション UI に統合します。これによって、ユーザーは Internet Explorer 7 の [戻る]、[進む]、および [最近表示したページ] の各ボタンを使用して XBAP のページ間をナビゲートできるようになります。Microsoft Internet Explorer 6 には、Internet Explorer 7 と同じ方法では履歴は統合されません。代わりに、WPF は代替ナビゲーション UI をレンダリングします。

重要 :

Internet Explorer 7 では、ユーザーが XBAP との間をナビゲートすると、履歴に保持されていないページの履歴項目のみが履歴に保持されます。ページを履歴に保持する方法については、このトピックで後述する「ページの有効期間と履歴」を参照してください。

既定では、Internet Explorer 7 の [最近表示したページ] の一覧に表示される各 Page のテキストは、Page の URI になっています。多くの場合、これはユーザーにとって特別な意味がありません。このため、次のオプションのいずれかを使用してテキストを変更できます。

  1. JournalEntry.Name 添付属性値。

  2. Page.Title 属性値。

  3. Page.WindowTitle 属性値、および現在の Page の URI。

  4. 現在の Page の URI。(既定)。

これらのオプションの順序は、テキスト検索の優先順位と一致します。たとえば、JournalEntry.Name が設定されている場合、他の値は無視されます。

Page.Title 属性を使用して、履歴エントリに表示されるテキストを変更する方法を次の例に示します。

<Page
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.PageWithTitle"
    Title="This is the title of the journal entry for this page.">


...


</Page>
using System.Windows.Controls; // Page

namespace SDKSample
{
    public partial class PageWithTitle : Page
    {


...


    }
}

WPF を使用する履歴のナビゲート

ユーザーは Internet Explorer 7 の [戻る]、[進む]、および [最近表示したページ] を使用して履歴をナビゲートできますが、WPF で提供された宣言による機構やプログラムによる機構を使用しても履歴をナビゲートできます。これを行うのは、たとえば、独自のナビゲーション UI をページに表示する場合です。

NavigationCommands で公開されるナビゲーション コマンドを使用して、履歴ナビゲーション サポートを宣言によって追加できます。BrowseBack ナビゲーション コマンドの使用方法を次の例に示します。

<Page
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.NavigationCommandsPage">


...


<Hyperlink Command="NavigationCommands.BrowseBack">Back</Hyperlink>


...


</Page>

NavigationService クラスの次のメンバのいずれかを使用して、プログラムによって履歴をナビゲートできます。

このトピックの「ナビゲーション履歴を使用したコンテンツ状態の保持」で後述するように、プログラムによって履歴を操作することも可能です。

ページの有効期間と履歴

グラフィックス、アニメーション、メディアなどのリッチ コンテンツを含む、複数のページが存在する XBAP について説明します。特にビデオやオーディオ メディアが使用されている場合、これらのページのメモリ使用量は、長時間が経過すると非常に大きくなる可能性があります。履歴がナビゲート先のページを "記録" することを考えると、このような XBAP はすぐに大量のメモリを消費してしまいます。

このため、履歴の既定の動作では、Page オブジェクトへの参照ではなく、Page メタデータが各履歴エントリに格納されます。履歴エントリにナビゲートすると、その Page メタデータを使用して、指定した Page の新しいインスタンスが作成されます。結果として、ナビゲートされた各 Page には、次の図に示す有効期間が設定されます。

ページの有効期間

既定の履歴動作を使用するとメモリの消費を節約できますが、特にコンテンツが多い場合は、ページごとのレンダリングのパフォーマンスが低下し、Page の再インスタンス化に時間がかかる可能性があります。Page インスタンスを履歴に保持する必要がある場合、2 つの方法を使用してこれを行うことができます。1 つ目の方法は、NavigationService.Navigate メソッドを呼び出すことによって、Page オブジェクトにプログラムによるナビゲートを行います。

2 つ目の方法は、KeepAlive プロパティを true (既定では false) に設定することによって、WPF が Page のインスタンスを履歴に保持するように指定します。次の例に示すように、マークアップで宣言によって KeepAlive を設定できます。

<Page
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.KeepAlivePage"
    KeepAlive="True">

  An instance of this page is stored in the journal.

</Page>

履歴に保持される Page と保持されないページの有効期間は、わずかに異なります。履歴に保持される Page が初めてナビゲートされると、履歴に保持されない Page と同様にインスタンス化されます。ただし、Page のインスタンスは履歴に保持されるため、履歴に残っている限り再びインスタンス化されることはありません。したがって、Page がナビゲートされるたびに呼び出す必要がある初期化ロジックを Page が持っている場合、それをコンストラクタから Loaded イベントのハンドラに移動する必要があります。このようにしても、次の図に示すように、Page がナビゲート先およびナビゲート元となるたびに、それぞれ Loaded イベントと Unloaded イベントが発生します。

Loaded イベントと Unloaded イベントが発生した場合

Page が履歴に保持されない場合、次のいずれの操作も行わないでください。

  • ページへの参照、または一部分を格納する。

  • ページによって実装されていないイベントのイベント ハンドラを登録する。

このいずれかの操作を行うと、Page を履歴から削除した後でも強制的にメモリに保持される参照が作成されます。

通常は、Page を履歴に保持しない Page の既定の動作をお勧めします。ただし、これには次のセクションで説明する状態も関係します。

ナビゲーション履歴を使用したコンテンツ状態の保持

Page が履歴に保持されず、ユーザーからデータを収集するコントロールを持っている場合、ユーザーが Page との間でナビゲートすると、データに対して何が行われるでしょうか。ユーザー エクスペリエンスの観点では、ユーザーは前に入力したデータが表示されることを期待します。しかし、Page の新しいインスタンスはナビゲーションごとに作成されるため、データを収集したコントロールが再インスタンス化されてデータは失われます。

ただし、履歴は Page ナビゲーション間をまたいだデータ (コントロール データなど) の記録をサポートします。具体的には、各 Page の履歴エントリは、関連している Page 状態情報の一時的なコンテナとして機能します。Page からナビゲートするときにこのサポートがどのように使用されるかを次の手順に示します。

  1. 現在の Page のエントリが履歴に追加されます。

  2. Page の状態情報が、そのページの履歴エントリに格納され、"戻る" スタックに追加されます。

  3. 新しい Page にナビゲートします。

履歴を使用してページ Page に戻るときは、次の手順が実行されます。

  1. Page ("戻る" スタックの 1 番上の履歴エントリ) がインスタンス化されます。

  2. Page の履歴エントリに格納された状態情報を使用して、Page が更新されます。

  3. Page に戻ります。

Page で次のコントロールが使用されると、WPF は自動的にこのサポートを使用します。

次の図の [Favorite Color] ListBox が示すように、Page がこれらのコントロールを使用する場合、項目に入力されたデータが Page ナビゲーション間をまたいで記録されます。

状態を記憶するコントロールを含むページ

前述の一覧にないコントロールが Page にある場合や、状態情報がカスタム オブジェクトに格納されている場合、Page ナビゲーション間をまたぐ状態を履歴に記録するコードを記述する必要があります。

Page ナビゲーション間をまたぐ少量の状態情報を記録する必要がある場合、FrameworkPropertyMetadata.Journal メタデータ フラグを使用して構成された依存関係プロパティ (DependencyProperty を参照) を使用できます。例については、「ページ インスタンス間で状態の項目を 1 つ記憶する」を参照してください。

ナビゲーション間をまたいで記録する必要がある Page の状態情報が複数のデータで構成される場合は、状態情報を 1 つのクラスにカプセル化して IProvideCustomContentState を実装する方が、コードが簡単になる場合があります。詳細については、「ページ インスタンス間で状態のセットを 1 つ記憶する」を参照してください。

Page 自体からはナビゲートせずに、1 つの Page のさまざまな状態情報をナビゲートする必要がある場合、IProvideCustomContentStateNavigationService.AddBackEntry を使用できます。詳細については、「ページ インスタンスごとに状態のセットを複数記憶する」を参照してください。

WPF アプリケーションがデータを格納する別の方法では、Cookie を使用します。Cookie は、SetCookie メソッドと GetCookie メソッドを使用して作成、更新、および削除されます。WPF で作成できる Cookie は、他の種類の Web アプリケーションが使用 Cookie と同じです。Cookie とは、アプリケーション セッションが完了するまで、または複数のアプリケーション セッションにわたって、クライアント コンピュータ上にアプリケーションによって格納される任意のデータです。Cookie データは通常、次のような名前と値の組み合わせで構成されます。

Name=Value

データが、Cookie を設定する場所の Uri と共に SetCookie に渡されると、メモリ内に Cookie が作成され、現在のアプリケーション セッションの期間のみ使用可能になります。この種類の Cookie は、セッション Cookie と呼ばれます。

複数のアプリケーション セッションにわたって Cookie を格納するには、次の形式を使用して Cookie に有効期限を追加する必要があります。

NAME=VALUE; expires=DAY, DD-MMM-YYYY HH:MM:SS GMT

有効期限を持つ Cookie は、その期限が切れるまで、現在の Windows インストールのインターネット一時ファイル フォルダに格納されます。このような Cookie は、アプリケーション セッションをまたいで存続するため、永続的な Cookie と呼ばれます。

セッション Cookie と永続的な Cookie の両方を取得するには、GetCookie メソッドを呼び出し、SetCookie メソッドを使用して Cookie を設定した場所の Uri を渡します。

メモ :

SetCookie メソッドと GetCookie メソッドを使用し、WPF アプリケーションから Cookie を作成および取得する方法を示す例については、「アプリケーション Cookie のサンプル」を参照してください。

WPF で Cookie がどのようにサポートされるかを次に示します。

  • WPF スタンドアロン アプリケーションと XBAP は、Cookie の作成と管理のどちらも行うことができます。

  • XBAP によって作成された Cookie には、ブラウザからアクセスできます。

  • 同じドメインの XBAP は、Cookie を共有できます。

  • 同じドメインの XBAP ページと HTML ページは、Cookie を作成して共有できます。

  • XBAP ページと Loose XAML ページが Web 要求を行うと、Cookie がディスパッチされます。

  • IFRAMES にホストされた最上位の XBAP と XBAP は、どちらも Cookie にアクセスできます。

  • WPF での Cookie サポートは、サポートされるすべてのブラウザ (Internet Explorer 7、Microsoft Internet Explorer 6、および Firefox 2.0 以降) で同じです。

  • Microsoft Internet Explorer 6 と Internet Explorer 7 では、WPF は、Cookie に関連する P3P ポリシー (特に開発元とサードパーティの XBAP に関して) に従います。

構造化ナビゲーション

Page 間でデータを渡す必要がある場合、Page の既定以外のコンストラクタにデータを引数として渡すことができます。この方法を使用する場合、Page を履歴に保持する必要があることに注意してください。保持しない場合、次回 Page にナビゲートすると、WPF が既定のコンストラクタを使用して Page を再インスタンス化します。

または、渡す必要があるデータを使用して設定されたプロパティを Page に実装することもできます。ただし、Page がナビゲート元の Page にデータを戻す場合は、少し手間がかかります。問題は、ナビゲート後に Page に戻ることを保証する機構を、ナビゲーションがネイティブにサポートしていないことにあります。基本的に、ナビゲーションは "呼び出す/戻る" のセマンティクスをサポートしません。この問題を解決するため、WPF は、予測可能な構造化された方法で Page に戻ることができるようにする PageFunction<T> クラスを提供します。詳細については、「構造化ナビゲーションの概要」を参照してください。

ここまでで、ナビゲート可能なコンテンツによってアプリケーションをビルドするために使用する可能性が最も高い、ナビゲーション サービスの全容について説明しました。これらのサービスについて XBAP のコンテキストで説明しましたが、XBAP だけで使用されているわけではありません。最新のオペレーティング システムおよび Windows アプリケーションでは、最近のユーザーがブラウザの使用経験を持つことを考慮して、スタンドアロン アプリケーションにブラウザ スタイルのナビゲーションが組み込まれています。一般的な例は次のとおりです。

  • Word の類義語辞典 : 選択可能な単語をナビゲートします。

  • ファイル エクスプローラ : ファイルとフォルダをナビゲートします。

  • ウィザード : 複雑なタスクを複数のページに分割し、ページ間をナビゲートできます。たとえば、Windows 機能の追加と削除を行う Windows コンポーネント ウィザードなどがあります。

ブラウザ スタイルのナビゲーションをスタンドアロン アプリケーションに組み込むには、NavigationWindow クラスを使用します。NavigationWindowWindow から派生しており、XBAP が提供するナビゲーションを同じようにサポートして、ウィンドウを拡張します。NavigationWindow は、スタンドアロン アプリケーションのメイン ウィンドウとしても、ダイアログ ボックスなどの 2 次ウィンドウとしても使用できます。

WPF の最上位クラス (WindowPage など) と同様に NavigationWindow を実装するには、マークアップと分離コードの組み合わせを使用します。これを次の例に示します。

<NavigationWindow
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.MainWindow" 
    Source="HomePage.xaml"/>
using System.Windows.Navigation; // NavigationWindow

namespace SDKSample
{
    public partial class MainWindow : NavigationWindow
    {
        public MainWindow()
        {
            InitializeComponent();
        }
    }
}

このコードは、NavigationWindow を開いたときに自動的に Page (HomePage.xaml) にナビゲートする NavigationWindow を作成します。NavigationWindow がアプリケーションのメイン ウィンドウの場合、StartupUri 属性を使用してこのウィンドウを起動できます。これを次のマークアップに示します。

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    StartupUri="MainWindow.xaml" />

次の図に、スタンドアロン アプリケーションのメイン ウィンドウとしての NavigationWindow を示します。

メイン ウィンドウ

この図では、前の例の NavigationWindow 実装コードでは設定しなかったにもかかわらず、NavigationWindow にタイトルが表示されています。代わりに、次のコードに示す WindowTitle プロパティを使用してタイトルを設定します。

<Page 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    Title="Home Page"
    WindowTitle="NavigationWindow">


...


</Page>

WindowWidth プロパティと WindowHeight プロパティを設定すると、NavigationWindow にも影響を与えます。

通常、動作または外観をカスタマイズする必要があるときに、独自の NavigationWindow を実装します。どちらも行わない場合は、ショートカットを使用できます。スタンドアロン アプリケーションで Page のパッケージ URI を StartupUri として指定した場合、Application は自動的に NavigationWindow を作成して Page をホストします。これを行う方法を次のマークアップに示します。

<Application
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    StartupUri="HomePage.xaml" />

ダイアログ ボックスなどの、アプリケーションの 2 次ウィンドウを NavigationWindow にする場合、次の例のコードを使用して開くことができます。

// Open a navigation window as a dialog box
NavigationWindowDialogBox dlg = new NavigationWindowDialogBox();
dlg.Source = new Uri("HomePage.xaml", UriKind.Relative);
dlg.Owner = this;
dlg.ShowDialog();

結果を次の図に示します。

ダイアログ ボックス

この図では、NavigationWindow に Internet Explorer 7 スタイルの [戻る] ボタンと [進む] ボタンが表示され、ユーザーは履歴をナビゲートできます。これらのボタンの操作感は、次の図と同じ操作感になります。

NavigationWindow 内の [戻る] ボタンと [次に進む] ボタン

独自の履歴ナビゲーション サポートと UI をページに含める場合、ShowsNavigationUI プロパティの値を false に設定すると、NavigationWindow によって表示される [戻る] ボタンと [進む] ボタンは非表示になります。代わりに、WPF のカスタマイズ サポートを使用して、NavigationWindow 自体の UI を置き換えることもできます。この操作を行う方法の例については、「カスタム NavigationWindow ユーザー インターフェイスのサンプル」を参照してください。

Frame クラス

ブラウザと NavigationWindow はどちらも、ナビゲート可能なコンテンツをホストするウィンドウです。場合によっては、ウィンドウ全体にホストする必要がないコンテンツがアプリケーションに存在することもあります。このようなコンテンツは、代わりに他のコンテンツの内部にホストします。Frame クラスを使用すると、ナビゲート可能なコンテンツを他のコンテンツに挿入できます。Frame は、NavigationWindow および XBAP と同じサポートを提供します。

Frame 要素を使用して、FramePage に宣言によって追加する方法を次のコード例に示します。

<Page 
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  WindowTitle="Page that Hosts a Frame"
  WindowWidth="250"
  WindowHeight="250">


...


<Frame Source="FramePage1.xaml" />


...


</Page>

このマークアップでは、Frame が最初にナビゲートする必要がある Page のパッケージ URI を使用して、Frame 要素の Source 属性を設定します。次の図に、複数のページ間でナビゲートする Frame を持つ Page が存在する XBAP を示します。

複数のページ間を移動したフレーム

Page のコンテンツの内部にある Frame のみを使用する必要はありません。Window のコンテンツの内部で Frame をホストするのも一般的です。例については、「ウィンドウでのフレーム ナビゲーションのサンプル」を参照してください。

既定では、Frame は別の履歴がない場合に独自の履歴のみを使用します。Frame が、NavigationWindow または XBAP のどちらかの内部にホストされたコンテンツの一部である場合、FrameNavigationWindow または XBAP に属する履歴を使用します。ただし、場合によっては Frame が独自の履歴を使用する必要があります。これは、Frame によってホストされるページ内での履歴ナビゲーションを可能にするためです。これを次の図に示します。

フレームとページのダイアグラム

この場合、FrameJournalOwnership プロパティを OwnsJournal に設定することによって、Frame が独自の履歴を使用するように構成できます。これを次のマークアップに示します。

<Page 
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  WindowTitle="Page that Hosts a Frame"
  WindowWidth="250"
  WindowHeight="250">


...


<Frame Source="FramePage1.xaml" JournalOwnership="OwnsJournal" />


...


</Page>

独自の履歴を使用する Frame 内でのナビゲートの結果を次の図に示します。

独自の履歴を使用するフレーム

履歴エントリは、Internet Explorer 7 ではなく、Frame 内のナビゲーション UI によって表示される点に注意してください。

メモ :

Frame が、Window にホストされているコンテンツの一部である場合、Frame は独自の履歴を使用するため、専用のナビゲーション UI を表示します。

Frame にナビゲーション UI を表示せずに独自の履歴を表示することがユーザー エクスペリエンスで必要とされる場合、NavigationUIVisibilityHidden に設定して、ナビゲーション UI を非表示にできます。これを次のマークアップに示します。

<Page 
  xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
  WindowTitle="Page that Hosts a Frame"
  WindowWidth="250"
  WindowHeight="250">


...


<Frame 
  Source="FramePage1.xaml" 
  JournalOwnership="OwnsJournal" 
  NavigationUIVisibility="Hidden" />


...


</Page>

ナビゲーション ホスト

FrameNavigationWindow は、ナビゲーション ホストと呼ばれるクラスです。ナビゲーション ホストは、コンテンツにナビゲートして表示することができるクラスです。これを実現するため、各ナビゲーション ホストは独自の NavigationService および履歴を使用します。ナビゲーション ホストの基本的な構造を次の図に示します。

ナビゲータのダイアグラム

これによって、NavigationWindow および Frame は、実質的に XBAP がブラウザにホストされているときに提供するのと同じナビゲーション サポートを提供できます。

NavigationService および履歴を使用することだけでなく、ナビゲーション ホストは NavigationService が実装するのと同じメンバを実装します。これを次の図に示します。

フレームおよび NavigationWindow 内の履歴

アプリケーションでは、これらのメンバを直接使用してナビゲーション サポートをプログラミングできます。Window 内でホストされる Frame のカスタム ナビゲーション UI を独自に作成する場合に、この方法を検討してみてください。さらに、どちらのクラスも、この他に BackStack (NavigationWindow.BackStack, Frame.BackStack) や ForwardStack (NavigationWindow.ForwardStackFrame.ForwardStack) などのナビゲーション関連のメンバを実装します。これらのメンバを使用すると、それぞれ "戻る" および "進む" の履歴エントリを列挙できます。

前に述べたように、アプリケーション内に複数の履歴が存在することがあります。この例を次の図に示します。

1 つのアプリケーション内の複数の履歴

XAML ページ以外のコンテンツへのナビゲート

このトピック全体で、Page とパッケージ XBAP を使用して、WPF のさまざまなナビゲーション機能について説明してきました。しかし、アプリケーションにコンパイルされる Page はナビゲート可能なコンテンツの唯一のタイプではなく、パッケージ XBAP はコンテンツを識別する唯一の方法ではありません。

ここで示すように、Loose XAML ファイル、HTML ファイル、およびオブジェクトにもナビゲートできます。

Loose XAML ファイルへのナビゲート

Loose XAML ファイルは、次の特性を持つファイルです。

  • XAML のみが含まれている (つまり、コードがない)。

  • 適切な名前空間宣言がある。

  • .xaml ファイル名拡張子がある。

たとえば、Loose XAML ファイル Person.xaml として格納されている次のコンテンツについて考えます。

<!-- Person.xaml -->
<TextBlock xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation">
  <TextBlock FontWeight="Bold">Name:</TextBlock>
  <TextBlock>Nancy Davolio</TextBlock>
  <LineBreak />
  <TextBlock FontWeight="Bold">Favorite Color:</TextBlock>
  <TextBlock>Yellow</TextBlock>
</TextBlock>

ファイルをダブルクリックすると、ブラウザが開き、コンテンツにナビゲートしてコンテンツが表示されます。これを次の図に示します。

Person.XAML ファイルの内容の表示

Loose XAML ファイルは次の場所から表示できます。

  • ローカル コンピュータ、イントラネット、またはインターネットの Web サイト。

  • 汎用名前付け規則 (UCS) ファイル共有。

  • ローカル ディスク。

Loose XAML ファイルは、ブラウザのお気に入りに追加したり、ブラウザのホーム ページとして設定したりできます。

メモ :

Loose XAML ページの公開および起動の詳細については、「WPF アプリケーションの配置 (WPF)」を参照してください。

Loose XAML に関する 1 つの制限は、部分信頼で安全に実行されるコンテンツしかホストできないという点です。たとえば、Window を Loose XAML ファイルのルート要素とすることはできません。詳細については、「Windows Presentation Foundation 部分信頼セキュリティ」を参照してください。

フレームを使用した HTML ファイルへのナビゲート

予想されるとおり、HTML にもナビゲートできます。http スキームを使用する URI を入力するだけです。たとえば、次の XAML には、HTML ページにナビゲートする Frame が表示されます。

<Frame Source="https://www.microsoft.com/default.aspx" />

HTML にナビゲートするには、特殊なアクセス許可が必要です。たとえば、インターネット ゾーンの部分信頼セキュリティ サンドボックスで実行されている XBAP からはナビゲートできません。詳細については、「Windows Presentation Foundation 部分信頼セキュリティ」を参照してください。

WebBrowser コントロールを使用した HTML ファイルへのナビゲート

Frame は XAML/HTML の混在したナビゲーション エクスペリエンスを提供しますが、Frame は、ホストされた HTML ページとホスト WPF アプリケーション間の相互運用をサポートします。具体的には、HTML ページによって実装されているスクリプト関数で、ホスト WPF アプリケーションによって実装されているマネージ コード メソッドを呼び出せるようにするメカニズムはありません。同様に、WPF アプリケーションには、ホストされた HTML ページのスクリプト関数を呼び出す方法はありません。この機能が必要な場合は、代わりに、HTML ドキュメント ホスティング、ナビゲーション、およびスクリプト/マネージ コードの相互運用性をサポートする WebBrowser コントロールを使用できます。WebBrowser コントロールの詳細については、「WebBrowser」を参照してください。WebBrowser でサポートされている機能の範囲を示すサンプルについては、「WebBrowser コントロールのサンプル」を参照してください。

Frame と同様に、WebBrowser を使用して HTML にナビゲートするには、特殊なアクセス許可が必要です。たとえば、部分信頼アプリケーションからは、起点にある HTML にのみナビゲートできます。詳細については、「Windows Presentation Foundation 部分信頼セキュリティ」を参照してください。

カスタム オブジェクトへのナビゲート

カスタム オブジェクトとして格納されたデータがある場合、そのデータを表示する 1 つの方法は、それらのオブジェクトにバインドされたコンテンツを使用して Page を作成することです (「データ バインディングの概要」を参照)。オブジェクトを表示するためだけにページ全体を作成するオーバーヘッドが必要ない場合、代わりにオブジェクトに直接ナビゲートすることもできます。

次のコードに実装された Person クラスについて考えます。

このクラスにナビゲートするには、次のコードに示すように、NavigationWindow.Navigate メソッドを呼び出します。

結果を次の図に示します。

クラスに移動するページ

この図では、役に立つものが何も表示されていません。実際に、表示される値は Person オブジェクトの ToString メソッドの戻り値です。既定では、これは WPF がオブジェクトの表示に使用できる唯一の値です。ToString メソッドをオーバーライドすると、より意味のある情報を返すことができますが、それでも文字列値でしかありません。WPF の表示機能を活用する 1 つの方法として、データ テンプレートを使用できます。WPF が特定の種類のオブジェクトと関連付けることができる、データ テンプレートを実装できます。Person オブジェクトのデータ テンプレートを次のコードに示します。

ここでは、DataType 属性で x:Type マークアップ拡張機能を使用することによって、データ テンプレートが Person 型と関連付けられます。次に、データ テンプレートは TextBlock 要素 (TextBlock を参照) を Person クラスのプロパティにバインドします。Person オブジェクトの更新された外観を次の図に示します。

データ テンプレートを持つクラスへの移動

この方法の利点は、データ テンプレートを再使用して、アプリケーションの任意の場所でオブジェクトを一貫して表示できるようにすることによって得られる一貫性です。

サンプル全体については、「カスタム オブジェクトへの移動のサンプル」を参照してください。

データ テンプレートの詳細については、「データ テンプレートの概要」を参照してください。

セキュリティ

WPF ナビゲーション サポートによって、XBAP をインターネット全体にナビゲートし、アプリケーションにサード パーティのコンテンツをホストすることが可能になります。アプリケーションとユーザーの両方を有害な動作から保護するため、WPF はさまざまなセキュリティ機能を提供します。これらの機能の詳細については、「Windows Presentation Foundation のセキュリティ」と「Windows Presentation Foundation 部分信頼セキュリティ」を参照してください。

参照

処理手順

ページ インスタンス間で状態のセットを 1 つ記憶する

ページ インスタンスごとに状態のセットを複数記憶する

ページ インスタンス間で状態の項目を 1 つ記憶する

ウィザードのサンプル

カスタム NavigationWindow ユーザー インターフェイスのサンプル

ウィンドウでのフレーム ナビゲーションのサンプル

アプリケーション Cookie のサンプル

概念

アプリケーション管理の概要

Windows Presentation Foundation におけるパッケージの URI

Windows Presentation Foundation Windows Media Center によってホストされるアプリケーションの概要

構造化ナビゲーションの概要

WPF アプリケーションの配置 (WPF)

参照

SetCookie

GetCookie

履歴の変更

日付

履歴

理由

2008 年 7 月

「WebBrowser コントロールを使用した HTML ファイルへのナビゲート」を追加

SP1 機能変更