共用方式為


巡覽概觀

更新: 2008 年 7 月

Windows Presentation Foundation (WPF) 支援可用於兩種類型應用程式的瀏覽器樣式巡覽:獨立應用程式和 XAML 瀏覽器應用程式 (XBAP)。為了封裝巡覽內容,WPF 提供 Page 類別。您可以從一個 Page 以宣告方式巡覽到另一個,方法是使用 Hyperlink,或者是以程式設計方式使用 NavigationService。WPF 使用日誌以記住已經巡覽過而要回過頭巡覽的頁面。

PageHyperlinkNavigationService 和日誌形成 WPF 所提供巡覽支援的核心。本概觀會先詳細瀏覽這些功能後,才會涵蓋進階的巡覽支援,包括巡覽鬆散可延伸標記語言 (XAML) 檔案、HTML 檔案和物件。

注意事項:

本主題中的「瀏覽器」一詞僅代表可以裝載 WPF 應用程式的瀏覽器,目前包含 Internet Explorer 7、Microsoft Internet Explorer 6 和 Firefox 2.0+。當中特定的 WPF 功能僅會受到特定瀏覽器的支援,即所指出的瀏覽器版本。

這個主題包含下列章節。

  • 在 WPF 應用程式中巡覽
  • NavigationWindow 類別
  • Frame 類別
  • 巡覽裝載
  • 巡覽 XAML 頁面以外的內容
  • 安全性
  • 相關主題

在 WPF 應用程式中巡覽

本主題提供 WPF 中主要巡覽功能的概觀。這些功能都有提供給獨立應用程式和 XBAP,雖然本主題是在 XBAP 內容中展示這些功能。

注意事項:

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

本節說明和示範下列方面的巡覽:

  • 實作頁面

  • 設定起始頁

  • 設定裝載視窗的標題、寬度和高度

  • 超連結巡覽

  • 片段巡覽

  • 巡覽服務

  • 使用巡覽服務以程式設計方式進行巡覽

  • 巡覽存留期

  • 以日誌記住巡覽

  • 頁面存留期和日誌

  • 以巡覽記錄保留內容狀態

  • Cookie

  • 結構化巡覽

實作頁面

在 WPF 中,您可以巡覽數種內容類型,包括 .NET Framework 物件、自訂物件、列舉值、使用者控制項、XAML 檔案和 HTML 檔案。然而,您會發現最常用而方便的封裝內容方式是使用 Page。再者,Page 會實作巡覽專用的功能,以加強其外觀和簡化開發過程。

使用 Page,您可以宣告方式實作 XAML 內容的可巡覽頁面,方法是使用類似下列的標記:

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

在 XAML 標記中實作的 Page,是以 Page 做為根項目並需要 WPF XML 命名空間宣告。Page 項目包含您要巡覽並顯示的內容。您可以藉由設定 Page.Content 屬性項目以加入內容,如下列標記所示。

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

Page.Content 只可以包含一個子項目,在前述範例中的內容是單一字串 "Hello, Page!"。實際上,您常常會使用配置控制項做為子項目 (請參閱配置系統),以包含和撰寫內容。

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

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

在這個情況下,Page.Content 會使用 Page 項目的子項目自動設定。如需詳細資訊,請參閱 WPF 內容模型

僅含標記的 Page 對於顯示內容非常有用。然而,Page 也可以顯示讓使用者與頁面互動的控制項,並可以藉由處理事件和呼叫應用程式邏輯來回應使用者互動。互動式 Page 的實作方式是藉由使用標記和程式碼後置的結合,如下列範例所示。

若要讓標記檔案和程式碼後置的檔案一起運作,需要下列組態:

  • 標記中的 Page 項目必須包含 x:Class 屬性。建置應用程式時,標記檔案中若存在 x:Class 會造成 Microsoft Build Engine (MSBuild) 建立衍生自 Page 的 partial 類別,並具有 x:Class 屬性所指定的名稱。這需要加入 XAML 結構描述的 XML 命名空間宣告 (xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml")。產生的 partial 類別所實作的 InitializeComponent,是在註冊事件和設定標記所實作的屬性時呼叫的。

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

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

注意事項:

當您使用 Microsoft Visual Studio 在專案中加入新的 Page 時,Page 是同時使用標記和程式碼後置實作的,且包含必要的組態以建立標記和程式碼後置的檔案間的關聯 (如此處所述)。

只要您具有 Page,就可以巡覽該頁面。若要指定應用程式可以巡覽的第一個 Page,您需要設定起始 Page

設定起始頁

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

應用程式定義通常是同時使用標記和程式碼後置來實作的,其中標記檔案是設定做為 MSBuild ApplicationDefinition 項目。下列是 XBAP 的應用程式定義。

XBAP 可以使用其應用程式定義指定起始 Page,該頁面是在啟動 XBAP 時自動載入的 Page。藉由設定 StartupUri 屬性搭配所要 Page 的統一資源識別元 (URI),即可以達成這項作業。

注意事項:

在大多數情況下,Page 不是會編譯到應用程式中,就是會以應用程式部署。在這些情況下,用來識別 Page 的 URI 是一個封裝 URI,也就是符合「封裝」(Pack) 結構描述的 URI。在 Windows Presentation Foundation 中的 Pack URI 中會進一步討論封裝 URI。您也可以使用下面描述的 http 結構描述巡覽內容。

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

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

這個範例中的 StartupUri 屬性是使用用於識別 HomePage.xaml 的相對封裝 URI 來設定的。啟動 XBAP 時,會自動巡覽並顯示 HomePage.xaml。下圖可以示範這項作業,其中顯示的 XBAP 是從 Web 伺服器啟動的。

XBAP 網頁

注意事項:

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

設定裝載視窗的標題、寬度和高度

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

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

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

下圖顯示結果。

視窗標題、高度、寬度

超連結巡覽

一般的 XBAP 包含數個頁面。從某一頁面巡覽至另一頁面的最簡單方式是使用 Hyperlink。您可以宣告方式將 Hyperlink 加入到 Page 中,方法是使用 Hyperlink 項目,如下列標記所示。

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


...


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


...


</Page>

Hyperlink 項目需要下列:

  • 要巡覽的 Page 的封裝 URI,如 NavigateUri 屬性所指定。

  • 使用者用以啟始巡覽所按下的內容,例如文字和影像 (如需 Hyperlink 項目可以包含的內容,請參閱 Hyperlink)。

下圖顯示的 XBAP,其 Page 具有 Hyperlink

具有超連結的頁面

如您所預料的,按下 Hyperlink 會讓 XBAP 巡覽到由 NavigateUri 屬性所識別的 Page。此外,XBAP 會在 Internet Explorer 7 中的 [最近存取的頁面] 清單中,加入前述 Page 的項目。請參考下圖中的示範。

向後和向前按鈕

就像支援從某一個 Page 巡覽至另一個頁面一樣,Hyperlink 也支援片段巡覽。

片段巡覽

「片段巡覽」(Fragment Navigation) 是對目前 Page 或另一個 Page 中內容片段的巡覽。WPF 中的內容片段是具名項目所包含的內容。具名項目是設定有 Name 屬性的項目。下列標記顯示包含內容片段的具名 TextBlock 項目。

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


...


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


...


</Page>

為了讓 Hyperlink 巡覽內容片段,NavigateUri 屬性必須包含下列:

  • 具有要巡覽內容片段的 Page 的 URI。

  • "#" 字元。

  • 包含內容片段的 Page 上的項目名稱。

片段 URI 的格式如下。

PageURI#ElementName

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

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


...


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


...


</Page>

如需片段巡覽的完整範例,請參閱片段巡覽範例

注意事項:

本節描述 WPF 中的預設片段巡覽實作。WPF 也讓您可以實作自己的片段巡覽結構描述,該結構描述有部分需要處理 NavigationService.FragmentNavigation 事件。

重要事項:

只要鬆散 XAML 頁面 (以 Page 做為根項目的僅含標記 XAML 檔案) 可以透過 HTTP 瀏覽,您就可以巡覽該頁面中的片段。

然而,鬆散 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 是有可能的事。如需詳細資訊,請參閱本主題稍後的巡覽裝載。

使用巡覽服務以程式設計方式進行巡覽

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

然而,在有些情況下您需要直接使用 NavigationService,包括下列情況:

  • 當您需要使用非預設建構函式具現化 Page 時。

  • 當您在巡覽 Page 前需要先對其設定屬性。

  • 當要巡覽的 Page 只可以在執行階段決定時。

在這些情況下,您需要撰寫程式碼,藉由呼叫 NavigationService 物件的 Navigate 方法,以程式設計方式具現化巡覽。這需要取得 NavigationService 的參考。

取得 NavigationService 的參考

基於巡覽裝載一節中涵蓋的原因,WPF 應用程式可以具有一個以上的 NavigationService。這表示您的程式碼需要有找出 NavigationService 的方式,這通常是巡覽過目前 PageNavigationService。藉由呼叫 static NavigationService.GetNavigationService 方法,您可以取得 NavigationService 的參考。若要取得巡覽過特定 PageNavigationService,您要將 Page 的參考傳遞為 GetNavigationService 方法的引數。下列程式碼顯示如何取得目前 PageNavigationService

using System.Windows.Navigation; // NavigationServce


...


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

做為供 Page 尋找 NavigationService 的捷徑,Page 會實作 NavigationService 屬性。下列範例中會示範這個服務。

using System.Windows.Navigation; // NavigationServce


...


// Get a reference to the NavigationService that navigated to this Page
NavigationService ns = this.NavigationService;
注意事項:

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

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

下列範例顯示如何使用 NavigationService,以程式設計方式巡覽至 Page。因為要巡覽的 Page 只可以使用單一的非預設建構函式來具現化,所以使用程式設計方式巡覽是必要的。下列標記和程式碼顯示具有非預設建構函式的 Page

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

  <!-- Content goes here -->

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

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

            this.Content = message;
        }
    }
}

下列標記和程式碼顯示的 Page 會巡覽至具有非預設建構函式的 Page

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

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

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

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

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

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

在按下這個 Page 中的 Hyperlink 時,巡覽的起始方式,是藉由使用非預設建構函式具現化要巡覽的 Page,和呼叫 NavigationService.Navigate 方法而達成的。Navigate 會接受 NavigationService 將巡覽的物件的參考,而非封裝 URI。

使用 Pack URI 以程式設計方式進行巡覽

如果需要以程式設計方式建構封裝 URI (舉例來說,當只能在執行階段決定封裝 URI 時),可以使用 NavigationService.Navigate 方法。下列範例中會示範這個服務。

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

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

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

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

重新整理目前頁面

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

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

namespace SDKSample
{
    public partial class NSRefreshNavigationPage : Page
    {


...


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

巡覽存留期

如您所見,啟始巡覽有許多種方式。啟始巡覽後,若巡覽仍在進行中,您可以使用下列 NavigationService 所實作的事件,追蹤和影響巡覽:

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

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

  • Navigated。在已經找出並下載頁面時發生。

  • NavigationStopped。在停止巡覽時 (藉由呼叫 StopLoading) 時發生,或者是目前巡覽仍在進行中的同時有新的巡覽要求發生時。

  • NavigationFailed。在巡覽要求內容的情況下引發錯誤時發生。

  • LoadCompleted。在巡覽過的內容已經過載入和剖析,並開始轉譯時發生。

  • FragmentNavigation. 在開始巡覽內容片段時發生,發生的情況如下:

    • 如果所要片段在目前內容中,會立即發生。

    • 如果所要片段在其他內容中,會於載入來源內容後發生。

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

頁面巡覽流程圖

一般而言,Page 不會關注這些事件。而是應用程式比較傾向於關注這些事件,基於這個原因,這些事件也可以由 Application 類別所引發:

每當 NavigationService 引發事件時,Application 類別會引發對應的事件。FrameNavigationWindow 提供相同的事件以偵測其個別範圍內的巡覽。

在某些情況下,Page 可能會對這些事件有興趣。舉例來說,Page 可能會處理 NavigationService.Navigating 事件,以決定是否要取消本身以外的巡覽。下列範例中會示範這個服務。

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

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

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

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

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

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

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

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

如果使用 Page 的巡覽事件來註冊處理常式,如前述範例所進行的,則也必須移除註冊事件處理常式。如果沒有這麼做,在 WPF 巡覽如何使用日誌記住 Page 巡覽方面可能會有些副作用。

以日誌記住巡覽

WPF 使用兩個堆疊記住您巡覽過的頁面:上一頁堆疊和下一頁堆疊。當您從目前 Page 巡覽到新的 Page,或是前往現有的 Page 時,就會將目前的 Page 加入到「上一頁堆疊」(Back Stack)。當您從目前 Page 巡覽回先前的 Page 時,就會將目前的 Page 加入到「下一頁堆疊」(Forward Stack)。上一頁堆疊、下一頁堆疊和管理這兩個堆疊的功能,統稱為日誌。上一頁堆疊和下一頁堆疊中的每個項目都是 JournalEntry 類別的執行個體,稱為「日誌項目」(Journal Entry)。

從 Internet Explorer 7 巡覽日誌

在概念上來說,日誌運作的方式與 Internet Explorer 7 中的 [上一頁] 和 [下一頁] 按鈕運作方式相同。下圖中顯示這些項目。

向後和向前按鈕

對於由 Internet Explorer 7 所裝載的 XBAP,WPF 會將日誌整合到 Internet Explorer 7 的巡覽 UI 中。這樣可以讓使用者藉由使用 Internet Explorer 7 中的 [上一頁]、[下一頁] 和 [最近存取的頁面] 按鈕,巡覽 XBAP 中的頁面。在 Microsoft Internet Explorer 6 中,並沒有以與 Internet Explorer 7 相同的方式整合日誌。而是 WPF 會改為轉譯替代的巡覽 UI。

重要事項:

在 Internet Explorer 7 中,當使用者的巡覽動作是離開或回到 XBAP,只有不在作用中的頁面日誌項目會保留在日誌中。如需讓頁面保持作用中的討論,請參閱本主題稍後的頁面存留期和日誌。

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

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

  2. Page.Title 屬性值。

  3. Page.WindowTitle 屬性值和目前 Page 的 URI。

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

所列出選項的順序符合找出文字的優先順序。舉例來說,如果有設定 JournalEntry.Name,就會忽略其他值。

下列範例使用 Page.Title 屬性變更出現在日誌項目的文字。

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


...


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

namespace SDKSample
{
    public partial class PageWithTitle : Page
    {


...


    }
}

使用 WPF 巡覽日誌

雖然使用者可以藉由使用 Internet Explorer 7 中的 [上一頁]、[下一頁] 和 [最近存取的頁面] 巡覽日誌,您也可以使用 WPF 所提供的宣告式和程式設計機制來巡覽日誌。這樣做的一個原因是可以在頁面中提供自訂巡覽 UI。

藉由使用 NavigationCommands 所公開的巡覽命令,您可以宣告方式加入日誌巡覽支援。下列範例示範如何使用 BrowseBack 巡覽命令。

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


...


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


...


</Page>

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

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

頁面存留期和日誌

請考慮 XBAP 的許多頁面包含豐富型內容 (包含圖形、動畫和媒體) 的情況。這類內容經過一段時間的記憶體使用量應該十分龐大,特別是在使用視訊和音訊媒體時。由於日誌會記住巡覽過的頁面,這樣的 XBAP 會迅速耗用掉大量可觀的記憶體。

基於這個原因,日誌的預設行為是在每個日誌項目中存放 Page 中繼資料,而非存放 Page 物件的參考。當巡覽日誌項目時,其 Page 中繼資料是用於建立指定 Page 的新執行個體。因此,每個巡覽的 Page 的存留期可由下圖說明。

網頁存留期

雖然使用預設日誌行為可以節省記憶體的耗用量,然而針對每個頁面的轉譯效能則會降低,重新具現化 Page 可能會很耗時,特別是在有許多內容時。如果需要在日誌中保留 Page 執行個體,您可以引用兩種技巧來達成目的。首先,您可以藉由呼叫 NavigationService.Navigate 方法,以程式設計方式巡覽 Page 物件。

第二,藉由將 KeepAlive 屬性設定為 true (預設值是 false),您可以指定 WPF 在日誌中保留 Page 的執行個體。如下列範例所示,您可以宣告方式在標記中設定 KeepAlive

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

  An instance of this page is stored in the journal.

</Page>

保留作用中的 Page 存留期,與沒有保留作用中的存留期有些微的不同。第一次巡覽到保留作用中的 Page 時,它的具現化方式就如同沒有保留作用中的 Page 一樣。然而,因為 Page 的執行個體保留在日誌中,只要繼續保留於日誌內,就不會再次具現化。因此,如果 Page 需要在每次巡覽 Page 時呼叫初始化邏輯,就應該將其從建構函式移動到 Loaded 事件的處理常式。如下圖所示,在每次的巡覽進入或離開 Page 時,仍會對應引發 LoadedUnloaded 事件。

引發 Loaded 和 Unloaded 事件時

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 巡覽記住當中輸入的資料,如下圖中的 [Favorite Color] ListBox 所示範。

具有可記憶狀態之控制項的頁面

Page 具有前述清單以外的控制項時,或是當狀態是儲存在自訂物件中時,您需要撰寫程式碼讓日誌跨不同的 Page 巡覽記住狀態。

如果您需要跨不同 Page 巡覽記住小片段的狀態,您可以使用以 FrameworkPropertyMetadata.Journal 中繼資料旗標設定的相依性屬性 (請參閱 DependencyProperty)。如需範例,請參閱跨頁面執行個體記住單項狀態

如果 Page 需要跨不同巡覽記住的狀態,是由多個資料片段組成的,您會發現將狀態封裝到單一類別並實作 IProvideCustomContentState 介面,所要撰寫的程式碼會較為精簡 (請參閱跨頁面執行個體記住單組狀態)。

如果您需要巡覽單一 Page 的各種狀態,而不要巡覽 Page 本身,則可以使用 IProvideCustomContentStateNavigationService.AddBackEntry。(請參閱記住每個頁面執行個體的多組狀態)。

WPF 應用程式可以儲存資料的另一個方式是使用 Cookie,Cookie 是藉由使用 SetCookieGetCookie 方法建立、更新和刪除的。您在 WPF 中可以建立的 Cookie,與其他類型 Web 應用程式所使用的 Cookie 是相同的。Cookie 是用戶端電腦的應用程式在應用程式工作階段期間或跨應用程式工作階段時,所儲存的任意資料片段。Cookie 資料通常會採用下列格式的名稱 / 值配對組型式。

Name=Value

當傳遞資料給 SetCookie 時,會伴隨著應該要設定 Cookie 的位置 Uri,Cookie 是在記憶體中建立的,而且只適用於目前應用程式工作階段的持續期間。這類型的 Cookie 稱為「工作階段 Cookie」(Session Cookie)。

若要跨應用程式工作階段儲存 Cookie,必須使用下列格式在 Cookie 中加入到期日。

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

具有到期日的 Cookie 在過期前,是儲存在目前 Windows 安裝的 [Temporary Internet Files] 資料夾。這樣的 Cookie 稱為「持續性 Cookie」(Persistent Cookie),因為它會跨不同應用程式工作階段持續存在。

藉由呼叫 GetCookie 方法,並傳遞位置的 Uri (當中的 Cookie 是以 SetCookie 方法設定的),您可以擷取工作階段和持續性 Cookie。

注意事項:

如需示範如何使用 SetCookieGetCookie 方法建立和擷取 WPF 應用程式 Cookie 的範例,請參閱應用程式 Cookie 範例

下列是 WPF 中支援 Cookie 的部分方式:

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

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

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

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

  • Cookie 是在 XBAP 和鬆散 XAML 頁面提出 Web 要求時分派的。

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

  • 在所有支援的瀏覽器 (Internet Explorer 7、Microsoft Internet Explorer 6 和 Firefox 2.0+) 中,WPF 中的 Cookie 支援都是相同的。

  • 在 Microsoft Internet Explorer 6 和 Internet Explorer 7 中,有關 Cookie 的 P3P 原則是受到 WPF 承認的,特別是有關第一方或是協力廠商的 XBAP 方面。

結構化巡覽

如果需要從一個 Page 傳遞資料到另一個頁面,可以將資料當做引數傳遞給 Page 的非預設建構函式。請注意,在使用這個技巧時,必須讓 Page 保留作用中,如果沒有的話,下一次巡覽 Page 時,WPF 會使用預設建構函式重新具現化 Page

或者,Page 可以實作使用需要傳遞的資料設定的屬性。然而,當 Page 需要將資料傳遞回巡覽的來源 Page 時,事情就變的有些複雜。問題在於巡覽本身的支援機制,並不保證在巡覽 Page 後會返回該頁面。基本上,巡覽不支援呼叫 / 返回語意。為了解決這個問題,WPF 提供的 PageFunction<T> 類別可以用來確保 Page 的返回方式是可預測的結構化型式。如需詳細資訊,請參閱結構化巡覽概觀

目前為止,您已經見過巡覽服務的整個範圍,這些是您最可能用來建置具有可巡覽內容的應用程式的巡覽服務。雖然不侷限於 XBAP,但這些服務是針對 XBAP 的內容而討論的。現代的作業系統和 Windows 應用程式會利用現今使用者的瀏覽器經驗,將瀏覽器樣式的巡覽併入獨立應用程式。常見的範例包括:

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

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

  • 精靈:將複雜的工作細分到可以在其間巡覽的多個頁面。用於處理新增和移除 Windows 功能的 Windows 元件精靈,即是一個範例。

若要將瀏覽器樣式的巡覽併入您的獨立應用程式,您可以使用 NavigationWindow 類別。NavigationWindow 衍生自 Window,並會使用與 XBAP 所提供巡覽的相同支援擴充該類別。您可以使用 NavigationWindow 做為獨立應用程式的主視窗,或是做為對話方塊這類的次要視窗。

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

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

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

這個程式碼建立的 NavigationWindow 會在開啟 NavigationWindow 時自動巡覽到 Page (HomePage.xaml)。如果 NavigationWindow 是主應用程式視窗,您可以使用 StartupUri 屬性進行啟動。顯示在下列標記中。

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

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

主視窗

您可以從圖中看到 NavigationWindow 的標題,即使前述範例的 NavigationWindow 實作程式碼中並沒有設定該標題。而這個標題是改為使用 WindowTitle 屬性設定的,如下列程式碼所示。

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


...


</Page>

設定 WindowWidthWindowHeight 屬性也會影響 NavigationWindow

通常,當需要自訂 NavigationWindow 的行為或外觀時,您會實作自己的視窗。如果不需要自訂行為或外觀,則可以使用簡捷的方式。如果將 Page 的封裝 URI 指定做為獨立應用程式中的 StartupUriApplication 會自動建立 NavigationWindow 以裝載 Page。下列標記顯示如何做到這點。

<Application
    xmlns="https://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();

下圖顯示結果。

對話方塊

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

NavigationWindow 中的向後和向前按鈕

如果頁面提供自己的日誌巡覽支援和 UI,您可以隱藏 NavigationWindow 所顯示的 [上一頁] 和 [下一頁] 按鈕,方法是藉由將 ShowsNavigationUI 屬性值設定為 false。或者,您可以使用 WPF 中的自訂支援,取代 NavigationWindow 本身的 UI。如需如何進行這項作業的範例,請參閱自訂的 NavigationWindow 使用者介面範例

Frame 類別

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

下列範例顯示如何藉由使用 Frame 項目,將 Frame 以宣告方式加入 Page

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


...


<Frame Source="FramePage1.xaml" />


...


</Page>

這個標記會使用 Frame 一開始要巡覽的 Page 的封裝 URI,設定 Frame 項目的 Source 屬性。下圖顯示的 XBAP 具有 Page,其中包含的 Frame 已在數種頁面間巡覽過。

已在多個頁面之間巡覽過的框架

您不是只能夠在 Page 內容中使用 Frame。將 Frame 裝載在 Window 內容中也是很常見的。如需範例,請參閱視窗中框架巡覽範例

根據預設,Frame 在沒有其他日誌的情況下只會使用自己的日誌。如果 FrameNavigationWindow 或 XBAP 中裝載的部分內容,Frame 會使用屬於 NavigationWindow 或 XBAP 的日誌。雖然有時候,Frame 可能需要負責自己的日誌。這樣做的一個原因,是讓日誌可以在 Frame 裝載的頁面內巡覽。這可以由下圖說明。

框架和頁面圖表

在這個案例中,您可以設定 Frame 使用自己的日誌,方法是將 FrameJournalOwnership 屬性設定為 OwnsJournal。顯示在下列標記中。

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


...


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


...


</Page>

下圖說明在使用自己日誌的 Frame 內巡覽的作用方式。

使用本身之日誌的框架

請注意,日誌項目是由 Frame 中的巡覽 UI 顯示的,而非 Internet Explorer 7。

注意事項:

如果 Frame 是裝載在 Window 中內容的一部分,Frame 會使用自己的日誌,因而顯示自己的巡覽 UI。

如果您的使用者經驗需要 Frame 提供自己的日誌,而不用顯示巡覽 UI,您可以隱藏巡覽 UI,方法是將 NavigationUIVisibility 設定為 Hidden。顯示在下列標記中。

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


...


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


...


</Page>

巡覽裝載

FrameNavigationWindow 是稱為巡覽裝載的類別。「巡覽裝載」(Navigation Host) 是可以巡覽和顯示內容的類別。為了達成這點,每個巡覽裝載會使用自己的 NavigationService 和日誌。下圖顯示巡覽裝載的基本建構。

巡覽圖表

基本上,這樣可以讓 NavigationWindowFrame 提供的巡覽支援,與 XBAP 裝載於瀏覽器中時相同。

除了使用 NavigationService 和日誌外,巡覽裝載實作的成員與 NavigationService 實作的相同。這可以由下圖說明。

在框架和 NavigationWindow 中的日誌

這樣可以讓您直接針對它們設計巡覽支援的程式。如果您需要對裝載於 Window 中的 Frame 提供自訂巡覽 UI,就可以考慮這點。再者,這兩種類型都實作額外的巡覽相關成員,包括 BackStack (NavigationWindow.BackStackFrame.BackStack) 和 ForwardStack (NavigationWindow.ForwardStackFrame.ForwardStack),分別可以讓您列舉上一頁堆疊和下一頁堆疊的日誌項目。

如先前所述,應用程式內可以存在一個以上的日誌。下圖提供發生這個情況的時機的範例。

一個應用程式中包含多個日誌

巡覽 XAML 頁面以外的內容

本主題前前後後已經使用 Page 和封裝 XBAP,來示範 WPF 的各種巡覽功能。然而,編譯到應用程式中的 Page 並不是唯一可以巡覽的內容類型,而封裝 XBAP 也不是識別內容的唯一方式。

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

巡覽鬆散 XAML 檔案

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

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

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

  • 具有 .xaml 名稱副檔名。

舉例來說,請考慮下列儲存為鬆散 XAML 檔案 Person.xaml 的內容。

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

當您按兩下檔案時,瀏覽器會開啟並進行巡覽,以顯示內容。請參考下圖中的示範。

顯示 Person.XAML 檔案中的內容

您可以顯示下列位置的鬆散 XAML 檔案:

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

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

  • 本機磁碟。

鬆散 XAML 檔案可以加入到瀏覽器的我的最愛中,或是加入做為瀏覽器的首頁。

注意事項:

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

有關鬆散 XAML 方面的一個限制是,裝載的內容在部分信任下執行時必須是安全的。舉例來說,Window 不能是鬆散 XAML 檔案的根項目。如需詳細資訊,請參閱 Windows Presentation Foundation 部分信任安全性

使用框架巡覽 HTML 檔案

您可能會預期,您也可以巡覽 HTML。您只需要提供使用 http 結構描述的 URI 即可。舉例來說,下列 XAML 顯示的 Frame 會巡覽到 HTML 頁面。

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

巡覽 HTML 需要特殊權限。舉例來說,如果 XBAP 是執行於網際網路區域部分信任安全性沙箱中,您就不能進行巡覽。如需詳細資訊,請參閱 Windows Presentation Foundation 部分信任安全性

使用 WebBrowser 控制項巡覽 HTML 檔案

Frame 提供混合 XAML/HTML 的巡覽體驗,Frame 會支援在裝載的 HTML 頁面和 WPF 主應用程式之間的互通性。明確地說,沒有機制能讓 HTML 頁面實作的指令碼函式得以呼叫 WPF 主應用程式實作的 Managed 程式碼方法。同樣地,WPF 應用程式也沒有辦法呼叫裝載的 HTML 頁面中的指令碼函式。如果您需要這項功能,可以改為使用 WebBrowser 控制項。這個控制項支援 HTML 文件裝載、巡覽,當然還有指令碼和 Managed 程式碼間的互通性。如需 WebBrowser 控制項的詳細資訊,請參閱 WebBrowser。如需示範 WebBrowser 所支援功能範圍的範例,請參閱 WebBrowser 控制項範例

Frame 一樣,使用 WebBrowser 巡覽 HTML 需要特別的使用權限。例如,透過部分信任的應用程式,您只能巡覽至位於來源網站的 HTML。如需詳細資訊,請參閱 Windows Presentation Foundation 部分信任安全性

巡覽自訂物件

如果您的資料是儲存為自訂物件,顯示該資料的一個方式是建立 Page,而將其內容繫結到這些物件 (請參閱資料繫結概觀)。如果您不需要建立整個頁面,而只要顯示物件,則可以改為直接巡覽物件。

請參閱下列程式碼所實作的 Person 類別。

若要巡覽該類別,可以呼叫 NavigationWindow.Navigate 方法,如下列程式碼所示範。

下圖顯示結果。

巡覽至類別的頁面

從這張圖,您看不到任何有用的項目顯示出來。事實上,顯示的值是 [Person] 物件 ToString 方法的傳回值。根據預設,這是 WPF 可以用來表示物件的唯一值。您可以覆寫 ToString 方法以傳回更多有意義的資訊,雖然這仍然僅是一個字串值。您可以使用一個技巧來利用 WPF 的展示功能,就是使用資料樣板。您可以實作 WPF 可以用來與特定型別物件建立關聯的資料樣板。下列程式碼顯示 Person 物件的資料樣板。

這裡的資料樣板是藉由在 DataType 屬性中使用 x:Type 標記延伸,來與 Person 型別建立關聯。資料樣板接著會繫結 TextBlock 項目 (請參閱 TextBlock) 到 Person 類別的屬性。下圖顯示 Person 物件的更新外觀。

巡覽至具有資料範本的類別

這個技巧的優點在於,因為能夠重複使用資料樣板在應用程式的任何地方一致地顯示物件,而獲得的一致性。

如需完整範例,請參閱巡覽至自訂物件範例

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

安全性

WPF 巡覽支援可以跨網際網路巡覽 XBAP,進而讓應用程式裝載協力廠商內容。為了保護應用程式和使用者免於傷害性行為,WPF 提供各種安全性功能,相關討論位於 Windows Presentation Foundation 安全性Windows Presentation Foundation 部分信任安全性

請參閱

工作

跨頁面執行個體記住單組狀態

記住每個頁面執行個體的多組狀態

跨頁面執行個體記住單項狀態

精靈範例

自訂的 NavigationWindow 使用者介面範例

視窗中框架巡覽範例

應用程式 Cookie 範例

概念

應用程式管理概觀

Windows Presentation Foundation 中的 Pack URI

Windows Presentation Foundation Windows Media Center 所裝載的應用程式概觀

結構化巡覽概觀

部署 WPF 應用程式 (WPF)

參考

SetCookie

GetCookie

變更記錄

日期

記錄

原因

2008 年 7 月

加入使用 WebBrowser 控制項巡覽 HTML 檔案一節。

SP1 功能變更。