ナビゲーションの概要Navigation Overview

Windows Presentation Foundation (WPF) では、スタンドアロンアプリケーションと XAML ブラウザー アプリケーション (XBAP)XAML browser applications (XBAPs) の2種類のアプリケーションで使用できるブラウザースタイルのナビゲーションがサポートされています。Windows Presentation Foundation (WPF) supports browser-style navigation that can be used in two types of applications: standalone applications and XAML ブラウザー アプリケーション (XBAP)XAML browser applications (XBAPs). コンテンツをナビゲーション用にパッケージ化するために、WPFWPF には Page クラスが用意されています。To package content for navigation, WPFWPF provides the Page class. @No__t_1 を使用するか、プログラムによって NavigationService を使用して、Page 間を宣言によって相互に移動できます。You can navigate from one Page to another declaratively, by using a Hyperlink, or programmatically, by using the NavigationService. WPFWPF は、ナビゲート元のページを記憶し、それらのページに戻るために、履歴を使用します。uses the journal to remember pages that have been navigated from and to navigate back to them.

PageHyperlinkNavigationService、およびジャーナルは、WPFWPF によって提供されるナビゲーションサポートの中核を形成します。Page, Hyperlink, NavigationService, and the journal form the core of the navigation support offered by WPFWPF. この概要では、これらの機能について詳しく説明してから、緩やかな Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) ファイル、HTML ファイル、およびオブジェクトへの移動を含む高度なナビゲーションサポートについて説明します。This overview explores these features in detail before covering advanced navigation support that includes navigation to loose Extensible Application Markup Language (XAML)Extensible Application Markup Language (XAML) files, HTML files, and objects.

注意

このトピックでは、"browser" という用語は、現在 Microsoft Internet Explorer および Firefox を含む WPFWPF アプリケーションをホストできるブラウザーのみを指します。In this topic, the term "browser" refers only to browsers that can host WPFWPF applications, which currently includes Microsoft Internet Explorer and Firefox. 特定の WPFWPF 機能が特定のブラウザーでのみサポートされている場合は、ブラウザーのバージョンが参照されます。Where specific WPFWPF features are supported only by a particular browser, the browser version is referred to.

このトピックでは、WPFWPF の主要なナビゲーション機能の概要について説明します。This topic provides an overview of the key navigation capabilities in WPFWPF. これらの機能は、スタンドアロンアプリケーションと XBAPXBAPs の両方で使用できます。ただし、このトピックでは、XBAPXBAP のコンテキスト内でそれらを示しています。These capabilities are available to both standalone applications and XBAPXBAPs, although this topic presents them within the context of an XBAPXBAP.

注意

このトピックでは、XBAPXBAPs をビルドして展開する方法については説明しません。This topic doesn't discuss how to build and deploy XBAPXBAPs. @No__t_0 の詳細については、「 WPF XAML ブラウザーアプリケーションの概要」を参照してください。For more information on XBAPXBAPs, see WPF XAML Browser Applications Overview.

このセクションでは、ナビゲーションの次の側面について説明し、例を示します。This section explains and demonstrates the following aspects of navigation:

ページの実装Implementing a Page

@No__t_0 では、.NET Framework オブジェクト、カスタムオブジェクト、列挙値、ユーザーコントロール、XAMLXAML ファイル、HTML ファイルなど、いくつかのコンテンツの種類に移動できます。In WPFWPF, you can navigate to several content types that include .NET Framework objects, custom objects, enumeration values, user controls, XAMLXAML files, and HTML files. ただし、コンテンツをパッケージ化する最も一般的で便利な方法は、Page を使用することです。However, you'll find that the most common and convenient way to package content is by using Page. さらに、Page はナビゲーション固有の機能を実装して、外観を向上させ、開発を簡素化します。Furthermore, Page implements navigation-specific features to enhance their appearance and simplify development.

@No__t_0 を使用すると、次のようなマークアップを使用して、XAMLXAML コンテンツのナビゲート可能なページを宣言によって実装できます。Using Page, you can declaratively implement a navigable page of XAMLXAML content by using markup like the following.

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

@No__t_1 マークアップに実装されている Page は、ルート要素として PageWPFWPF XMLXML 名前空間宣言を必要とします。A Page that is implemented in XAMLXAML markup has Page as its root element and requires the WPFWPFXMLXML namespace declaration. @No__t_0 要素には、移動して表示するコンテンツが含まれています。The Page element contains the content that you want to navigate to and display. コンテンツを追加するには、次のマークアップに示すように、Page.Content property 要素を設定します。You add content by setting the Page.Content property element, as shown in the following markup.

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

Page.Content には、1 つの子要素のみを含めることができます。前の例では、コンテンツは単一の文字列「Hello, Page!」です。Page.Content can only contain one child element; in the preceding example, the content is a single string, "Hello, Page!" 実際には、通常はレイアウトコントロールを子要素として使用し (「レイアウト」を参照)、コンテンツを格納して構成します。In practice, you will usually use a layout control as the child element (see Layout) to contain and compose your content.

@No__t_0 要素の子要素は Page のコンテンツと見なされるため、明示的な Page.Content 宣言を使用する必要はありません。The child elements of a Page element are considered to be the content of a Page and, consequently, you don't need to use the explicit Page.Content declaration. 次のマークアップは、前のサンプルの宣言と同等です。The following markup is the declarative equivalent to the preceding sample.

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

この場合、Page.ContentPage 要素の子要素を使用して自動的に設定されます。In this case, Page.Content is automatically set with the child elements of the Page element. 詳細については、「WPF のコンテンツ モデル」を参照してください。For more information, see WPF Content Model.

マークアップのみの Page は、コンテンツを表示する場合に便利です。A markup-only Page is useful for displaying content. ただし、Page は、ユーザーがページと対話できるようにするコントロールを表示することもできます。また、イベントを処理し、アプリケーションロジックを呼び出すことによって、ユーザーの操作に応答できます。However, a Page can also display controls that allow users to interact with the page, and it can respond to user interaction by handling events and calling application logic. 次の例に示すように、マークアップと分離コードの組み合わせを使用して、対話型の Page を実装します。An interactive Page is implemented by using a combination of markup and code-behind, as shown in the following example.

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.HomePage">
  Hello, from the XBAP HomePage!
</Page>
using System.Windows.Controls;

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

Imports System.Windows.Controls

Namespace SDKSample
    Partial Public Class HomePage
        Inherits Page
        Public Sub New()
            InitializeComponent()
        End Sub
    End Class
End Namespace

マークアップ ファイルと分離コード ファイルを連携させるには、次の構成が必要です。To allow a markup file and code-behind file to work together, the following configuration is required:

  • マークアップでは、Page 要素に x:Class 属性が含まれている必要があります。In markup, the Page element must include the x:Class attribute. アプリケーションがビルドされると、マークアップファイルに x:Class が存在することにより、Microsoft build engine (MSBuild) によって Page から派生した partial クラスが作成され、x:Class 属性によって指定された名前になります。When the application is built, the existence of x:Class in the markup file causes Microsoft build engine (MSBuild) to create a partial class that derives from Page and has the name that is specified by the x:Class attribute. そのためには、XAMLXAML スキーマ (xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml") に XMLXML 名前空間宣言を追加する必要があります。This requires the addition of an XMLXML namespace declaration for the XAMLXAML schema ( xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ). 生成された partial クラスは InitializeComponent を実装します。これは、イベントを登録し、マークアップで実装されるプロパティを設定するために呼び出されます。The generated partial class implements InitializeComponent, which is called to register the events and set the properties that are implemented in markup.

  • 分離コードでは、クラスは、マークアップで x:Class 属性によって指定された名前と同じ名前を持つ partial クラスである必要があり、Page から派生する必要があります。In code-behind, the class must be a partial class with the same name that is specified by the x:Class attribute in markup, and it must derive from Page. これにより、分離コードファイルは、アプリケーションのビルド時にマークアップファイル用に生成される partial クラスに関連付けられます (「 WPF アプリケーションのビルド」を参照してください)。This allows the code-behind file to be associated with the partial class that is generated for the markup file when the application is built (see Building a WPF Application).

  • 分離コードでは、Page クラスは、InitializeComponent メソッドを呼び出すコンストラクターを実装する必要があります。In code-behind, the Page class must implement a constructor that calls the InitializeComponent method. InitializeComponent は、マークアップファイルによって生成される partial クラスによって実装され、イベントを登録したり、マークアップで定義されているプロパティを設定したりします。InitializeComponent is implemented by the markup file's generated partial class to register events and set properties that are defined in markup.

注意

@No__t_1 を使用して新しい Page をプロジェクトに追加すると、マークアップと分離コードの両方を使用して Page が実装されます。また、ここで説明するように、マークアップファイルと分離コードファイルの関連付けを作成するために必要な構成が含まれます。When you add a new Page to your project using Microsoft Visual StudioMicrosoft Visual Studio, the Page is implemented using both markup and code-behind, and it includes the necessary configuration to create the association between the markup and code-behind files as described here.

@No__t_0 が完了したら、そこに移動できます。Once you have a Page, you can navigate to it. アプリケーションが移動する最初の Page を指定するには、開始 Page を構成する必要があります。To specify the first Page that an application navigates to, you need to configure the start Page.

スタート ページの構成Configuring a Start Page

XBAPXBAPs では、一定の量のアプリケーション インフラストラクチャをブラウザーでホストする必要があります。require a certain amount of application infrastructure to be hosted in a browser. @No__t_0 では、Application クラスは、必要なアプリケーションインフラストラクチャを確立するアプリケーション定義の一部です (「アプリケーション管理の概要」を参照してください)。In WPFWPF, the Application class is part of an application definition that establishes the required application infrastructure (see Application Management Overview).

アプリケーション定義は通常、マークアップと分離コードの両方を使用して実装され、マークアップファイルは MSBuild ApplicationDefinition 項目として構成されます。An application definition is usually implemented using both markup and code-behind, with the markup file configured as an MSBuildApplicationDefinition item. @No__t_0 のアプリケーション定義を次に示します。The following is an application definition for an XBAPXBAP.

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.App" />
using System.Windows;

namespace SDKSample
{
    public partial class App : Application { }
}

Imports System.Windows

Namespace SDKSample
    Partial Public Class App
        Inherits Application
    End Class
End Namespace

@No__t_0 では、アプリケーション定義を使用して開始 Page を指定できます。これは、XBAPXBAP の起動時に自動的に読み込まれる Page です。An XBAPXBAP can use its application definition to specify a start Page, which is the Page that is automatically loaded when the XBAPXBAP is launched. これを行うには、目的の Page の URI (uniform resource identifier) を使用して StartupUri プロパティを設定します。You do this by setting the StartupUri property with the uniform resource identifier (URI) for the desired Page.

注意

ほとんどの場合、Page は、アプリケーションにコンパイルされるか、アプリケーションと共に配置されます。In most cases, the Page is either compiled into or deployed with an application. このような場合、Page を識別する URI はパック URI です。これは、パックスキームに準拠した uri です。In these cases, the URI that identifies a Page is a pack URI, which is a URI that conforms to the pack scheme. パック Uri については、「 WPF のパック uri」で詳しく説明します。Pack URIs are discussed further in Pack URIs in WPF. 以下で説明する http スキームを使用してコンテンツにナビゲートすることもできます。You can also navigate to content using the http scheme, which is discussed below.

@No__t_0 は、次の例に示すように、マークアップで宣言によって設定できます。You can set StartupUri declaratively in markup, as shown in the following example.

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

この例では、StartupUri 属性は、ホームページを識別する相対パック URI で設定されます。In this example, the StartupUri attribute is set with a relative pack URI that identifies HomePage.xaml. @No__t_0 が起動されると、ホームページに自動的に移動して表示されます。When the XBAPXBAP is launched, HomePage.xaml is automatically navigated to and displayed. これは、次の図に示すように、Web サーバーから起動された XBAPXBAP を示しています。This is demonstrated by the following figure, which shows an XBAPXBAP that was launched from a Web server.

XBAP ページXBAP page

注意

@No__t_0 の開発と配置の詳細については、「 WPF XAML ブラウザーアプリケーションの概要」および「 wpf アプリケーションの配置」を参照してください。For more information regarding the development and deployment of XBAPXBAPs, see WPF XAML Browser Applications Overview and Deploying a WPF Application.

ホスト ウィンドウのタイトル、幅、および高さの構成Configuring the Host Window's Title, Width, and Height

前の図では、ブラウザーとタブパネルの両方のタイトルが XBAPXBAP の URI であることがわかりました。One thing you may have noticed from the previous figure is that the title of both the browser and the tab panel is the URI for the XBAPXBAP. このタイトルは、長いだけでなく、見た目が良いわけでも、有益な情報になっているわけでもありません。Besides being long, the title is neither attractive nor informative. このため、Page には、WindowTitle プロパティを設定してタイトルを変更する方法が用意されています。For this reason, Page offers a way for you to change the title by setting the WindowTitle property. さらに、WindowWidthWindowHeight をそれぞれ設定して、ブラウザーウィンドウの幅と高さを構成することもできます。Furthermore, you can configure the width and height of the browser window by setting WindowWidth and WindowHeight, respectively.

WindowTitleWindowWidth、および WindowHeight は、次の例に示すように、マークアップで宣言によって設定できます。WindowTitle, WindowWidth, and WindowHeight can be set declaratively in markup, as shown in the following example.

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

結果を次の例に示します。The result is shown in the following figure.

ウィンドウのタイトル、高さ、幅Window title, height, width

一般的な XBAPXBAP は複数のページで構成します。A typical XBAPXBAP comprises several pages. あるページから別のページに移動する最も簡単な方法は、Hyperlink を使用することです。The simplest way to navigate from one page to another is to use a Hyperlink. 次のマークアップに示されている Hyperlink 要素を使用して、PageHyperlink を宣言によって追加できます。You can declaratively add a Hyperlink to a Page by using the Hyperlink element, which is shown in the following markup.

<Page
  xmlns="http://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>

@No__t_0 要素には、次のものが必要です。A Hyperlink element requires the following:

  • @No__t_1 属性によって指定された移動先の Page のパック URI。The pack URI of the Page to navigate to, as specified by the NavigateUri attribute.

  • ユーザーがクリックしてナビゲーションを開始できるコンテンツ (Hyperlink 要素に含めることができるコンテンツについては、「Hyperlink」を参照してください)。Content that a user can click to initiate the navigation, such as text and images (for the content that the Hyperlink element can contain, see Hyperlink).

次の図は、Hyperlink を持つ PageXBAPXBAP を示しています。The following figure shows an XBAPXBAP with a Page that has a Hyperlink.

ハイパーリンクがあるページPage with Hyperlink

必要に応じて、[Hyperlink] をクリックすると、XBAPXBAPNavigateUri 属性で識別される Page に移動します。As you would expect, clicking the Hyperlink causes the XBAPXBAP to navigate to the Page that is identified by the NavigateUri attribute. さらに、XBAPXBAP は、Internet Explorer の [最近使ったページ] の一覧に前の Page のエントリを追加します。Additionally, the XBAPXBAP adds an entry for the previous Page to the Recent Pages list in Internet Explorer. これを次の図に示します。This is shown in the following figure.

[戻る] ボタンと [進む] ボタンBack and Forward buttons

また、ある Page から別のへのナビゲーションをサポートすると、Hyperlink フラグメントナビゲーションもサポートされます。As well as supporting navigation from one Page to another, Hyperlink also supports fragment navigation.

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

フラグメントナビゲーションは、現在の Page または別の Page のコンテンツフラグメントへのナビゲーションです。Fragment navigation is the navigation to a content fragment in either the current Page or another Page. @No__t_0 では、コンテンツフラグメントは名前付き要素に含まれるコンテンツです。In WPFWPF, a content fragment is the content that is contained by a named element. 名前付き要素は、Name 属性が設定されている要素です。A named element is an element that has its Name attribute set. 次のマークアップは、コンテンツフラグメントを含む名前付きの TextBlock 要素を示しています。The following markup shows a named TextBlock element that contains a content fragment.

<Page
    xmlns="http://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>

@No__t_0 がコンテンツフラグメントに移動するには、NavigateUri 属性に次のものが含まれている必要があります。For a Hyperlink to navigate to a content fragment, the NavigateUri attribute must include the following:

  • 移動先のコンテンツフラグメントを持つ Page の URI。The URI of the Page with the content fragment to navigate to.

  • 「#」文字。A "#" character.

  • コンテンツフラグメントを含む Page 上の要素の名前。The name of the element on the Page that contains the content fragment.

フラグメント URI の形式は次のとおりです。A fragment URI has the following format.

PageURI # ElementNamePageURI # ElementName

コンテンツフラグメントに移動するように構成されている Hyperlink の例を次に示します。The following shows an example of a Hyperlink that is configured to navigate to a content fragment.

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  WindowTitle="Page That Navigates To Fragment" >
<Hyperlink NavigateUri="PageWithFragments.xaml#Fragment1">
  Navigate To pack Fragment
</Hyperlink>
</Page>

注意

ここでは、WPFWPF での既定のフラグメントナビゲーション実装について説明します。This section describes the default fragment navigation implementation in WPFWPF. また WPFWPF では、NavigationService.FragmentNavigation イベントの処理を必要とする独自のフラグメントナビゲーションスキームを実装することもできます。WPFWPF also allows you to implement your own fragment navigation scheme which, in part, requires handling the NavigationService.FragmentNavigation event.

重要

ページを HTTP で参照できる場合に限り、ルース XAMLXAML ページ (Page がルート要素として設定されている XAMLXAML ファイル) 内のフラグメントに移動できます。You can navigate to fragments in loose XAMLXAML pages (markup-only XAMLXAML files with Page as the root element) only if the pages can be browsed via HTTP.

ただし、緩やかな XAMLXAML ページは、独自のフラグメントに移動できます。However, a loose XAMLXAML page can navigate to its own fragments.

@No__t_0 では、ユーザーは特定の Page へのナビゲーションを開始できますが、ページの検索とダウンロードの作業は NavigationService クラスによって実行されます。While Hyperlink allows a user to initiate navigation to a particular Page, the work of locating and downloading the page is performed by the NavigationService class. 基本的に、NavigationService は、Hyperlink などのクライアントコードに代わってナビゲーション要求を処理する機能を提供します。Essentially, NavigationService provides the ability to process a navigation request on behalf of client code, such as the Hyperlink. さらに、NavigationService は、ナビゲーション要求を追跡して影響を与える上位レベルのサポートを実装します。Additionally, NavigationService implements higher-level support for tracking and influencing a navigation request.

@No__t_0 がクリックされると、WPFWPF NavigationService.Navigate を呼び出して、指定されたパック URI にある Page を検索してダウンロードします。When a Hyperlink is clicked, WPFWPF calls NavigationService.Navigate to locate and download the Page at the specified pack URI. ダウンロードした Page は、ルートオブジェクトがダウンロードされた Page のインスタンスであるオブジェクトのツリーに変換されます。The downloaded Page is converted to a tree of objects whose root object is an instance of the downloaded Page. ルート Page オブジェクトへの参照は、NavigationService.Content プロパティに格納されます。A reference to the root Page object is stored in the NavigationService.Content property. 移動先のコンテンツのパック URI は NavigationService.Source プロパティに格納され、NavigationService.CurrentSource は移動先の最後のページのパック URI を格納します。The pack URI for the content that was navigated to is stored in the NavigationService.Source property, while the NavigationService.CurrentSource stores the pack URI for the last page that was navigated to.

注意

@No__t_0 アプリケーションは、現在アクティブな NavigationService を複数持つことができます。It is possible for a WPFWPF application to have more than one currently active NavigationService. 詳細については、このトピックで後述する「ナビゲーションホスト」を参照してください。For more information, see Navigation Hosts later in this topic.

ナビゲーション サービスによるプログラム ナビゲーションProgrammatic Navigation with the Navigation Service

@No__t_1 を使用してマークアップで宣言的にナビゲーションが実装されている場合、NavigationService について知る必要はありません。 Hyperlink では NavigationService が使用されるためです。You don't need to know about NavigationService if navigation is implemented declaratively in markup using Hyperlink, because Hyperlink uses the NavigationService on your behalf. つまり、Hyperlink の直接または間接の親がナビゲーションホスト (「ナビゲーションホスト」を参照) である限り、Hyperlink はナビゲーションホストのナビゲーションサービスを検索して使用し、ナビゲーション要求を処理することができます。This means that, as long as either the direct or indirect parent of a Hyperlink is a navigation host (see Navigation Hosts), Hyperlink will be able to find and use the navigation host's navigation service to process a navigation request.

ただし、次のように NavigationService を直接使用する必要がある場合もあります。However, there are situations when you need to use NavigationService directly, including the following:

  • パラメーター化されていないコンストラクターを使用して Page をインスタンス化する必要がある場合。When you need to instantiate a Page using a non-parameterless constructor.

  • @No__t_0 に移動する前に、プロパティを設定する必要がある場合。When you need to set properties on the Page before you navigate to it.

  • 移動する必要がある Page を実行時にのみ決定できる場合。When the Page that needs to be navigated to can only be determined at run time.

このような状況では、NavigationService オブジェクトの Navigate メソッドを呼び出すことによって、プログラムによってナビゲーションを開始するコードを記述する必要があります。In these situations, you need to write code to programmatically initiate navigation by calling the Navigate method of the NavigationService object. これには、NavigationService への参照を取得する必要があります。That requires getting a reference to a NavigationService.

NavigationService への参照の取得Getting a Reference to the NavigationService

ナビゲーションホスト」セクションで説明されている理由により、WPFWPF アプリケーションは複数の NavigationService を持つことができます。For reasons that are covered in the Navigation Hosts section, a WPFWPF application can have more than one NavigationService. つまり、コードには NavigationService を検索する方法が必要です。これは通常、現在の Page に移動した NavigationService です。This means that your code needs a way to find a NavigationService, which is usually the NavigationService that navigated to the current Page. @No__t_1 NavigationService.GetNavigationService メソッドを呼び出すことによって、NavigationService への参照を取得できます。You can get a reference to a NavigationService by calling the staticNavigationService.GetNavigationService method. 特定の Page に移動した NavigationService を取得するには、Page への参照を GetNavigationService メソッドの引数として渡します。To get the NavigationService that navigated to a particular Page, you pass a reference to the Page as the argument of the GetNavigationService method. 次のコードは、現在の PageNavigationService を取得する方法を示しています。The following code shows how to get the NavigationService for the current Page.

using System.Windows.Navigation;
// Get a reference to the NavigationService that navigated to this Page
NavigationService ns = NavigationService.GetNavigationService(this);
' Get a reference to the NavigationService that navigated to this Page
Dim ns As NavigationService = NavigationService.GetNavigationService(Me)

@No__t_1 の NavigationService を見つけるためのショートカットとして、PageNavigationService プロパティを実装します。As a shortcut for finding the NavigationService for a Page, Page implements the NavigationService property. これを次の例に示します。This is shown in the following example.

using System.Windows.Navigation;
// Get a reference to the NavigationService that navigated to this Page
NavigationService ns = this.NavigationService;
' Get a reference to the NavigationService that navigated to this Page
Dim ns As NavigationService = Me.NavigationService

注意

@No__t_0 は、Loaded イベント Page 発生した場合にのみ、その NavigationService への参照を取得できます。A Page can only get a reference to its NavigationService when Page raises the Loaded event.

ページ オブジェクトへのプログラム ナビゲーションProgrammatic Navigation to a Page Object

次の例では、NavigationService を使用して、プログラムで Page に移動する方法を示します。The following example shows how to use the NavigationService to programmatically navigate to a Page. 移動先の Page は、単一のパラメーターなしのコンストラクターを使用してのみインスタンス化できるため、プログラムによるナビゲーションが必要です。Programmatic navigation is required because the Page that is being navigated to can only be instantiated using a single, non-parameterless constructor. パラメーターなしのコンストラクターを使用した Page は、次のマークアップとコードに示されています。The Page with the non-parameterless constructor is shown in the following markup and code.

<Page
    x:Class="SDKSample.PageWithNonDefaultConstructor"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    Title="PageWithNonDefaultConstructor">
  
  <!-- Content goes here -->
  
</Page>
using System.Windows.Controls;

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

            this.Content = message;
        }
    }
}

Namespace SDKSample
    Partial Public Class PageWithNonDefaultConstructor
        Inherits Page
        Public Sub New(ByVal message As String)
            InitializeComponent()

            Me.Content = message
        End Sub
    End Class
End Namespace

パラメーターなしのコンストラクターを使用して Page に移動する Page は、次のマークアップとコードに示されています。The Page that navigates to the Page with the non-parameterless constructor is shown in the following markup and code.

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://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;
using System.Windows.Controls;
using System.Windows.Navigation;

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);
        }
    }
}

Namespace SDKSample
    Partial Public Class NSNavigationPage
        Inherits Page
        Public Sub New()
            InitializeComponent()
        End Sub

        Private Sub hyperlink_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            ' Instantiate the page to navigate to
            Dim page As New PageWithNonDefaultConstructor("Hello!")

            ' Navigate to the page, using the NavigationService
            Me.NavigationService.Navigate(page)
        End Sub
    End Class
End Namespace

この PageHyperlink をクリックすると、Page をインスタンス化して、パラメーター化されていないコンストラクターを使用し、NavigationService.Navigate メソッドを呼び出すことによって、ナビゲーションが開始されます。When the Hyperlink on this Page is clicked, navigation is initiated by instantiating the Page to navigate to using the non-parameterless constructor and calling the NavigationService.Navigate method. Navigate は、パック URI ではなく、NavigationService が移動するオブジェクトへの参照を受け入れます。Navigate accepts a reference to the object that the NavigationService will navigate to, rather than a pack URI.

パック URI によるプログラム ナビゲーションProgrammatic Navigation with a Pack URI

プログラムによってパック URI を構築する必要がある場合 (実行時にパック URI を特定できる場合など) は、NavigationService.Navigate メソッドを使用できます。If you need to construct a pack URI programmatically (when you can only determine the pack URI at run time, for example), you can use the NavigationService.Navigate method. これを次の例に示します。This is shown in the following example.

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

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);
        }
    }
}

Namespace SDKSample
    Partial Public Class NSUriNavigationPage
        Inherits Page
        Public Sub New()
            InitializeComponent()
        End Sub

        Private Sub hyperlink_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            ' Create a pack URI
            Dim uri As New Uri("AnotherPage.xaml", UriKind.Relative)

            ' Get the navigation service that was used to 
            ' navigate to this page, and navigate to 
            ' AnotherPage.xaml
            Me.NavigationService.Navigate(uri)
        End Sub
    End Class
End Namespace

現在のページの更新Refreshing the Current Page

@No__t_0 は、NavigationService.Source プロパティに格納されているパック URI と同じパック URI がある場合はダウンロードされません。A Page is not downloaded if it has the same pack URI as the pack URI that is stored in the NavigationService.Source property. 現在のページを再びダウンロードするように WPFWPF を強制するには、次の例に示すように、NavigationService.Refresh メソッドを呼び出します。To force WPFWPF to download the current page again, you can call the NavigationService.Refresh method, as shown in the following example.

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

namespace SDKSample
{
    public partial class NSRefreshNavigationPage : Page
    {

Namespace SDKSample
    Partial Public Class NSRefreshNavigationPage
        Inherits Page
        void hyperlink_Click(object sender, RoutedEventArgs e)
        {
            // Force WPF to download this page again
            this.NavigationService.Refresh();
        }
    }
}
        Private Sub hyperlink_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            ' Force WPF to download this page again
            Me.NavigationService.Refresh()
        End Sub
    End Class
End Namespace

これまでに説明したように、ナビゲーションを開始するには多くの方法があります。There are many ways to initiate navigation, as you've seen. ナビゲーションが開始されている間にナビゲーションが進行しているときに、NavigationService によって実装された次のイベントを使用して、ナビゲーションを追跡し、影響を与えることができます。When navigation is initiated, and while navigation is in progress, you can track and influence the navigation using the following events that are implemented by NavigationService:

  • Navigating.Navigating. 新しいナビゲーションが要求されたときに発生します。Occurs when a new navigation is requested. ナビゲーションのキャンセルに使用できます。Can be used to cancel the navigation.

  • NavigationProgress.NavigationProgress. ナビゲーション進行状況の情報提供を目的として、ダウンロード中に定期的に発生します。Occurs periodically during a download to provide navigation progress information.

  • Navigated.Navigated. ページの位置が特定され、ダウンロードされたときに発生します。Occurs when the page has been located and downloaded.

  • NavigationStopped.NavigationStopped. @No__t_0 を呼び出すことによって) ナビゲーションが停止したとき、または現在のナビゲーションの進行中に新しいナビゲーションが要求されたときに発生します。Occurs when the navigation is stopped (by calling StopLoading), or when a new navigation is requested while a current navigation is in progress.

  • NavigationFailed.NavigationFailed. 要求されたコンテンツにナビゲートするときにエラーが発生したときに発生します。Occurs when an error is raised while navigating to the requested content.

  • LoadCompleted.LoadCompleted. ナビゲート先のコンテンツが読み込まれ、解析されて、レンダリングが開始されたときに発生します。Occurs when content that was navigated to is loaded and parsed, and has begun rendering.

  • FragmentNavigation.FragmentNavigation. コンテンツ フラグメントへのナビゲーションが開始されたときに、次のタイミングで発生します。Occurs when navigation to a content fragment begins, which happens:

    • 目的のフラグメントが現在のコンテンツの場合は、すぐに発生します。Immediately, if the desired fragment is in the current content.

    • 目的のフラグメントが別のコンテンツにある場合は、ソース コンテンツが読み込まれた後で発生します。After the source content has been loaded, if the desired fragment is in different content.

ナビゲーション イベントは、次の図に示されている順序で発生します。The navigation events are raised in the order that is illustrated by the following figure.

ページナビゲーションのフローチャートPage navigation flow chart

一般に、Page では、これらのイベントについて心配することはありません。In general, a Page isn't concerned about these events. 多くの場合、アプリケーションで問題が発生する可能性があります。そのため、これらのイベントは Application クラスによっても発生します。It is more likely that an application is concerned with them and, for that reason, these events are also raised by the Application class:

@No__t_0 によってイベントが発生するたびに、Application クラスによって対応するイベントが発生します。Every time NavigationService raises an event, the Application class raises the corresponding event. FrameNavigationWindow は、それぞれのスコープ内のナビゲーションを検出するために同じイベントを提供します。Frame and NavigationWindow offer the same events to detect navigation within their respective scopes.

場合によっては、Page がこれらのイベントに関心を持つことがあります。In some cases, a Page might be interested in these events. たとえば、Page は、ナビゲーションをキャンセルするかどうかを決定するために NavigationService.Navigating イベントを処理することがあります。For example, a Page might handle the NavigationService.Navigating event to determine whether or not to cancel navigation away from itself. これを次の例に示します。This is shown in the following example.

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.CancelNavigationPage">
  <Button Click="button_Click">Navigate to Another Page</Button>
</Page>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;

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;
        }
    }
}

Namespace SDKSample
    Partial Public Class CancelNavigationPage
        Inherits Page
        Public Sub New()
            InitializeComponent()

            ' Can only access the NavigationService when the page has been loaded
            AddHandler Loaded, AddressOf CancelNavigationPage_Loaded
            AddHandler Unloaded, AddressOf CancelNavigationPage_Unloaded
        End Sub

        Private Sub button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            ' Force WPF to download this page again
            Me.NavigationService.Navigate(New Uri("AnotherPage.xaml", UriKind.Relative))
        End Sub

        Private Sub CancelNavigationPage_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
            AddHandler NavigationService.Navigating, AddressOf NavigationService_Navigating
        End Sub

        Private Sub CancelNavigationPage_Unloaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
            RemoveHandler NavigationService.Navigating, AddressOf NavigationService_Navigating
        End Sub

        Private Sub NavigationService_Navigating(ByVal sender As Object, ByVal e As NavigatingCancelEventArgs)
            ' Does the user really want to navigate to another page?
            Dim result As MessageBoxResult
            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 Then
                e.Cancel = True
            End If
        End Sub
    End Class
End Namespace

前の例のように、Page からナビゲーションイベントを使用してハンドラーを登録する場合は、イベントハンドラーの登録を解除する必要もあります。If you register a handler with a navigation event from a Page, as the preceding example does, you must also unregister the event handler. そうしないと、WPFWPF ナビゲーションによって履歴を使用した Page ナビゲーションが記憶される方法に関して副作用が生じる可能性があります。If you don't, there may be side effects with respect to how WPFWPF navigation remembers Page navigation using the journal.

履歴によるナビゲーションの記憶Remembering Navigation with the Journal

WPFWPF は、戻るスタックと進むスタックの 2 つのスタックを使用して、ナビゲート元のページを記憶します。uses two stacks to remember the pages that you have navigated from: a back stack and a forward stack. 現在の Page から新しい Page に移動するか、既存の Page に進むと、現在の Pageバックスタックに追加されます。When you navigate from the current Page to a new Page or forward to an existing Page, the current Page is added to the back stack. 現在の Page から前の Page に移動すると、現在の Page前方スタックに追加されます。When you navigate from the current Page back to the previous Page, the current Page is added to the forward stack. 戻るスタック、進むスタック、およびそれらを管理する機能を、まとめて履歴と呼びます。The back stack, the forward stack, and the functionality to manage them, are collectively referred to as the journal. バックスタックと転送スタックの各項目は JournalEntry クラスのインスタンスであり、履歴エントリと呼ばれます。Each item in the back stack and the forward stack is an instance of the JournalEntry class, and is referred to as a journal entry.

概念的には、journal は Internet Explorer の [戻る] ボタンと [進む] ボタンと同じ方法で動作します。Conceptually, the journal operates the same way that the Back and Forward buttons in Internet Explorer do. これを次の図に示します。These are shown in the following figure.

[戻る] ボタンと [進む] ボタンBack and Forward buttons

Internet Explorer でホストされている XBAPXBAPs の場合、WPFWPF journal を Internet Explorer のナビゲーション UIUI に統合します。For XBAPXBAPs that are hosted by Internet Explorer, WPFWPF integrates the journal into the navigation UIUI of Internet Explorer. これにより、ユーザーは Internet Explorer の [戻る][進む][最近使ったページ] の各ボタンを使用して、XBAPXBAP 内のページを移動できます。This allows users to navigate pages in an XBAPXBAP by using the Back, Forward, and Recent Pages buttons in Internet Explorer.

重要

Internet Explorer では、ユーザーが XBAPXBAP との間で移動したときに、保持されていないページの履歴項目だけが履歴に保持されます。In Internet Explorer, when a user navigates away from and back to an XBAPXBAP, only the journal entries for pages that were not kept alive are retained in the journal. ページを維持したままにする方法については、このトピックで後述する「ページの有効期間と履歴」を参照してください。For discussion on keeping pages alive, see Page Lifetime and the Journal later in this topic.

既定では、Internet Explorer の [最近使ったページ] の一覧に表示される各 Page のテキストは、Page の URI です。By default, the text for each Page that appears in the Recent Pages list of Internet Explorer is the URI for the Page. 多くの場合、これは、ユーザーにとって特に意味がありません。In many cases, this is not particularly meaningful to the user. 幸い、次のオプションのいずれかを使用して、テキストを変更できます。Fortunately, you can change the text using one the following options:

  1. アタッチされた JournalEntry.Name 属性値。The attached JournalEntry.Name attribute value.

  2. @No__t_0 属性値。The Page.Title attribute value.

  3. 現在の PagePage.WindowTitle 属性値と URI。The Page.WindowTitle attribute value and the URI for the current Page.

  4. 現在の Page の URI。The URI for the current Page. (既定)(Default)

これらのオプションの順序は、テキスト検索の優先順位と一致します。The order in which the options are listed matches the order of precedence for finding the text. たとえば、JournalEntry.Name が設定されている場合、他の値は無視されます。For example, if JournalEntry.Name is set, the other values are ignored.

次の例では、Page.Title 属性を使用して、journal エントリに対して表示されるテキストを変更します。The following example uses the Page.Title attribute to change the text that appears for a journal entry.

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://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;

namespace SDKSample
{
    public partial class PageWithTitle : Page
    {

Namespace SDKSample
    Partial Public Class PageWithTitle
        Inherits Page
    }
}
    End Class
End Namespace

ユーザーは、Internet Explorer の [戻る][進む] 、および 最近 の各ページを使用して履歴内を移動できますが、WPFWPF によって提供される宣言型とプログラム用の両方のメカニズムを使用して、履歴内を移動することもできます。Although a user can navigate the journal by using the Back, Forward, and Recent Pages in Internet Explorer, you can also navigate the journal using both declarative and programmatic mechanisms provided by WPFWPF. これを行う理由の1つは、ページにカスタムナビゲーション Ui を提供することです。One reason to do this is to provide custom navigation UIs in your pages.

@No__t_0 によって公開されているナビゲーションコマンドを使用して、journal ナビゲーションサポートを宣言によって追加できます。You can declaratively add journal navigation support by using the navigation commands exposed by NavigationCommands. 次の例は、BrowseBack ナビゲーションコマンドの使用方法を示しています。The following example demonstrates how to use the BrowseBack navigation command.

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.NavigationCommandsPage">
<Hyperlink Command="NavigationCommands.BrowseBack">Back</Hyperlink>
<Hyperlink Command="NavigationCommands.BrowseForward">Forward</Hyperlink>
</Page>

@No__t_0 クラスの次のいずれかのメンバーを使用して、プログラムを使用して履歴をナビゲートできます。You can programmatically navigate the journal by using one of the following members of the NavigationService class:

このトピックの「ナビゲーション履歴によるコンテンツの状態の保持」で説明されているように、履歴はプログラムによって操作することもできます。The journal can also be manipulated programmatically, as discussed in Retaining Content State with Navigation History later in this topic.

ページの有効期間と履歴Page Lifetime and the Journal

グラフィックス、アニメーション、メディアなどのリッチコンテンツを含む複数のページがある XBAPXBAP について考えてみましょう。Consider an XBAPXBAP with several pages that contain rich content, including graphics, animations, and media. このようなページのメモリ使用量は、特にビデオやオーディオ メディアが使用されている場合、非常に大きくなることがあります。The memory footprint for pages like these could be quite large, particularly if video and audio media are used. 履歴に移動先のページが "記憶" されている場合、このような XBAPXBAP は、大量のメモリをすばやく消費する可能性があります。Given that the journal "remembers" pages that have been navigated to, such an XBAPXBAP could quickly consume a large and noticeable amount of memory.

このため、履歴の既定の動作では、Page オブジェクトへの参照ではなく、各履歴エントリに Page メタデータが格納されます。For this reason, the default behavior of the journal is to store Page metadata in each journal entry rather than a reference to a Page object. 履歴項目に移動すると、その Page メタデータを使用して、指定された Page の新しいインスタンスが作成されます。When a journal entry is navigated to, its Page metadata is used to create a new instance of the specified Page. その結果、移動される各 Page には、次の図に示す有効期間があります。As a consequence, each Page that is navigated has the lifetime that is illustrated by the following figure.

ページの有効期間Page lifetime

既定のジャーナル動作を使用すると、メモリ使用量を節約できますが、ページごとのレンダリングのパフォーマンスが低下する可能性があります。特に大量のコンテンツがある場合は、Page を再インスタンス化すると時間がかかることがあります。Although using the default journaling behavior can save on memory consumption, per-page rendering performance might be reduced; reinstantiating a Page can be time-intensive, particularly if it has a lot of content. @No__t_0 インスタンスをジャーナルに保持する必要がある場合は、2つの方法を使用して作成できます。If you need to retain a Page instance in the journal, you can draw on two techniques for doing so. まず、NavigationService.Navigate メソッドを呼び出すことによって、プログラムを使用して Page オブジェクトに移動できます。First, you can programmatically navigate to a Page object by calling the NavigationService.Navigate method.

次に、KeepAlive プロパティを true に設定することによって、Page のインスタンスをジャーナルに保持 WPFWPF ことを指定できます (既定値は false)。Second, you can specify that WPFWPF retain an instance of a Page in the journal by setting the KeepAlive property to true (the default is false). 次の例に示すように、マークアップで宣言によって KeepAlive を設定できます。As shown in the following example, you can set KeepAlive declaratively in markup.

<Page
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="SDKSample.KeepAlivePage"
    KeepAlive="True">
  
  An instance of this page is stored in the journal.
  
</Page>

保持されている Page の有効期間は、それとは異なるものとはわずかに異なります。The lifetime of a Page that is kept alive is subtly different from one that is not. 保持されている Page が最初に移動されたときには、保持されていない Page と同じようにインスタンス化されます。The first time a Page that is kept alive is navigated to, it is instantiated just like a Page that is not kept alive. ただし、Page のインスタンスはジャーナルに保持されるため、ジャーナルに残っている限り、再インスタンス化されることはありません。However, because an instance of the Page is retained in the journal, it is never instantiated again for as long as it remains in the journal. その結果、Page がナビゲートされるたびに呼び出される必要がある初期化ロジックが Page にある場合は、コンストラクターから Loaded イベントのハンドラーに移動する必要があります。Consequently, if a Page has initialization logic that needs to be called every time the Page is navigated to, you should move it from the constructor into a handler for the Loaded event. 次の図に示すように、Loaded イベントと Unloaded イベントは、それぞれ Page に移動するたびに発生します。As shown in the following figure, the Loaded and Unloaded events are still raised each time a Page is navigated to and from, respectively.

読み込みイベントとアンロードイベントが発生したときWhen the Loaded and Unloaded events are raised

@No__t_0 が維持されていない場合は、次のいずれの操作も実行しないでください。When a Page is not kept alive, you should not do either of the following:

  • ページへの参照、またはその一部への参照を格納する。Store a reference to it, or any part of it.

  • ページによって実装されていないイベントのイベント ハンドラーを登録する。Register event handlers with events that are not implemented by it.

これらのいずれかを実行すると、履歴から削除された後でも、Page を強制的にメモリに保持する参照が作成されます。Doing either of these will create references that force the Page to be retained in memory, even after it has been removed from the journal.

一般に、Page を使用しないようにする場合は、既定の Page 動作を使用することをお勧めします。In general, you should prefer the default Page behavior of not keeping a Page alive. ただし、これには、次のセクションで説明されている状態も関係します。However, this has state implications that are discussed in the next section.

ナビゲーション履歴によるコンテンツの状態の保持Retaining Content State with Navigation History

@No__t_0 が維持されていない状態で、ユーザーからデータを収集するコントロールがある場合、ユーザーが Page に移動して戻ると、データはどうなりますか。If a Page is not kept alive, and it has controls that collect data from the user, what happens to the data if a user navigates away from and back to the Page? ユーザー エクスペリエンスの観点から見ると、ユーザーは以前に入力したデータが表示されることを期待します。From a user experience perspective, the user should expect to see the data they entered previously. 残念ながら、各ナビゲーションを使用して Page の新しいインスタンスが作成されるため、データを収集したコントロールは再インスタンス化され、データは失われます。Unfortunately, because a new instance of the Page is created with each navigation, the controls that collected the data are reinstantiated and the data is lost.

幸いにも、この履歴では、制御データを含む Page ナビゲーション全体でデータを記憶することがサポートされています。Fortunately, the journal provides support for remembering data across Page navigations, including control data. 具体的には、各 Page の履歴エントリは、関連付けられた Page 状態の一時コンテナーとして機能します。Specifically, the journal entry for each Page acts as a temporary container for the associated Page state. 次の手順では、Page を移動するときに、このサポートを使用する方法を説明します。The following steps outline how this support is used when a Page is navigated from:

  1. 現在の Page のエントリが履歴に追加されます。An entry for the current Page is added to the journal.

  2. @No__t_0 の状態は、そのページの履歴エントリと共に保存され、バックスタックに追加されます。The state of the Page is stored with the journal entry for that page, which is added to the back stack.

  3. 新しい Page に移動します。The new Page is navigated to.

ページ Page がに戻ると、ジャーナルを使用して次の手順が実行されます。When the page Page is navigated back to, using the journal, the following steps take place:

  1. @No__t_0 (バックスタックの一番上のジャーナルエントリ) がインスタンス化されます。The Page (the top journal entry on the back stack) is instantiated.

  2. @No__t_0 は、Page の履歴エントリと共に保存された状態で更新されます。The Page is refreshed with the state that was stored with the journal entry for the Page.

  3. @No__t_0 がに戻ります。The Page is navigated back to.

Page で次のコントロールが使用されている場合、WPFWPF はこのサポートを自動的に使用します。WPFWPF automatically uses this support when the following controls are used on a Page:

@No__t_0 がこれらのコントロールを使用している場合、次の図に示すように、お気に入りの色ListBox に示されているように、これらのコントロールに入力されたデータは Page ナビゲーション全体で記憶されます。If a Page uses these controls, data entered into them is remembered across Page navigations, as demonstrated by the Favorite ColorListBox in the following figure.

状態を記憶するコントロールを含むページPage with controls that remember state

@No__t_0 に上記のリスト以外のコントロールが含まれている場合、または状態がカスタムオブジェクトに格納されている場合は、Page ナビゲーション全体で履歴を記憶するようにコードを記述する必要があります。When a Page has controls other than those in the preceding list, or when state is stored in custom objects, you need to write code to cause the journal to remember state across Page navigations.

@No__t_0 ナビゲーション全体で小さな状態を記憶する必要がある場合は、FrameworkPropertyMetadata.Journal メタデータフラグで構成されている依存関係プロパティ (DependencyProperty を参照) を使用できます。If you need to remember small pieces of state across Page navigations, you can use dependency properties (see DependencyProperty) that are configured with the FrameworkPropertyMetadata.Journal metadata flag.

ナビゲーション間で Page が記憶する必要のある状態が複数のデータで構成されている場合は、1つのクラスで状態をカプセル化して IProvideCustomContentState インターフェイスを実装することで、コードの負担が少なくなることがあります。If the state that your Page needs to remember across navigations comprises multiple pieces of data, you may find it less code intensive to encapsulate your state in a single class and implement the IProvideCustomContentState interface.

@No__t_1 自体から移動せずに、1つの Page のさまざまな状態を移動する必要がある場合は、IProvideCustomContentStateNavigationService.AddBackEntry を使用できます。If you need to navigate through various states of a single Page, without navigating from the Page itself, you can use IProvideCustomContentState and NavigationService.AddBackEntry.

クッキーCookies

@No__t_0 アプリケーションがデータを格納できるもう1つの方法は、SetCookie メソッドと GetCookie メソッドを使用して作成、更新、および削除される cookie を使用することです。Another way that WPFWPF applications can store data is with cookies, which are created, updated, and deleted by using the SetCookie and GetCookie methods. @No__t_0 で作成できる cookie は、他の種類の Web アプリケーションが使用する cookie と同じです。cookie は、アプリケーションセッション中またはアプリケーションセッション間でクライアントコンピューター上のアプリケーションによって保存される任意のデータです。The cookies that you can create in WPFWPF are the same cookies that other types of Web applications use; cookies are arbitrary pieces of data that are stored by an application on a client machine either during or across application sessions. クッキー データは、通常、次の形式の名前と値のペアです。Cookie data typically takes the form of a name/value pair in the following format.

Name = ValueName = Value

クッキーが設定される場所の Uri と共に SetCookie にデータが渡されると、cookie はメモリ内に作成され、現在のアプリケーションセッションの間のみ使用できます。When the data is passed to SetCookie, along with the Uri of the location for which the cookie should be set, a cookie is created in-memory, and it is only available for the duration of the current application session. この種類の cookie は、セッション cookieと呼ばれます。This type of cookie is referred to as a session cookie.

複数のアプリケーション セッションにまたがってクッキーを格納するには、次の形式を使用して、有効期限をクッキーに追加する必要があります。To store a cookie across application sessions, an expiration date must be added to the cookie, using the following format.

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

有効期限が切れたクッキーは、cookie の有効期限が切れるまで、現在の Windows インストールのインターネット一時ファイルフォルダーに格納されます。A cookie with an expiration date is stored in the current Windows installation's Temporary Internet Files folder until the cookie expires. このような cookie は、アプリケーションセッション間で保持されるため、永続的なクッキーと呼ばれます。Such a cookie is known as a persistent cookie because it persists across application sessions.

@No__t_0 メソッドを呼び出して、セッションと永続的な cookie の両方を取得し、SetCookie メソッドを使用して cookie が設定されている場所の Uri を渡します。You retrieve both session and persistent cookies by calling the GetCookie method, passing the Uri of the location where the cookie was set with the SetCookie method.

@No__t_0 でクッキーがサポートされるいくつかの方法を次に示します。The following are some of the ways that cookies are supported in WPFWPF:

  • WPFWPF スタンドアロンアプリケーションと XBAPXBAPs は、cookie の作成と管理の両方を行うことができます。standalone applications and XBAPXBAPs can both create and manage cookies.

  • @No__t_0 によって作成された cookie は、ブラウザーからアクセスできます。Cookies that are created by an XBAPXBAP can be accessed from the browser.

  • 同じドメインの XBAPXBAPs は、クッキーを作成して共有できます。XBAPXBAPs from the same domain can create and share cookies.

  • 同じドメインの XBAPXBAPs と HTML ページでは、cookie を作成して共有できます。XBAPXBAPs and HTML pages from the same domain can create and share cookies.

  • @No__t_0 と XAMLXAML ページが Web 要求を行うときに、cookie がディスパッチされます。Cookies are dispatched when XBAPXBAPs and loose XAMLXAML pages make Web requests.

  • IFRAME でホストされているトップレベルの XBAPXBAPsXBAPXBAPs は、どちらもクッキーにアクセスできます。Both top-level XBAPXBAPs and XBAPXBAPs hosted in IFRAMES can access cookies.

  • @No__t_0 での Cookie のサポートは、サポートされているすべてのブラウザーで同じです。Cookie support in WPFWPF is the same for all supported browsers.

  • Internet Explorer では、cookie に関連する P3P ポリシーは、特にファーストパーティおよびサードパーティの XBAPXBAPs に関して WPFWPF によって受け入れられます。In Internet Explorer, P3P policy that pertains to cookies is honored by WPFWPF, particularly with respect to first-party and third-party XBAPXBAPs.

構造化ナビゲーションStructured Navigation

ある Page から別のにデータを渡す必要がある場合は、Page のパラメーターなしのコンストラクターにデータを引数として渡すことができます。If you need to pass data from one Page to another, you can pass the data as arguments to a non-parameterless constructor of the Page. この手法を使用する場合は、Page を有効な状態に保つ必要があることに注意してください。それ以外の場合は、次に Page に移動するときに、パラメーターなしのコンストラクターを使用して Page を再インスタンス化 WPFWPF ます。Note that if you use this technique, you must keep the Page alive; if not, the next time you navigate to the Page, WPFWPF reinstantiates the Page by using the parameterless constructor.

または、Page に渡す必要があるデータで設定されたプロパティを実装できます。Alternatively, your Page can implement properties that are set with the data that needs to be passed. ただし、Page がデータを移動する Page にデータを渡す必要がある場合は、注意が必要です。Things become tricky, however, when a Page needs to pass data back to the Page that navigated to it. 問題は、ナビゲーションによって、移動後に Page が返されることを保証するメカニズムがネイティブでサポートされないことです。The problem is that navigation doesn't natively support mechanisms for guaranteeing that a Page will be returned to after it is navigated from. 基本的に、ナビゲーションは、"呼び出す/戻る" というセマンティクスをサポートしていません。Essentially, navigation doesn't support call/return semantics. この問題を解決するために、WPFWPF には、予測可能で構造化された方法で Page が返されるようにするために使用できる PageFunction<T> クラスが用意されています。To solve this problem, WPFWPF provides the PageFunction<T> class that you can use to ensure that a Page is returned to in a predictable and structured fashion. 詳細については、「構造化ナビゲーションの概要」を参照してください。For more information, see Structured Navigation Overview.

NavigationWindow クラスThe NavigationWindow Class

ここまでで、ナビゲート可能なコンテンツを含むアプリケーションをビルドするために使用する可能性が最も高いナビゲーション サービスの全容を説明しました。To this point, you've seen the gamut of navigation services that you are most likely to use to build applications with navigable content. これらのサービスについては XBAPXBAPs のコンテキストで説明しましたが、XBAPXBAPs に限定されるわけではありません。These services were discussed in the context of XBAPXBAPs, although they are not limited to XBAPXBAPs. 最新のオペレーティングシステムと Windows アプリケーションでは、最新のユーザーのブラウザーエクスペリエンスを利用して、ブラウザー形式のナビゲーションをスタンドアロンアプリケーションに組み込むことができます。Modern operating systems and Windows applications take advantage of the browser experience of modern users to incorporate browser-style navigation into standalone applications. 一般的な例は、次のとおりです。Common examples include:

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

  • ファイル エクスプ ローラー: ファイルとフォルダーをナビゲートします。File Explorer: Navigate files and folders.

  • ウィザード: 複雑なタスクを複数のページに分割し、ページ間をナビゲートできます。Wizards: Breaking down a complex task into multiple pages that can be navigated between. 例として、windows の機能の追加と削除を処理する Windows コンポーネントウィザードがあります。An example is the Windows Components Wizard that handles adding and removing Windows features.

スタンドアロンアプリケーションにブラウザースタイルのナビゲーションを組み込むには、NavigationWindow クラスを使用できます。To incorporate browser-style navigation into your standalone applications, you can use the NavigationWindow class. NavigationWindowWindow から派生し、XBAPXBAPs が提供するナビゲーションに対して同じサポートを使用して拡張します。NavigationWindow derives from Window and extends it with the same support for navigation that XBAPXBAPs provide. @No__t_0 は、スタンドアロンアプリケーションのメインウィンドウとして使用することも、ダイアログボックスなどのセカンダリウィンドウとして使用することもできます。You can use NavigationWindow as either the main window of your standalone application or as a secondary window such as a dialog box.

@No__t_1 (WindowPage など) の最上位レベルのクラスと同様に NavigationWindow を実装するには、マークアップと分離コードの組み合わせを使用します。To implement a NavigationWindow, as with most top-level classes in WPFWPF (Window, Page, and so on), you use a combination of markup and code-behind. これを次の例に示します。This is shown in the following example.

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

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

Namespace SDKSample
    Partial Public Class MainWindow
        Inherits NavigationWindow
        Public Sub New()
            InitializeComponent()
        End Sub
    End Class
End Namespace

このコードは、NavigationWindow を開いたときに Page (ホームページ) に自動的に移動する NavigationWindow を作成します。This code creates a NavigationWindow that automatically navigates to a Page (HomePage.xaml) when the NavigationWindow is opened. @No__t_0 がメインアプリケーションウィンドウである場合は、StartupUri 属性を使用して起動できます。If the NavigationWindow is the main application window, you can use the StartupUri attribute to launch it. これを次のマークアップに示します。This is shown in the following markup.

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

次の図は、スタンドアロンアプリケーションのメインウィンドウとして NavigationWindow を示しています。The following figure shows the NavigationWindow as the main window of a standalone application.

メインウィンドウA main window

この図からは、前の例の NavigationWindow の実装コードで設定されていなくても、NavigationWindow にタイトルがあることがわかります。From the figure, you can see that the NavigationWindow has a title, even though it wasn't set in the NavigationWindow implementation code from the preceding example. 代わりに、次のコードに示すように、WindowTitle プロパティを使用してタイトルを設定します。Instead, the title is set using the WindowTitle property, which is shown in the following code.

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

@No__t_0 と WindowHeight のプロパティを設定すると、NavigationWindow も影響を及ぼします。Setting the WindowWidth and WindowHeight properties also affects the NavigationWindow.

通常、動作または外観をカスタマイズする必要がある場合は、独自の NavigationWindow を実装します。Usually, you implement your own NavigationWindow when you need to customize either its behavior or its appearance. どちらも行わない場合は、ショートカットを使用できます。If you do neither, you can use a shortcut. スタンドアロンアプリケーションの StartupUri として Page のパック URI を指定すると、Application によって、Page をホストするための NavigationWindow が自動的に作成されます。If you specify the pack URI of a Page as the StartupUri in a standalone application, Application automatically creates a NavigationWindow to host the Page. 次のマークアップは、この方法を示しています。The following markup shows how to enable this.

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

ダイアログボックスなどのセカンダリアプリケーションウィンドウを NavigationWindow にする場合は、次の例のコードを使用して開くことができます。If you want a secondary application window such as a dialog box to be a NavigationWindow, you can use the code in the following example to open it.

// 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();
' Open a navigation window as a dialog box
Dim dlg As New NavigationWindowDialogBox()
dlg.Source = New Uri("HomePage.xaml", UriKind.Relative)
dlg.Owner = Me
dlg.ShowDialog()

次の図に、結果を示します。The following figure shows the result.

ダイアログボックスA dialog box

ご覧のように、NavigationWindow には、ユーザーが journal を操作できるようにする Internet Explorer スタイルの [戻る] ボタンと [進む] ボタンが表示されます。As you can see, NavigationWindow displays Internet Explorer-style Back and Forward buttons that allow users to navigate the journal. これらのボタンは、次の図に示されているように、同じユーザー エクスペリエンスを提供します。These buttons provide the same user experience, as shown in the following figure.

NavigationWindow の [戻る] ボタンと [進む] ボタンBack and Forward buttons in a NavigationWindow

ページに独自のジャーナルナビゲーションサポートと UI が用意されている場合は、[ShowsNavigationUI] プロパティの値を false に設定することによって、NavigationWindow によって表示される [戻る] ボタンと [進む] ボタンを非表示にすることができます。If your pages provide their own journal navigation support and UI, you can hide the Back and Forward buttons displayed by NavigationWindow by setting the value of the ShowsNavigationUI property to false.

または、WPFWPF でカスタマイズサポートを使用して、NavigationWindow 自体の UIUI を置き換えることもできます。Alternatively, you can use customization support in WPFWPF to replace the UIUI of the NavigationWindow itself.

Frame クラスThe Frame Class

ブラウザーと NavigationWindow はどちらも、誘導可能なコンテンツをホストするウィンドウです。Both the browser and NavigationWindow are windows that host navigable content. 場合によっては、アプリケーションには、ウィンドウ全体でホストする必要のないコンテンツがあることもあります。In some cases, applications have content that does not need to be hosted by an entire window. このようなコンテンツは、代わりに、他のコンテンツ内でホストされます。Instead, such content be hosted inside other content. @No__t_0 クラスを使用して、他のコンテンツに誘導可能なコンテンツを挿入できます。You can insert navigable content into other content by using the Frame class. Frame では NavigationWindowXBAPXBAPs と同じサポートが提供されます。Frame provides the same support as NavigationWindow and XBAPXBAPs.

次の例は、Frame 要素を使用して Page に宣言によって Frame を追加する方法を示しています。The following example shows how to add a Frame to a Page declaratively by using the Frame element.

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

このマークアップは、Frame 要素の Source 属性に、Frame が最初に移動する Page のパック URI を設定します。This markup sets the Source attribute of the Frame element with a pack URI for the Page that the Frame should initially navigate to. 次の図は、複数のページ間を移動する Frame を持つ PageXBAPXBAP を示しています。The following figure shows an XBAPXBAP with a Page that has a Frame that has navigated between several pages.

複数のページ間を移動するフレームA frame that has navigated between multiple pages

@No__t_1 のコンテンツ内で Frame を使用する必要があるだけではありません。You don't only have to use Frame inside the content of a Page. また、Window のコンテンツ内の Frame をホストすることもよくあります。It is also common to host a Frame inside the content of a Window.

既定では、Frame は、別の履歴がない場合にのみ独自の履歴を使用します。By default, Frame only uses its own journal in the absence of another journal. @No__t_0 が NavigationWindow または XBAPXBAP の内部でホストされているコンテンツの一部である場合、FrameNavigationWindow または XBAPXBAP に属するジャーナルを使用します。If a Frame is part of content that is hosted inside either a NavigationWindow or an XBAPXBAP, Frame uses the journal that belongs to the NavigationWindow or XBAPXBAP. ただし、場合によっては、Frame が独自のジャーナルを担当する必要があります。Sometimes, though, a Frame might need to be responsible for its own journal. その理由の1つは、Frame でホストされているページ内での journal ナビゲーションを許可することです。One reason to do so is to allow journal navigation within the pages that are hosted by a Frame. これを次の図に示します。This is illustrated by the following figure.

フレームとページのダイアグラムFrame and Page diagram

この場合、FrameJournalOwnership プロパティを OwnsJournal に設定することによって、独自のジャーナルを使用するように Frame を構成できます。In this case, you can configure the Frame to use its own journal by setting the JournalOwnership property of the Frame to OwnsJournal. これを次のマークアップに示します。This is shown in the following markup.

<Page 
  xmlns="http://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 内で移動した場合の影響を示しています。The following figure illustrates the effect of navigating within a Frame that uses its own journal.

独自の履歴を使用するフレームA frame that uses its own journal

履歴エントリは、Internet Explorer ではなく Frame のナビゲーション UIUI によって表示されることに注意してください。Notice that the journal entries are shown by the navigation UIUI in the Frame, rather than by Internet Explorer.

注意

@No__t_0 が Window でホストされているコンテンツの一部である場合、Frame は独自の履歴を使用します。その結果、独自のナビゲーション UIUI が表示されます。If a Frame is part of content that is hosted in a Window, Frame uses its own journal and, consequently, displays its own navigation UIUI.

ユーザーエクスペリエンスで、ナビゲーション UIUI を表示せずに独自の履歴を提供するために Frame が必要な場合は、NavigationUIVisibilityHidden に設定することにより、ナビゲーション UIUI を非表示にすることができます。If your user experience requires a Frame to provide its own journal without showing the navigation UIUI, you can hide the navigation UIUI by setting the NavigationUIVisibility to Hidden. これを次のマークアップに示します。This is shown in the following markup.

<Page 
  xmlns="http://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 は、ナビゲーションホストと呼ばれるクラスです。Frame and NavigationWindow are classes that are known as navigation hosts. ナビゲーションホストは、コンテンツに移動して表示できるクラスです。A navigation host is a class that can navigate to and display content. これを実現するために、各ナビゲーションホストは独自の NavigationService とジャーナルを使用します。To accomplish this, each navigation host uses its own NavigationService and journal. ナビゲーション ホストの基本的な構造を次の図に示します。The basic construction of a navigation host is shown in the following figure.

ナビゲーターの図Navigator diagrams

基本的に、これにより NavigationWindowFrame は、ブラウザーでホストされているときに XBAPXBAP が提供するのと同じナビゲーションサポートを提供できます。Essentially, this allows NavigationWindow and Frame to provide the same navigation support that an XBAPXBAP provides when hosted in the browser.

@No__t_0 とジャーナルを使用するだけでなく、ナビゲーションホストは、を実装 NavigationService 同じメンバーを実装します。Besides using NavigationService and a journal, navigation hosts implement the same members that NavigationService implements. これを次の図に示します。This is illustrated by the following figure.

フレーム内および NavigationWindow 内のジャーナルA journal in a Frame and in a NavigationWindow

これにより、これらのメンバーに対して直接、ナビゲーション サポートをプログラミングできます。This allows you to program navigation support directly against them. @No__t_2 でホストされている Frame にカスタムナビゲーション UIUI を提供する必要がある場合は、この点を考慮してください。You may consider this if you need to provide a custom navigation UIUI for a Frame that is hosted in a Window. さらに、どちらの種類も、BackStack (NavigationWindow.BackStackFrame.BackStack) と ForwardStack (NavigationWindow.ForwardStackFrame.ForwardStack) を含む追加のナビゲーション関連のメンバーを実装します。これにより、バックスタックと転送スタックの履歴エントリをそれぞれ列挙できます。Furthermore, both types implement additional, navigation-related members, including BackStack (NavigationWindow.BackStack, Frame.BackStack) and ForwardStack (NavigationWindow.ForwardStack, Frame.ForwardStack), which allow you to enumerate the journal entries in the back stack and forward stack, respectively.

前に述べたように、アプリケーション内に複数の履歴が存在することがあります。As mentioned earlier, more than one journal can exist within an application. 次の図は、この例を示しています。The following figure provides an example of when this can happen.

1つのアプリケーション内の複数のジャーナルMultiple journals within one application

このトピックでは、WPFWPF のさまざまなナビゲーション機能を示すために、Page とパック XBAPXBAPs を使用しました。Throughout this topic, Page and pack XBAPXBAPs have been used to demonstrate the various navigation capabilities of WPFWPF. ただし、アプリケーションにコンパイルされた Page は、移動できる唯一の種類のコンテンツではなく、パック XBAPXBAPs がコンテンツを識別する唯一の方法ではありません。However, a Page that is compiled into an application is not the only type of content that can be navigated to, and pack XBAPXBAPs aren't the only way to identify content.

このセクションで示すように、ルース XAMLXAML ファイル、HTML ファイル、およびオブジェクトに移動することもできます。As this section demonstrates, you can also navigate to loose XAMLXAML files, HTML files, and objects.

XAMLXAML ファイルは、次の特性を持つファイルです。A loose XAMLXAML file is a file with the following characteristics:

  • @No__t_0 のみが含まれています (つまり、コードがありません)。Contains only XAMLXAML (that is, no code).

  • 適切な名前空間宣言がある。Has an appropriate namespace declaration.

  • .xaml ファイル名拡張子を持つ。Has the .xaml file name extension.

たとえば、次のコンテンツは、ルース XAMLXAML ファイルとして保存されているとします。For example, consider the following content that is stored as a loose XAMLXAML file, Person.xaml.

<!-- Person.xaml -->
<TextBlock xmlns="http://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>

ファイルをダブルクリックすると、ブラウザーが開き、コンテンツにナビゲートして、コンテンツを表示します。When you double-click the file, the browser opens and navigates to and displays the content. これを次の図に示します。This is shown in the following figure.

ユーザー .XAML ファイルの内容の表示Display of the content in the Person.XAML file

次のものから、疎な XAMLXAML ファイルを表示できます。You can display a loose XAMLXAML file from the following:

  • ローカル コンピューター、イントラネット、またはインターネット上の Web サイト。A Web site on the local machine, the intranet, or the Internet.

  • UNC (汎用名前付け規則) ファイル共有。A Universal Naming Convention (UNC) file share.

  • ローカル ディスク。The local disk.

圧縮されていない XAMLXAML ファイルは、ブラウザーのお気に入りに追加することも、ブラウザーのホームページに追加することもできます。A loose XAMLXAML file can be added to the browser's favorites, or be the browser's home page.

注意

XAMLXAML ページのパブリッシュと起動の詳細については、「 WPF アプリケーションの配置」を参照してください。For more information about publishing and launching loose XAMLXAML pages, see Deploying a WPF Application.

緩い XAMLXAML に対する1つの制限は、部分信頼で実行しても安全なコンテンツのみをホストできることです。One limitation with respect to loose XAMLXAML is that you can only host content that is safe to run in partial trust. たとえば、Window は、ルース XAMLXAML ファイルのルート要素にすることはできません。For example, Window cannot be the root element of a loose XAMLXAML file. 詳細については、「 WPF 部分信頼セキュリティ」を参照してください。For more information, see WPF Partial Trust Security.

ご想像のとおり、HTML に移動することもできます。As you might expect, you can also navigate to HTML. Http スキームを使用する URI を指定するだけで済みます。You simply need to provide a URI that uses the http scheme. たとえば、次の XAMLXAML は、HTML ページに移動する Frame を示しています。For example, the following XAMLXAML shows a Frame that navigates to an HTML page.

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

HTML に移動するには、特殊なアクセス許可が必要です。Navigating to HTML requires special permissions. たとえば、インターネットゾーン部分信頼セキュリティサンドボックスで実行されている XBAPXBAP から移動することはできません。For example, you can't navigate from an XBAPXBAP that is running in the Internet zone partial trust security sandbox. 詳細については、「 WPF 部分信頼セキュリティ」を参照してください。For more information, see WPF Partial Trust Security.

@No__t_0 コントロールは、HTML ドキュメントのホスト、ナビゲーション、スクリプト/マネージコードの相互運用性をサポートします。The WebBrowser control supports HTML document hosting, navigation and script/managed code interoperability. @No__t_0 コントロールの詳細については、「WebBrowser」を参照してください。For detailed information regarding the WebBrowser control, see WebBrowser.

@No__t_0 と同様に、WebBrowser を使用して HTML に移動するには、特別なアクセス許可が必要です。Like Frame, navigating to HTML using WebBrowser requires special permissions. たとえば、部分信頼アプリケーションでは、元のサイトにある HTML にのみ移動できます。For example, from a partial-trust application, you can navigate only to HTML located at the site of origin. 詳細については、「 WPF 部分信頼セキュリティ」を参照してください。For more information, see WPF Partial Trust Security.

カスタムオブジェクトとして格納されているデータがある場合、そのデータを表示する方法の1つとして、それらのオブジェクトにバインドされたコンテンツを含む Page を作成します (「データバインディングの概要」を参照してください)。If you have data that is stored as custom objects, one way to display that data is to create a Page with content that is bound to those objects (see Data Binding Overview). オブジェクトを表示するためだけにページ全体を作成するオーバーヘッドが必要ない場合には、代わりに、オブジェクトに直接ナビゲートすることもできます。If you don't need the overhead of creating an entire page just to display the objects, you can navigate directly to them instead.

次のコードに実装されている Person クラスを考えてみましょう。Consider the Person class that is implemented in the following code.

using System.Windows.Media;

namespace SDKSample
{
    public class Person
    {
        string name;
        Color favoriteColor;

        public Person() { }
        public Person(string name, Color favoriteColor)
        {
            this.name = name;
            this.favoriteColor = favoriteColor;
        }

        public string Name
        {
            get { return this.name; }
            set { this.name = value; }
        }

        public Color FavoriteColor
        {
            get { return this.favoriteColor; }
            set { this.favoriteColor = value; }
        }
    }
}

Namespace SDKSample
    Public Class Person
        Private _name As String
        Private _favoriteColor As Color

        Public Sub New()
        End Sub
        Public Sub New(ByVal name As String, ByVal favoriteColor As Color)
            Me._name = name
            Me._favoriteColor = favoriteColor
        End Sub

        Public Property Name() As String
            Get
                Return Me._name
            End Get
            Set(ByVal value As String)
                Me._name = value
            End Set
        End Property

        Public Property FavoriteColor() As Color
            Get
                Return Me._favoriteColor
            End Get
            Set(ByVal value As Color)
                Me._favoriteColor = value
            End Set
        End Property
    End Class
End Namespace

このファイルに移動するには、次のコードに示すように、NavigationWindow.Navigate メソッドを呼び出します。To navigate to it, you call the NavigationWindow.Navigate method, as demonstrated by the following code.

<Page 
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  x:Class="SDKSample.HomePage"
  WindowTitle="Page that Navigates to an Object">
<Hyperlink Name="hyperlink" Click="hyperlink_Click">
  Navigate to Nancy Davolio
</Hyperlink>
</Page>
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;

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

        void hyperlink_Click(object sender, RoutedEventArgs e)
        {
            Person person = new Person("Nancy Davolio", Colors.Yellow);
            this.NavigationService.Navigate(person);
        }
    }
}

Namespace SDKSample
    Partial Public Class HomePage
        Inherits Page
        Public Sub New()
            InitializeComponent()
        End Sub

        Private Sub hyperlink_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
            Dim person As New Person("Nancy Davolio", Colors.Yellow)
            Me.NavigationService.Navigate(person)
        End Sub
    End Class
End Namespace

次の図に、結果を示します。The following figure shows the result.

クラスに移動するページA page that navigates to a class

この図には、役立つものが何も表示されていません。From this figure, you can see that nothing useful is displayed. 実際に表示される値は、 Personオブジェクトの ToString メソッドの戻り値です。既定では、これは WPFWPF がオブジェクトを表すために使用できる唯一の値です。In fact, the value that is displayed is the return value of the ToString method for the Person object; by default, this is the only value that WPFWPF can use to represent your object. @No__t_0 メソッドをオーバーライドして、より意味のある情報を返すこともできますが、それでも文字列値になります。You could override the ToString method to return more meaningful information, although it will still only be a string value. @No__t_0 のプレゼンテーション機能を利用する1つの手法は、データテンプレートを使用することです。One technique you can use that takes advantage of the presentation capabilities of WPFWPF is to use a data template. 特定の種類のオブジェクトに関連付けることのできるデータテンプレートを実装でき WPFWPF ます。You can implement a data template that WPFWPF can associate with an object of a particular type. 次のコードは、Person オブジェクトのデータテンプレートを示しています。The following code shows a data template for the Person object.

<Application
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SDKSample" 
    x:Class="SDKSample.App"
    StartupUri="HomePage.xaml">

  <Application.Resources>

    <!-- Data Template for the Person Class -->
    <DataTemplate DataType="{x:Type local:Person}">
      <TextBlock xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
        <TextBlock FontWeight="Bold">Name:</TextBlock>
        <TextBlock Text="{Binding Path=Name}" />
        <LineBreak />
        <TextBlock FontWeight="Bold">Favorite Color:</TextBlock>
        <TextBlock Text="{Binding Path=FavoriteColor}" />
      </TextBlock>
    </DataTemplate>
    
  </Application.Resources>

</Application>

ここでは、データテンプレートは、DataType 属性の x:Type マークアップ拡張機能を使用して、Person 型に関連付けられています。Here, the data template is associated with the Person type by using the x:Type markup extension in the DataType attribute. 次に、データテンプレートは TextBlock 要素 (TextBlock を参照) を Person クラスのプロパティにバインドします。The data template then binds TextBlock elements (see TextBlock) to the properties of the Person class. 次の図は、Person オブジェクトの更新された外観を示しています。The following figure shows the updated appearance of the Person object.

データテンプレートを持つクラスへの移動Navigating to a class that has a data template

この方法の利点は、データ テンプレートを再利用して、アプリケーションの任意の場所で オブジェクトを一貫して表示できることによって得られる一貫性です。An advantage of this technique is the consistency you gain by being able to reuse the data template to display your objects consistently anywhere in your application.

データテンプレートの詳細については、「データテンプレートの概要」を参照してください。For more information on data templates, see Data Templating Overview.

セキュリティSecurity

WPFWPF ナビゲーションサポートにより、XBAPXBAPs をインターネット経由で移動できるようになり、アプリケーションでサードパーティのコンテンツをホストできるようになります。navigation support allows XBAPXBAPs to be navigated to across the Internet, and it allows applications to host third-party content. アプリケーションとユーザーの両方を有害な動作から保護するために、WPFWPF には、セキュリティWPF 部分信頼セキュリティについて説明されているさまざまなセキュリティ機能が用意されています。To protect both applications and users from harmful behavior, WPFWPF provides a variety of security features that are discussed in Security and WPF Partial Trust Security.

関連項目See also