瀏覽概觀

Windows Presentation Foundation (WPF) 支援瀏覽器樣式流覽,可用於兩種類型的應用程式:獨立應用程式和 XAML 瀏覽器應用程式(XBAP)。 若要封裝流覽的內容,WPF 會提供 類別 Page 。 您可以使用 、或以程式設計方式 NavigationService ,以宣告方式從一個巡覽至另一個 。 PageHyperlink WPF 會使用日誌來記住已從 流覽的頁面,並流覽回頁面。

PageHyperlinkNavigationService 和 日誌會形成 WPF 所提供之導覽支援的核心。 此概觀會先詳細探索這些功能,再涵蓋進階導覽支援,包括流覽至鬆散的可延伸應用程式標記語言 (XAML) 檔案、HTML 檔案和物件。

注意

在本主題中,「瀏覽器」一詞只是指可裝載 WPF 應用程式的瀏覽器,其目前包含 Microsoft Internet Explorer 和 Firefox。 只有特定瀏覽器才支援特定的 WPF 功能,則會參考瀏覽器版本。

本主題提供 WPF 中主要導覽功能的概觀。 獨立應用程式和 XBAP 都可以使用這些功能,但本主題會在 XBAP 的內容中呈現。

注意

本主題不會討論如何建置及部署 XBAP。 如需 XBAP 的詳細資訊,請參閱 WPF XAML 瀏覽器應用程式概觀

本節說明並示範下列巡覽的各個面向︰

實作頁面

在 WPF 中,您可以流覽至數種內容類型,其中包括 .NET Framework 物件、自訂物件、列舉值、使用者控制項、XAML 檔案和 HTML 檔案。 不過,您會發現封裝內容最常見的便利方式是使用 Page 。 此外, Page 實作導覽特定功能,以增強其外觀並簡化開發。

使用 Page ,您可以使用如下所示的標記,以宣告方式實作 XAML 內容的導覽頁面。

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

Page在 XAML 標記中實作的 ,具有 Page 作為其根項目,而且需要 WPF XML 命名空間宣告。 元素 Page 包含您想要巡覽及顯示的內容。 您可以藉由設定屬性元素來 Page.Content 新增內容,如下列標記所示。

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

Page.Content 只能包含一個子專案;在上述範例中,內容是單一字串 「Hello, Page!」在實務上,您通常會使用版面配置控制項做為子項目(請參閱 Layout )來包含和撰寫您的內容。

專案的子專案 Page 會被視為 的內容 Page ,因此,您不需要使用明確 Page.Content 宣告。 下列標記是前例的宣告式對等項目。

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

在此情況下, Page.Content 會自動使用 專案的子專案 Page 進行設定。 如需詳細資訊,請參閱 WPF 內容模型

僅限 Page 標記對於顯示內容很有用。 不過, Page 也可以顯示控制項,允許使用者與頁面互動,而且可以透過處理事件和呼叫應用程式邏輯來回應使用者互動。 互動式 Page 是使用標記和程式碼後置的組合來實作,如下列範例所示。

<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

若要讓標記檔案和程式碼後置檔案一起工作,需要設定下列項目:

  • 在標記中,Page 元素必須包含 x:Class 屬性。 建置應用程式時,標記檔案中的 存在 x:Class 會導致 Microsoft 組建引擎 (MSBuild) 建立 partial 衍生自 Page 的類別,並具有 屬性所 x:Class 指定的名稱。 這需要新增 XAML 架構的 XML 命名空間宣告 ( xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 。 產生的 partial 類別會實作 InitializeComponent ,其會呼叫以註冊事件,並設定在標記中實作的屬性。

  • 在程式碼後置中,此類別必須是具有標記中 x:Class 屬性所指定之相同名稱的 partial 類別,而且必須衍生自 Page。 這可讓程式碼後置檔案與 partial 建置應用程式時為標記檔案產生的類別產生關聯(請參閱 建置 WPF 應用程式 )。

  • 在程式碼後置中,Page 類別必須實作呼叫 InitializeComponent 方法的建構函式。 標記檔案產生的 partial 類別實作 InitializeComponent,以登錄事件,並設定在標記中定義的屬性。

注意

當您使用 Visual Studio 將新的 Page 新增至專案時, Page 會使用標記和程式碼後置來實作 ,其中包含建立標記與程式碼後置檔案之間的關聯的必要組態,如這裡所述。

擁有 Page 之後,即可流覽至它。 若要指定應用程式巡覽至的第一個 Page ,您需要設定啟動 Page

設定起始頁

XBAP 需要一定數量的應用程式基礎結構才能裝載在瀏覽器中。 在 WPF 中,類別 Application 是建立必要應用程式基礎結構的應用程式定義一部分(請參閱 應用程式管理概觀 )。

應用程式定義通常會使用標記和程式碼後置來實作,並將標記檔案設定為 MSBuild ApplicationDefinition 專案。 以下是 XBAP 的應用程式定義。

<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

XBAP 可以使用其應用程式定義來指定啟動 Page ,也就是 Page 啟動 XBAP 時自動載入的 。 您可以為所需的 Page 設定 StartupUri 具有統一資源識別項 (URI) 的屬性來執行此動作。

注意

在大部分情況下, Page 會使用應用程式編譯或部署 。 在這些情況下,識別 Page 的 URI 是套件 URI,這是符合 套件 配置的 URI。 套件 URI 會在 WPF 中的套件 URI 中 進一步討論。 您也可以巡覽至使用 http 配置的內容,後文會討論。

您可以在標記中以宣告方式設定 StartupUri ,如下列範例所示。

<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 ,屬性是使用可識別 HomePage.xaml 的相對套件 URI 來設定。 當 XBAP 啟動時,HomePage.xaml 會自動巡覽至並顯示。 下圖示范此範例顯示從網頁伺服器啟動的 XBAP。

XBAP page

注意

如需 XBAP 開發和部署的詳細資訊,請參閱 WPF XAML 瀏覽器應用程式概觀 部署 WPF 應用程式

設定主機視窗的標題、寬度和高度

您可能從上一個圖中注意到的一件事是,瀏覽器和索引標籤面板的標題都是 XBAP 的 URI。 除了長之外,標題既不吸引人,也不提供資訊。 基於這個理由, Page 您可以藉由設定 WindowTitle 屬性來變更標題。 此外,您可以分別設定 和 WindowHeight 來設定 WindowWidth 瀏覽器視窗的寬度和高度。

WindowTitleWindowWidthWindowHeight 可以在標記中以宣告方式設定,如下列範例所示。

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

其結果如下圖所示。

Window title, height, width

典型的 XBAP 包含數個頁面。 從一個頁面巡覽到另一個頁面的最簡單方式是使用 Hyperlink 。 您可以使用 專案,以宣告方式將 加入 HyperlinkPageHyperlink ,如下列標記所示。

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

元素 Hyperlink 需要下列專案:

  • 要巡覽至 的 Page 套件 URI,如 屬性所 NavigateUri 指定。

  • 使用者可以按一下以起始流覽的內容,例如文字和影像(如需元素可包含的內容 Hyperlink ,請參閱 Hyperlink )。

下圖顯示具有 PageHyperlink 的 XBAP。

Page with Hyperlink

如您所預期,按一下 Hyperlink 會導致 XBAP 巡覽至 Page 屬性所識別的 NavigateUri 。 此外,XBAP 會將前 Page 一個專案新增至 Internet Explorer 中的最近頁面清單。 如下圖所示。

Back and Forward buttons

以及支援從一個流覽到另一個 Page 導覽, Hyperlink 也支援片段流覽。

片段巡覽

片段導覽 是目前 Page 或另一個 Page 中內容片段的流覽。 在 WPF 中,內容片段是具名元素所包含的內容。 具名元素是具有其 Name 屬性集的專案。 下列標記顯示包含內容片段的具名 TextBlock 元素。

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

Hyperlink若要流覽至內容片段, NavigateUri 屬性必須包含下列內容:

  • 的 URI Page ,其中包含要巡覽至的內容片段。

  • "#" 字元。

  • 包含內容片段之 上的 Page 專案名稱。

片段 URI 的格式如下。

PageURI# <項目名稱>

以下顯示 設定為巡覽至內容片段的 範例 Hyperlink

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

注意

本節描述 WPF 中的預設片段導覽實作。 WPF 也可讓您實作自己的片段導覽配置,這部分需要處理 NavigationService.FragmentNavigation 事件。

重要

只有當頁面可以透過 HTTP 流覽時,才能流覽至鬆散 XAML 頁面中的片段(以標記的 XAML 檔案 Page 作為根項目)。

不過,鬆散的 XAML 頁面可以巡覽至自己的片段。

雖然 Hyperlink 允許使用者起始流覽至特定 Page ,但尋找和下載頁面的工作是由 NavigationService 類別執行。 基本上, NavigationService 可讓您代表用戶端程式代碼處理巡覽要求,例如 Hyperlink 。 此外, NavigationService 實作較高層級的支援,以追蹤及影響流覽要求。

Hyperlink按一下 時,WPF 會呼叫 NavigationService.Navigate ,在指定的套件 URI 中尋找並下載 Page 。 下載的 Page 會轉換成 物件的樹狀結構,其根物件是所下載 Page 的 實例。 根 Page 物件的參考會儲存在 屬性中 NavigationService.Content 。 巡覽至之內容的套件 URI 會儲存在 屬性中 NavigationService.Source ,而 NavigationService.CurrentSource 會儲存流覽至最後一個頁面的套件 URI。

注意

WPF 應用程式可能會有一個以上的目前使用 NavigationService 中 。 如需詳細資訊,請參閱本主題稍後的覽主機

以程式設計的巡覽及巡覽服務

您不需要知道 NavigationService 巡覽是否使用 以宣告方式在標記 Hyperlink 中實作,因為 Hyperlink 會代表您使用 NavigationService 。 這表示,只要 的直接或間接父 Hyperlink 代是流覽主機(請參閱 導覽主機 ), Hyperlink 就能夠尋找並使用流覽主機的導覽服務來處理流覽要求。

不過,在某些情況下,您需要直接使用 NavigationService ,包括下列專案:

  • 當您需要使用非無參數建構函式具現化 Page 時。

  • 當您需要先在 上 Page 設定屬性,再巡覽至它。

  • Page當需要巡覽至 的 時,只能在執行時間判斷。

在這些情況下,您必須撰寫程式碼,以程式設計方式藉由呼叫 Navigate 物件的 方法 NavigationService 起始導覽。 這需要取得 的 NavigationService 參考。

取得 NavigationService 的參考

基於流覽主機 一節中 涵蓋的原因,WPF 應用程式可以有多個 NavigationService 。 這表示您的程式碼需要尋找 NavigationService 的方法,通常是 NavigationService 巡覽至目前 Page 的 。 您可以藉由呼叫 方法來取得 的 NavigationServicestaticNavigationService.GetNavigationService 參考。 若要取得 NavigationService 巡覽至特定 Page 的 ,請將參考傳遞至 Page 做為 方法的 GetNavigationService 引數。 下列程式碼示範如何取得 NavigationService 目前 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)

作為尋找 NavigationService 的快捷方式, Page 會實作 NavigationServicePage 屬性。 下列範例會顯示這一點。

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

注意

Page只有在引發 Loaded 事件時 Page ,才能取得其 NavigationService 參考。

以程式設計方式巡覽至頁面物件

下列範例示範如何使用 NavigationService 以程式設計方式巡覽至 Page 。 需要以程式設計方式流覽,因為 Page 巡覽至 的 只能使用單一的非無參數建構函式來具現化。 Page具有非無參數建構函式的 會顯示在下列標記和程式碼中。

<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 的 ,會顯示在下列標記和程式碼中。

<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

Hyperlink按一下此 Page 上的 時,會藉由具現 Page 化 來使用非無參數建構函式並呼叫 NavigationService.Navigate 方法,來初始化巡覽至 。 Navigate 接受 將巡覽至的物件 NavigationService 參考,而不是套件 URI。

以程式設計的巡覽及 Pack URI

如果您需要以程式設計方式建構套件 URI(例如,當您只能在執行時間判斷套件 URI 時),您可以使用 NavigationService.Navigate 方法。 下列範例會顯示這一點。

<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

重新整理目前的頁面

Page如果套件 URI 與儲存在 屬性中的 NavigationService.Source 套件 URI 相同,則不會下載 。 若要強制 WPF 再次下載目前的頁面,您可以呼叫 NavigationService.Refresh 方法,如下列範例所示。

<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

如您所見,有多種方式可以初始化巡覽。 當導覽起始,且流覽正在進行時,您可以使用 所 NavigationService 實作的下列事件來追蹤及影響流覽:

  • Navigating. 要求新的巡覽時發生。 可用於取消巡覽。

  • NavigationProgress. 在下載期間定期發生以提供導覽進度資訊。

  • Navigated. 找到並下載頁面時發生。

  • NavigationStopped. 發生于巡覽停止時(藉由呼叫 StopLoading ),或在目前導覽進行時要求新的流覽時發生。

  • NavigationFailed. 在廵覽至要求的內容引發錯誤時發生。

  • LoadCompleted. 當載入並剖析巡覽到的內容,且開始轉譯時發生。

  • FragmentNavigation. 當內容片段巡覽開始時發生,狀況為︰

    • 立即發生,如果所需片段位在目前的內容中。

    • 載入來源內容之後,如果所需片段位在不同的內容中。

下圖顯示巡覽事件的引發順序。

Page navigation flow chart

一般而言, Page 並不關心這些事件。 應用程式更可能與它們有關,因此,類別也會引發 Application 這些事件:

每次 NavigationService 引發事件時,類別 Application 都會引發對應的事件。 FrameNavigationWindow 提供相同的事件來偵測其各自範圍內的流覽。

在某些情況下, Page 可能會對這些事件感興趣。 例如, Page 可能會處理 NavigationService.Navigating 事件,以判斷是否取消離開本身的流覽。 下列範例會顯示這一點。

<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 註冊處理常式,如上述範例所示,您也必須取消註冊事件處理常式。 如果您不這麼做,WPF 流覽如何使用日誌來記住 Page 流覽的方式,可能會有副作用。

以日誌記憶巡覽

WPF 會使用兩個堆疊來記住您已巡覽的頁面:返回堆疊和向前堆疊。 當您從目前的 Page 巡覽至新的 Page 或向前巡覽至現有的 Page 時,目前的 Page 會新增至 返回堆疊 。 當您從目前 Page 巡覽回上一 Page 個 時,目前的 Page 會新增至 正向堆疊 。 上一頁堆疊、下一頁堆疊和管理它們的功能,統稱為日誌。 後端堆疊和正向堆疊中的每個專案都是 類別的 JournalEntry 實例,並稱為 記錄項目

從概念上講,日誌的運作方式與 Internet Explorer 中的 [上一 頁] 和 [轉寄 ] 按鈕相同。 如下圖所示。

Back and Forward buttons

針對 Internet Explorer 所裝載的 XBAP,WPF 會將日誌整合到 Internet Explorer 的流覽 UI 中。 這可讓使用者使用 Internet Explorer 中的 [上一頁 ]、 [轉寄 ] 和 [最近頁] 按鈕,流覽 XBAP 中的頁面

重要

在 Internet Explorer 中,當使用者離開並返回 XBAP 時,只會在日誌中保留未保持運作之頁面的記錄項目。 如需讓頁面保持運作的相關討論,請參閱本主題稍後的網頁存留期和日誌

根據預設,Internet Explorer [最近頁面 ] 清單中出現的 Page 一個文字都是 的 Page URI。 在許多情況下,這對使用者都不是特別有意義。 幸運的是,您可以變更使用下列選項之一的文字︰

  1. 附加 JournalEntry.Name 的屬性值。

  2. Page.Title屬性值。

  3. 目前 Page.WindowTitlePage 屬性值和 URI。

  4. 目前 Page 的 URI。 (預設值)

選項列示順序符合尋找文字的優先順序。 例如,如果 JournalEntry.Name 已設定,則會忽略其他值。

下列範例會使用 Page.Title 屬性來變更為記錄項目顯示的文字。

<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 中的 [上一 頁]、 [轉寄 ] 和 [最近頁 ] 來巡覽日誌 ,但您也可以使用 WPF 提供的宣告式和程式設計機制來流覽日誌。 這樣做的其中一個原因是在您的頁面中提供自訂導覽 UI。

您可以使用 所 NavigationCommands 公開的導覽命令,以宣告方式新增日誌導覽支援。 下列範例示範如何使用 BrowseBack 導覽命令。

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

您可以使用類別的下列其中一個成員 NavigationService ,以程式設計方式巡覽日誌:

您也可以程式設計方式管理日誌,如本主題稍後的以巡覽記錄保留內容狀態所述。

網頁存留期和日誌

請考慮包含數個包含豐富內容的 XBAP,包括圖形、動畫和媒體。 這類頁面的磁碟使用量可能相當大,尤其是使用視訊和音訊媒體的時候。 鑒於已流覽到的日誌「記住」頁面,這類 XBAP 可能會快速耗用大量且明顯的記憶體。

基於這個理由,日誌的預設行為是將中繼資料儲存 Page 在每個記錄項目中,而不是物件的參考 Page 。 巡覽至記錄項目時,其 Page 中繼資料會用來建立指定 Page 之 的新實例。 因此,流覽的每個 Page 都有下圖所說明的存留期。

Page lifetime

雖然使用預設日誌行為可以節省記憶體耗用量,但可能會降低每頁轉譯效能;重新驗證 Page 可能會耗費大量時間,特別是如果它有很多內容。 如果您需要在日誌中保留實例,您可以利用兩種 Page 技術來執行此動作。 首先,您可以藉由呼叫 NavigationService.Navigate 方法,以程式設計方式巡覽至 Page 物件。

其次,您可以將 屬性設定為 ,以指定 WPF 保留日誌中的 實例 Page (預設值為 false )。 KeepAlivetrue 如下列範例所示,您可以在標記中以宣告方式設定 KeepAlive

<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 存留期與不是的存留期略有不同。 第一 Page 次保持運作的 會巡覽至 ,它會具現化,就像 Page 不保持運作的 。 不過,因為 的 Page 實例會保留在日誌中,所以只要它保留在日誌中,它就不會再次具現化。 因此,如果 Page 具有每次巡覽至 時 Page 需要呼叫的初始化邏輯,您應該將它從建構函式移至 事件的處理常式 Loaded 。 如下圖所示, Loaded 每次分別巡覽至 和 之間時 Page ,仍會引發 和 Unloaded 事件。

When the Loaded and Unloaded events are raised

Page當 未保持運作時,您不應該執行下列其中一項:

  • 儲存其參考或任何部分。

  • 使用它未實作的事件來登錄事件處理常式。

執行上述任一動作會建立參考,強制 Page 將 保留于記憶體中,即使它已從日誌中移除亦然。

一般而言,您應該偏好預設 Page 的行為不要保持 Page 運作。 不過,這有下一節要討論的隱含狀態。

以巡覽記錄保留內容狀態

Page如果 未保持運作,而且其具有從使用者收集資料的控制項,如果使用者離開並返回 Page ,資料會發生什麼情況? 從使用者體驗的觀點而言,使用者應該會希望看到他們先前所輸入的資料。 可惜的是,因為 的新實例 Page 是使用每個導覽建立的,因此會重新驗證收集資料的控制項,並遺失資料。

幸運的是,日誌支援在導覽之間 Page 記住資料,包括控制資料。 具體來說,每個 Page 的記錄項目都會做為相關聯 Page 狀態的暫存容器。 下列步驟概述在巡覽 時 Page 如何使用這項支援:

  1. 目前 Page 的專案會新增至日誌。

  2. 的狀態會與該頁面的 Page 記錄項目一起儲存,而該頁面會新增至返回堆疊。

  3. Page新的 會巡覽至 。

當頁面 Page 巡覽回使用日誌時,會執行下列步驟:

  1. 具現化後 Page 堆疊的 (最上層記錄項目) 。

  2. Page 使用 與 的 Page 記錄項目一起儲存的狀態來重新整理 。

  3. Page 巡覽回 。

在 上使用 Page 下列控制項時,WPF 會自動使用此支援:

Page如果 使用這些控制項,則會在導覽之間 Page 記住輸入的資料,如下圖所示的 [我的最愛色彩 ListBox ]。

Page with controls that remember state

Page如果 具有上述清單中以外的控制項,或狀態儲存在自訂物件中時,您必須撰寫程式碼,讓日誌在流覽時 Page 記住狀態。

如果您需要記住流覽中的 Page 小型狀態片段,您可以使用以中繼資料旗標設定的 FrameworkPropertyMetadata.Journal 相依性屬性(請參閱 DependencyProperty )。

如果您需要在導覽中記住的狀態 Page 包含多個資料片段,您可能會發現將狀態封裝在單一類別並實 IProvideCustomContentState 作 介面的程式碼較少。

如果您需要流覽單 Page 一 的各種狀態,而不需從 Page 本身巡覽,您可以使用 IProvideCustomContentStateNavigationService.AddBackEntry

Cookie

WPF 應用程式可儲存資料的另一種方式是使用 和 方法建立、更新和刪除 SetCookieGetCookie 的 Cookie。 您可以在 WPF 中建立的 Cookie 與其他類型的 Web 應用程式所使用的 Cookie 相同;Cookie 是應用程式在應用程式會話期間或跨應用程式會話儲存的任意資料片段。 Cookie 資料通常會採用下列格式的名稱/值組形式。

「名稱」=「值」

當資料傳遞至 SetCookie 時,以及 Uri 應該設定 Cookie 之位置的 ,就會在記憶體中建立 Cookie,而且只能在目前應用程式會話期間使用。 這種類型的 Cookie 稱為「工作階段 Cookie」

若要在應用程式工作階段之間儲存 Cookie,到期日必須使用下列格式新增至 Cookie。

「名稱」=「值」; expires=DAY, DD-MMM-YYYY HH:MM:SS GMT

到期日的 Cookie 會儲存在目前 Windows 安裝的暫存網際網路檔案資料夾中,直到 Cookie 到期為止。 此類 Cookie 稱為「永續性 Cookie」,因為它會一直存在應用程式工作階段之間。

您可以藉由呼叫 GetCookie 方法來擷取會話和持續性 Cookie,並傳遞 Uri 使用 SetCookie 方法設定 Cookie 的位置。

以下是 WPF 中支援 Cookie 的一些方式:

  • WPF 獨立應用程式和 XBAP 可以建立和管理 Cookie。

  • 您可以從瀏覽器存取 XBAP 所建立的 Cookie。

  • 來自相同網域的 XBAP 可以建立和共用 Cookie。

  • 來自相同網域的 XBAP 和 HTML 頁面可以建立和共用 Cookie。

  • 當 XBAP 和鬆散的 XAML 頁面提出 Web 要求時,會分派 Cookie。

  • 裝載于 IFRAMES 的最上層 XBAP 和 XBAP 都可以存取 Cookie。

  • WPF 中的 Cookie 支援與所有支援的瀏覽器相同。

  • 在 Internet Explorer 中,與 Cookie 相關的 P3P 原則受到 WPF 的遵守,特別是與第一方和協力廠商 XBAP 相關的原則。

結構化巡覽

如果您需要將資料從彼此 Page 傳遞,您可以將資料當做引數傳遞至 的非無參數建構函式 Page 。 請注意,如果您使用這項技術,則必須讓 保持 Page 運作;如果不是,下次流覽至 Page 時,WPF 會使用無參數建構函式重新實 Page 作 。

或者,您可以 Page 實作使用需要傳遞之資料所設定的屬性。 不過,當 需要將資料傳回巡覽至 Page 它的 時 Page ,事情就會變得棘手。 問題是,巡覽不支援原生 Page 支援在巡覽之後傳回 的機制。 基本上,巡覽不支援呼叫/傳回語意。 為了解決此問題,WPF 提供 PageFunction<T> 類別,可讓您用來確保 Page 以可預測且結構化的方式傳回 。 如需詳細資訊,請參閱結構化巡覽概觀

NavigationWindow 類別

至此,您已了解最可能用來建置有可巡覽內容之應用程式的巡覽服務範圍。 這些服務是在 XBAP 的內容中討論的,雖然這些服務不限於 XBAP。 新式作業系統和 Windows 應用程式會利用新式使用者的瀏覽器體驗,將瀏覽器樣式導覽併入獨立應用程式。 常見的範例包括:

  • 文字同義字︰巡覽文字選擇。

  • 檔案總管︰巡覽檔案和資料夾。

  • 精靈︰將複雜的工作細分成可往來巡覽的多個頁面。 例如,處理新增和移除 Windows 功能的 Windows 元件精靈。

若要將瀏覽器樣式導覽併入獨立應用程式,您可以使用 類別 NavigationWindowNavigationWindow 衍生自 Window ,並以 XBAP 所提供的相同流覽支援來擴充它。 您可以使用 NavigationWindow 作為獨立應用程式的主視窗,或做為對話方塊等次要視窗。

若要實 NavigationWindow 作 ,如同 WPF 中大部分最上層類別一樣, WindowPage 您可以使用標記和程式碼後置的組合。 下列範例會顯示這一點。

<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 代碼會在 開啟 時 NavigationWindow 自動巡覽至 Page (HomePage.xaml)。 NavigationWindow如果 是主要應用程式視窗,您可以使用 StartupUri 屬性來啟動它。 下列標記顯示此做法。

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

下圖顯示 NavigationWindow 作為獨立應用程式的主要視窗。

A main window

從圖中,您可以看到 NavigationWindow 具有標題,即使上述範例的實作程式碼中未設定 NavigationWindow 標題也一樣。 而是使用 WindowTitle 屬性來設定標題,如下列程式碼所示。

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

WindowWidth設定 和 WindowHeight 屬性也會影響 NavigationWindow

通常,當您需要自訂其行為或其外觀時,您會實作自己的 NavigationWindow 。 如果兩樣都不做,您可以使用捷徑。 如果您在獨立應用程式中將 的套件 URI Page 指定為 StartupUriApplication 則會自動建立 NavigationWindow 來裝載 Page 。 下列標記顯示如何啟用此功能。

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

如果您想要讓對話方塊之類的次要應用程式視窗成為 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();
' 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()

下圖顯示結果。

A dialog box

如您所見, NavigationWindow 顯示 Internet Explorer 樣式 的 [上 一頁] 和 [上一頁 ] 按鈕,讓使用者流覽日誌。 這些按鈕提供相同的使用者體驗,如下圖所示。

Back and Forward buttons in a NavigationWindow

如果您的頁面提供自己的日誌導覽支援和 UI,您可以將 屬性的值設定為 false 來隱藏 顯示的 NavigationWindow [上一頁 ] 和 [向前] 按鈕。 ShowsNavigationUI

或者,您可以使用 WPF 中的自訂支援來取代本身的 NavigationWindow UI。

Frame 類別

瀏覽器和 NavigationWindow 都是裝載可導覽內容的視窗。 在某些情況下,應用程式會有不需要由整個視窗裝載的內容。 這類內容反可以裝載於其他內容中。 您可以使用 類別,將可導覽的內容插入其他內容 FrameFrame 提供與 NavigationWindow 和 XBAP 相同的支援。

下列範例示範如何使用 專案,以宣告方式 Frame 將 加入 。 FramePage

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

這個標記會 Source 使用 套件 URI 設定 專案的 屬性 Frame ,而該套件 URI PageFrame 應該一開始巡覽至 。 下圖顯示 XBAP,其 Page 具有 Frame 在數個頁面之間巡覽的 。

A frame that has navigated between multiple pages

您不只需要在 Frame 的內容 Page 中使用 。 在 的內容 Window 內裝載 Frame 也是常見的。

根據預設, Frame 只有在沒有另一個日誌的情況下,才會使用自己的日誌。 Frame如果 是 裝載在 或 XBAP 內 NavigationWindow 的內容的一部分, Frame 請使用 屬於 或 XBAP 的 NavigationWindow 日誌。 不過,有時候, Frame 可能需要負責自己的期刊。 這樣做的其中一個原因是允許 在 裝載 Frame 的頁面內進行日誌流覽。 如下圖所示。

Frame and Page diagram

在此情況下,您可以將 FrameFrameOwnsJournal 屬性設定 JournalOwnership 為 使用自己的日誌。 下列標記顯示此做法。

<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 巡覽使用其本身日誌的效果。

A frame that uses its own journal

請注意,記錄項目會顯示在 中的 Frame 流覽 UI,而不是 Internet Explorer。

注意

Frame如果 是 裝載于 的內容的一 Window 部分, Frame 則會使用自己的日誌,因此,顯示自己的流覽 UI。

如果您的使用者體驗需要 Frame 提供自己的日誌而不顯示流覽 UI,您可以將 設定 NavigationUIVisibilityHidden 來隱藏流覽 UI。 下列標記顯示此做法。

<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 是稱為導覽主機的類別。 「巡覽裝載」是可以巡覽至並顯示內容的類別。 若要達成此目的,每個流覽主機都會使用自己的 NavigationService 和 日誌。 巡覽裝載的基本建構如下圖所示。

Navigator diagrams

基本上,這可讓 NavigationWindow XBAP Frame 在瀏覽器中裝載時提供相同的流覽支援。

除了使用 NavigationService 和 日誌,導覽主機會實作相同的成員 NavigationService 。 如下圖所示。

A journal in a Frame and in a NavigationWindow

這可讓您針對它們直接設計巡覽支援程式。 如果您需要提供裝載在 中 之 的自訂流覽 UI Frame ,您可以考慮這一 Window 點。 此外,這兩種類型都會實作額外的導覽相關成員,包括 BackStackNavigationWindow.BackStackFrame.BackStack ) 和 ForwardStackNavigationWindow.ForwardStackFrame.ForwardStack ),這可讓您分別列舉後端堆疊和正向堆疊中的記錄項目。

如前所述,應用程式中可有多個日誌。 下圖提供這種情況的範例。

Multiple journals within one application

在本主題中, Page XBAP 已用來示範 WPF 的各種導覽功能。 不過, Page 編譯成應用程式的 不是唯一可巡覽至的內容類型,而且套件 XBAP 並不是識別內容的唯一方式。

如本節所示,您也可以流覽至鬆散的 XAML 檔案、HTML 檔案和物件。

鬆散的 XAML 檔案是具有下列特性的檔案:

  • 只包含 XAML (也就是沒有程式碼)。

  • 具有適當的命名空間宣告。

  • 具有 .xaml 副檔名。

例如,請考慮儲存為鬆散 XAML 檔案 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>

當您按兩下檔案時,瀏覽器會開啟、巡覽至並顯示內容。 如下圖所示。

Display of the content in the Person.XAML file

您可以從下列內容顯示鬆散的 XAML 檔案:

  • 在本機電腦、內部網路或網際網路上的網站。

  • 通用命名慣例 (UNC) 檔案共用。

  • 本機磁碟。

鬆散的 XAML 檔案可以新增至瀏覽器的我的最愛,或是瀏覽器的首頁。

注意

如需發佈和啟動鬆散 XAML 頁面的詳細資訊,請參閱 部署 WPF 應用程式

鬆散 XAML 的其中一個限制是,您只能裝載在部分信任中安全執行的內容。 例如, Window 不能是鬆散 XAML 檔案的根項目。 如需詳細資訊,請參閱 WPF 部分信任安全性

如您所預期,您也可以流覽至 HTML。 您只需要提供使用 HTTP 配置的 URI。 例如,下列 XAML 會顯示 Frame 巡覽至 HTML 頁面的 。

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

流覽至 HTML 需要特殊許可權。 例如,您無法從在網際網路區域部分信任安全性沙箱中執行的 XBAP 巡覽。 如需詳細資訊,請參閱 WPF 部分信任安全性

控制項 WebBrowser 支援 HTML 檔案裝載、流覽和腳本/Managed 程式碼互通性。 如需控制項的詳細資訊 WebBrowser ,請參閱 WebBrowser

如同 Frame ,使用 WebBrowser 流覽至 HTML 需要特殊許可權。 例如,從部分信任應用程式,您只能巡覽至位於來源網站的 HTML。 如需詳細資訊,請參閱 WPF 部分信任安全性

如果您有儲存為自訂物件的資料,顯示該資料的方法之一是建立 Page ,其中包含系結至這些物件的內容(請參閱 資料系結概觀 )。 如果您不需要建立整個頁面此額外負荷,而只要顯示物件,則您可以改為直接巡覽至它們。

Person請考慮下列程式碼中實作的 類別。

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 方法,如下列程式碼所示。

<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

下圖顯示結果。

A page that navigates to a class

在此圖中,您看不到任何有用的內容。 事實上,所顯示的值是 Person 物件的 方法 ToString 回值;根據預設,這是 WPF 可用來代表物件的唯一值。 您可以覆寫 ToString 方法以傳回更有意義的資訊,不過它仍然只會是字串值。 您可以利用 WPF 的呈現功能來使用其中一種技術,就是使用資料範本。 您可以實作 WPF 可以與特定類型物件建立關聯的資料範本。 下列程式碼顯示 物件的資料範本 Person

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

在這裡,資料範本會使用 x:Type 屬性中的 DataType 標記延伸,與 Person 類型相關聯。 然後,資料範本會將 TextBlock 專案 (請參閱 TextBlock ) 系結至 類別的屬性 Person 。 下圖顯示 物件的更新外觀 Person

Navigating to a class that has a data template

這項技術的優點是可以取得一致性,因為能夠重複使用資料範本,所以應用程式任何位置都可顯示一致的物件。

如需資料範本的詳細資訊,請參閱資料範本化概觀

安全性

WPF 流覽支援可讓 XBAP 在網際網路上巡覽至 ,並允許應用程式裝載協力廠商內容。 為了保護應用程式和使用者免受有害行為的影響,WPF 提供安全性與 WPF 部分信任安全性 討論的各種安全性功能。

另請參閱