Přehled navigace

Windows Presentation Foundation (WPF) podporuje navigaci ve stylu prohlížeče, kterou lze použít ve dvou typech aplikací: samostatné aplikace a aplikace prohlížeče XAML (XBAPs). Chcete-li zabalit obsah pro navigaci, WPF poskytuje Page třídu. Můžete přejít z jednoho Page do druhého deklarativním pomocí nebo Hyperlinkprogramově pomocí .NavigationService WPF používá deník k zapamatovat stránky, ze kterých byly přecháděné, a k návratu k nim.

Page, Hyperlink, NavigationServicea deník tvoří jádro podpory navigace nabízené WPF. Tento přehled podrobně zkoumá tyto funkce před pokrytím rozšířené podpory navigace, která zahrnuje navigaci na volné soubory XAML (Extensible Application Markup Language), soubory HTML a objekty.

Poznámka:

V tomto tématu termín "prohlížeč" odkazuje pouze na prohlížeče, které mohou hostovat aplikace WPF, které aktuálně zahrnují Aplikaci Microsoft Internet Explorer a Firefox. Pokud jsou konkrétní funkce WPF podporovány pouze konkrétním prohlížečem, odkazuje se na verzi prohlížeče.

Toto téma obsahuje přehled klíčových možností navigace ve WPF. Tyto funkce jsou k dispozici pro samostatné aplikace i XBAPs, i když toto téma je prezentuje v kontextu XBAP.

Poznámka:

Toto téma se nezabírá, jak sestavit a nasadit XBAPs. Další informace o XBAPs naleznete v tématu WPF XAML Browser Applications Overview.

Tato část vysvětluje a ukazuje následující aspekty navigace:

Implementace stránky

Ve WPF můžete přejít na několik typů obsahu, mezi které patří objekty rozhraní .NET Framework, vlastní objekty, hodnoty výčtu, uživatelské ovládací prvky, soubory XAML a soubory HTML. Zjistíte ale, že nejběžnějším a pohodlným způsobem balení obsahu je použití Page. Kromě toho implementuje funkce specifické pro navigaci, Page které vylepšují jejich vzhled a zjednodušují vývoj.

Pomocí Page, můžete deklarativní implementovat navigaci na stránce obsahu XAML pomocí značek jako následující.

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

Kód Page , který je implementován v kódu XAML má Page jako jeho kořenový prvek a vyžaduje deklaraci oboru názvů WPF XML. Prvek Page obsahuje obsah, na který chcete přejít a zobrazit. Obsah přidáte nastavením elementu Page.Content vlastnosti, jak je znázorněno v následujícím kódu.

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

Page.Content může obsahovat pouze jeden podřízený prvek; v předchozím příkladu je obsah jedním řetězcem "Hello, Page!". V praxi obvykle jako podřízený prvek (viz Rozložení) použijete ovládací prvek rozložení, který bude obsahovat a vytvářet obsah.

Podřízené prvky Page prvku jsou považovány za obsah a Page v důsledku toho není nutné použít explicitní Page.Content deklaraci. Následující kód je deklarativní ekvivalent předchozí ukázky.

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

V tomto případě se Page.Content automaticky nastaví s podřízenými prvky Page prvku. Další informace naleznete v tématu WPF Content Model.

Revize jsou užitečné jenom Page pro zobrazení obsahu. Může ale také zobrazit ovládací prvky, které uživatelům umožňují interakci se stránkou, a může reagovat na interakci uživatele tím, Page že zpracovává události a volá logiku aplikace. Interaktivní Page se implementuje pomocí kombinace značek a kódu, jak je znázorněno v následujícím příkladu.

<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

K tomu, aby soubor se značkami a soubor s kódem fungovaly společně, je nutná následující konfigurace:

  • V souboru s XAML kódem musí element Page obsahovat atribut x:Class. Při sestavení aplikace, existence x:Class v souboru značek způsobí, že microsoft build engine (MSBuild) vytvoří partial třídu, která je odvozena a Page má název, který je určen atributem x:Class . To vyžaduje přidání deklarace oboru názvů XML pro schéma XAML ( xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ). Vygenerovaná partial třída implementuje InitializeComponent, který je volána k registraci událostí a nastavit vlastnosti, které jsou implementovány v kódu.

  • V kódu na pozadí musí být třída partial třídou se stejným názvem, který je uveden v atributu x:Class v XAML kódu, a musí být odvozena od třídy Page. To umožňuje, aby se soubor kódu za kódem přidružoval ke partial třídě, která je vygenerována pro soubor revizí při vytváření aplikace (viz Sestavení aplikace WPF).

  • V kódu na pozadí musí třída Page implementovat konstruktor, který volá metodu InitializeComponent. Metoda InitializeComponent je implementována třídou partial vygenerovanou ze souboru s XAML kódem pro registraci událostí a nastavení vlastností, které jsou definovány v souboru s XAML kódem.

Poznámka:

Když do projektu přidáte nový Page projekt pomocí sady Visual Studio, implementuje se Page pomocí značek i kódu a zahrnuje potřebnou konfiguraci pro vytvoření přidružení mezi soubory s kódem a kódem, jak je popsáno zde.

Jakmile ho Pagemáte, můžete na něj přejít. Pokud chcete určit první Page , na který aplikace přejde, musíte nakonfigurovat spuštění Page.

Konfigurace úvodní stránky

ProtokolY XBAPs vyžadují, aby byla v prohlížeči hostována určitá velikost aplikační infrastruktury. Ve WPF je třída součástí definice aplikace, Application která vytváří požadovanou infrastrukturu aplikace (viz Přehled správy aplikací).

Definice aplikace se obvykle implementuje pomocí značek i kódu, přičemž soubor revizí je nakonfigurovaný jako položka MSBuildApplicationDefinition . Následuje definice aplikace pro 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 může použít jeho definici aplikace k určení spuštění Page, což je Page to, že se automaticky načte při spuštění XBAP. Provedete to nastavením StartupUri vlastnosti s identifikátorem URI (Uniform Resource Identifier) požadovaného objektu Page.

Poznámka:

Ve většině případů se buď zkompiluje do aplikace, Page nebo se nasadí s aplikací. V těchto případech je identifikátor URI, který identifikuje Page identifikátor URI balíčku, což je identifikátor URI, který odpovídá schématu balíčku . Identifikátory URI balíčků jsou podrobněji popsány v identifikátorech URI balíčků ve WPF. Můžete také přejít na obsah pomocí schématu HTTP, které je popsáno níže.

Deklarativní kód můžete nastavit StartupUri v kódu, jak je znázorněno v následujícím příkladu.

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

V tomto příkladu StartupUri je atribut nastaven s relativním identifikátorem URI balíčku, který identifikuje HomePage.xaml. Při spuštění XBAP se homePage.xaml automaticky přejde na a zobrazí. To je znázorněno na následujícím obrázku, který ukazuje XBAP, který byl spuštěn z webového serveru.

XBAP page

Poznámka:

Další informace o vývoji a nasazení XBAPs naleznete v tématu WPF XAML Browser Applications Overview and Deploying a Deploying a WPF Application.

Konfigurace názvu, šířky a výšky okna hostitele

Na předchozím obrázku jste si možná všimli, že název prohlížeče i panelu karet je identifikátor URI pro XBAP. Kromě toho, že je dlouhý, název není atraktivní ani informativní. Z tohoto důvodu nabízí způsob, Page jak změnit název nastavením WindowTitle vlastnosti. Kromě toho můžete nakonfigurovat šířku a výšku okna prohlížeče nastavením WindowWidth a WindowHeightv uvedeném pořadí.

WindowTitle, WindowWidtha WindowHeight lze nastavit deklarativní v kódu, jak je znázorněno v následujícím příkladu.

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

Výsledek je znázorněn na následujícím obrázku.

Window title, height, width

Typický XBAP se skládá z několika stránek. Nejjednodušší způsob, jak přejít z jedné stránky na druhou, je použít Hyperlink. Můžete deklarativním způsobem přidat Hyperlink k objektu Page pomocí elementu Hyperlink , který je zobrazen v následujícím kódu.

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

Prvek Hyperlink vyžaduje následující:

  • Identifikátor URI Page balíčku, na který se má přejít, jak je určeno atributem NavigateUri .

  • Obsah, na který uživatel může kliknout, aby zahájil navigaci, například text a obrázky (pro obsah, který Hyperlink prvek může obsahovat, viz Hyperlink).

Následující obrázek znázorňuje XBAP s příponou PageHyperlink.

Page with Hyperlink

Jak byste očekávali, kliknutím na Hyperlink příčiny XBAP přejděte na Page atribut, který je identifikován atributem NavigateUri . Kromě toho XBAP přidá položku pro předchozí Page seznam posledních stránek v Internet Exploreru. To je znázorněno na následujícím obrázku.

Back and Forward buttons

Podporuje také navigaci mezi sebou Page a Hyperlink podporuje také navigaci fragmentů.

Navigace v fragmentu

Navigace fragmentem je navigace na fragment obsahu v aktuálním Page nebo jiném Page. Ve WPF je fragment obsahu obsah, který je obsažen pojmenovaným prvkem. Pojmenovaný element je prvek, který má jeho Name atribut nastaven. Následující kód ukazuje pojmenovaný TextBlock prvek, který obsahuje fragment obsahu.

<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 Aby bylo nutné přejít na fragment obsahu, NavigateUri musí atribut obsahovat následující:

  • Identifikátor URI fragmentu Page obsahu, na který chcete přejít.

  • Znak #.

  • Název elementu Page , který obsahuje fragment obsahu.

Identifikátor URI fragmentu má následující formát.

PageURI#– elementName

Následující příklad ukazuje příklad Hyperlink nakonfigurovaného pro přechod na fragment obsahu.

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

Poznámka:

Tato část popisuje výchozí implementaci navigace fragmentů ve WPF. WPF také umožňuje implementovat vlastní schéma navigace fragmentů, které částečně vyžaduje zpracování NavigationService.FragmentNavigation události.

Důležité

Můžete přejít na fragmenty na volných stránkách XAML (soubory XAML pouze s kódem Page s kořenovým elementem) pouze v případě, že stránky lze procházet přes PROTOKOL HTTP.

Uvolněná stránka XAML ale může přejít na vlastní fragmenty.

Zatímco Hyperlink umožňuje uživateli zahájit navigaci na konkrétní Page, práce vyhledání a stažení stránky provádí NavigationService třída. NavigationService V podstatě poskytuje možnost zpracovat navigační požadavek jménem klientského kódu, například Hyperlink. Kromě toho NavigationService implementuje podporu vyšší úrovně pro sledování a ovlivnění žádosti o navigaci.

Hyperlink Po kliknutí na volání NavigationService.Navigate WPF vyhledejte a stáhněte identifikátor Page URI zadaného balíčku. Stažený Page soubor je převeden na strom objektů, jejichž kořenovým objektem je instance staženého Pageobjektu . Odkaz na kořenový Page objekt je uložen ve NavigationService.Content vlastnosti. Identifikátor URI balíčku pro obsah, na který byl přešel, je uložen ve NavigationService.Source vlastnosti, zatímco NavigationService.CurrentSource ukládá identifikátor URI balíčku pro poslední stránku, na kterou byl přešel.

Poznámka:

Je možné, aby aplikace WPF měla více než jednu aktuálně aktivní NavigationService. Další informace naleznete v části Hostitelé navigace dále v tomto tématu.

Programová navigace pomocí navigační služby

Nemusíte vědět o NavigationService tom, jestli je navigace implementována deklarativním způsobem při použití Hyperlinkznaček, protože Hyperlink používá NavigationService za vás. To znamená, že pokud je buď přímým nebo nepřímým nadřazeným objektem Hyperlink hostitele navigace (viz Navigační hostitelé), Hyperlink bude moct najít navigační službu navigačního hostitele a použít ji ke zpracování žádosti o navigaci.

Existují však situace, kdy potřebujete použít NavigationService přímo, včetně následujících:

  • Pokud potřebujete vytvořit instanci Page pomocí neparametrového konstruktoru.

  • Když potřebujete nastavit vlastnosti před přechodem Page na ni.

  • Page Pokud je potřeba přejít na tuto možnost, je možné určit pouze v době běhu.

V těchto situacích musíte napsat kód, který programově inicializuje navigaci voláním Navigate metody objektu NavigationService . To vyžaduje získání odkazu na .NavigationService

Získání odkazu na navigationService

Z důvodů, které jsou popsány v části Hostitelé navigace, může mít aplikace WPF více než jeden NavigationService. To znamená, že váš kód potřebuje způsob, jak najít NavigationService, což je obvykle NavigationService ten, který přešel na aktuální Page. Odkaz na metodu NavigationService můžete získat voláním staticNavigationService.GetNavigationService metody. Chcete-li získat NavigationService , který přešel na konkrétní Page, předáte odkaz jako Page argument GetNavigationService metody. Následující kód ukazuje, jak získat NavigationService aktuální Pagekód .

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)

Jako zástupce pro vyhledání NavigationService vlastnosti Page, Page implementuje NavigationService vlastnost. To je ukázáno v následujícím příkladu.

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

Poznámka:

A Page může získat odkaz pouze na událost NavigationService při Page vyvolání Loaded události.

Programová navigace na objekt stránky

Následující příklad ukazuje, jak pomocí NavigationService kódu programu přejít na .Page Programová navigace je povinná, protože Page přecházená položka může být vytvořena pouze pomocí jediného konstruktoru bez parametrů. Konstruktor Page bez parametrů je zobrazen v následujícím kódu a kódu.

<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

Ten Page , který přejde na Page konstruktor bez parametrů, se zobrazí v následujícím kódu a kódu.

<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 Při kliknutí na tuto Page možnost je navigace inicializována vytvořením instance Page přechodu na pomocí neparametrového konstruktoru NavigationService.Navigate a volání metody. Navigate přijímá odkaz na objekt, na který NavigationService přejde místo identifikátoru URI balíčku.

Programová navigace s identifikátorem URI balíčku

Pokud potřebujete sestavit identifikátor URI balíčku prostřednictvím kódu programu (pokud můžete určit pouze identifikátor URI balíčku za běhu, například), můžete použít metodu NavigationService.Navigate . To je ukázáno v následujícím příkladu.

<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

Aktualizace aktuální stránky

A Page se nestáhnou, pokud má stejný identifikátor URI balíčku jako identifikátor URI balíčku, který je uložen ve NavigationService.Source vlastnosti. Chcete-li vynutit, aby WPF stáhnout aktuální stránku znovu, můžete volat metodu NavigationService.Refresh , jak je znázorněno v následujícím příkladu.

<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

Existuje mnoho způsobů, jak zahájit navigaci, jak jste viděli. Při zahájení navigace a v průběhu navigace můžete sledovat a ovlivnit navigaci pomocí následujících událostí, které jsou implementované NavigationService:

  • Navigating. Nastane, když je požadována nová navigace. Lze ji použít ke zrušení navigace.

  • NavigationProgress. Probíhá pravidelně během stahování a poskytuje informace o průběhu navigace.

  • Navigated. Nastane, když byla stránka umístěna a stažena.

  • NavigationStopped. Nastane, když je navigace zastavena (voláním StopLoading) nebo když probíhá nová navigace, zatímco probíhá aktuální navigace.

  • NavigationFailed. Nastane při vyvolání chyby při přechodu na požadovaný obsah.

  • LoadCompleted. Nastane, když se načte a parsuje obsah, na který byl přešel, a začne vykreslovat.

  • FragmentNavigation. Nastane při zahájení navigace na fragment obsahu, ke kterému dochází:

    • Okamžitě, pokud je požadovaný fragment v aktuálním obsahu.

    • Pokud je požadovaný fragment v jiném obsahu, po načtení zdrojového obsahu.

Navigační události jsou vyvolány v pořadí, které je znázorněno na následujícím obrázku.

Page navigation flow chart

Obecně platí, Page že se o tyto události nezajímá. Je pravděpodobnější, že se o ně aplikace zajímá a z tohoto důvodu jsou tyto události vyvolány Application také třídou:

Pokaždé, když NavigationService vyvolá událost, Application třída vyvolá odpovídající událost. Frame a NavigationWindow nabízejí stejné události pro detekci navigace v příslušných oborech.

V některých případech Page se může o tyto události zajímat. Událost může například zpracovatNavigationService.Navigating, aby se určilo, Page jestli se má zrušit navigace mimo sebe. To je ukázáno v následujícím příkladu.

<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

Pokud zaregistrujete obslužnou rutinu s navigační událostí z objektu Page, jako v předchozím příkladu, musíte také zrušit registraci obslužné rutiny události. Pokud ne, mohou existovat vedlejší účinky s ohledem na to, jak WPF navigace pamatuje Page navigaci pomocí deníku.

Zapamatování navigace pomocí deníku

WPF používá dva zásobníky k zapamatu stránek, ze kterých jste přešli: ze zadního zásobníku a dopředné zásobníku. Když přejdete z aktuální na nový nebo přepošli na existující Page, aktuální Page se přidá do back stacku.PagePage Když přejdete z aktuálního zpět Page na předchozí Page, aktuální Page se přidá do dopředu zásobníku. Back stack, forward stack a funkce pro jejich správu se souhrnně označují jako deník. Každá položka v zadním zásobníku a dopředný zásobník je instance JournalEntry třídy a označuje se jako položka deníku.

Deník funguje koncepčně stejně jako tlačítka Zpět a Vpřed v Internet Exploreru. Ty jsou znázorněny na následujícím obrázku.

Back and Forward buttons

Pro XBAPs, které jsou hostovány Internet Explorerem, WPF integruje deník do navigačního uživatelského rozhraní Internet Exploreru. Uživatelé tak můžou procházet stránky v XBAP pomocí tlačítek Zpět, Vpřed a Poslední stránky v Internet Exploreru.

Důležité

Když uživatel v Internet Exploreru přejde mimo a zpět na XBAP, zachovají se v deníku pouze položky deníku stránek, které nebyly zachovány naživu. Diskuzi o udržování stránek naživu naleznete v části Životnost stránky a Deník dále v tomto tématu.

Ve výchozím nastavení je text pro každýPage, který se zobrazí v seznamu posledních stránek aplikace Internet Explorer, identifikátor URI .Page V mnohapřípadechch Text můžete naštěstí změnit pomocí jedné z následujících možností:

  1. JournalEntry.Name Připojená hodnota atributu.

  2. Hodnota atributu Page.Title .

  3. Hodnota Page.WindowTitle atributu a identifikátor URI pro aktuální Page.

  4. Identifikátor URI pro aktuální Page. (Výchozí)

Pořadí, ve kterém jsou uvedené možnosti, odpovídá pořadí priorit pro vyhledání textu. Pokud JournalEntry.Name je například nastavena, ostatní hodnoty se ignorují.

Následující příklad používá Page.Title atribut ke změně textu, který se zobrazí pro položku deníku.

<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

I když uživatel může procházet deník pomocí back, forward a Recent Pages v Internet Exploreru, můžete také procházet deník pomocí deklarativních i programových mechanismů poskytovaných WPF. Jedním zdůvodůch

Podporu navigace deníku můžete deklarativním způsobem přidat pomocí navigačních příkazů vystavených uživatelem NavigationCommands. Následující příklad ukazuje, jak použít BrowseBack navigační příkaz.

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

Deník můžete procházet prostřednictvím kódu programu pomocí některého z následujících členů NavigationService třídy:

Deník lze také manipulovat programově, jak je popsáno v části Zachování stavu obsahu pomocí historie navigace dále v tomto tématu.

Životnost stránky a deník

Zvažte XBAP s několika stránkami, které obsahují bohatý obsah, včetně grafiky, animací a médií. Nároky na paměť pro stránky, jako jsou tyto, by mohly být poměrně velké, zejména pokud se používá video a zvukové médium. Vzhledem k tomu, že deník "pamatuje" stránky, na které byly přecháděny, takový XBAP by mohl rychle spotřebovat velké a znatelné množství paměti.

Z tohoto důvodu je výchozím chováním deníku ukládat Page metadata do každé položky deníku místo odkazu na Page objekt. Při přechodu na položku deníku se jeho Page metadata používají k vytvoření nové instance zadaného Pageobjektu . V důsledku toho má každý Page , který se prochází, životnost, která je znázorněna následujícím obrázkem.

Page lifetime

I když použití výchozího chování deníku může ušetřit spotřebu paměti, výkon vykreslování na stránce může být snížen; opětovné vytvoření Page může být časově náročné, zejména pokud má hodně obsahu. Pokud potřebujete zachovat Page instanci v deníku, můžete nakreslit dvě techniky, jak to udělat. Nejprve můžete programově přejít na Page objekt voláním NavigationService.Navigate metody.

Za druhé můžete určit, že WPF zachová instanci Page v deníku nastavením KeepAlive vlastnosti na true (výchozí hodnota je false). Jak je znázorněno v následujícím příkladu, můžete deklarativní KeepAlive nastavení v kódu.

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

Životní cyklus Page , který je udržován naživu, se liší od života, který není. Při prvním udržování naživu Page se vytvoří instance stejně jako Page ten, který není udržován naživu. Nicméně, protože instance je Page zachována v deníku, není nikdy vytvořena instance tak dlouho, dokud zůstane v deníku. Pokud tedy má logiku Page inicializace, která se musí volat při Page každém přechodu, měli byste ji přesunout z konstruktoru do obslužné rutiny Loaded události. Jak je znázorněno na následujícím obrázku, Loaded události jsou Unloaded stále vyvolány při Page každém přechodu na a z.

When the Loaded and Unloaded events are raised

Pokud není udržován naživu Page , neměli byste provádět jednu z následujících akcí:

  • Uložte na něj odkaz nebo na libovolnou jeho část.

  • Zaregistrujte obslužné rutiny událostí s událostmi, které nejsou implementovány.

Pomocí některé z těchto možností vytvoříte odkazy, které vynutí Page zachování v paměti i po jeho odebrání z deníku.

Obecně byste měli preferovat výchozí Page chování, které neudržuje Page aktivní. To má ale důsledky pro stav, které jsou popsány v další části.

Zachování stavu obsahu pomocí historie navigace

Pokud se neudrží naživu Page a má ovládací prvky, které shromažďují data od uživatele, co se stane s daty, když uživatel přejde mimo a zpět na Pageněj? Z pohledu uživatelského prostředí by měl uživatel očekávat, že uvidí data, která zadal dříve. Vzhledem k tomu, že se při každé navigaci vytvoří nová instance Page , ovládací prvky, které shromáždily data, se bohužel znovu vytvoří a data se ztratí.

Deník naštěstí poskytuje podporu pro zapamatování dat napříč Page navigacemi, včetně řídicích dat. Položka deníku pro každý z nich Page konkrétně funguje jako dočasný kontejner pro přidružený Page stav. Následující kroky popisují, jak se tato podpora používá při Page přechodu z:

  1. Do deníku se přidá položka pro aktuální Page .

  2. Stav je Page uložen se záznamem deníku pro danou stránku, který se přidá do zadního zásobníku.

  3. Page Nový se přechádí na.

Když se stránka Page vrátí zpět do deníku, provede se následující kroky:

  1. Vytvoří Page se instance (horní položka deníku na zadním zásobníku).

  2. Aktualizuje se Page stavem, který byl uložen s položkou deníku pro Pagepoložku .

  3. Vrátí Page se zpět.

WPF tuto podporu automaticky používá, pokud se na serveru používají Pagenásledující ovládací prvky:

Page Pokud se tyto ovládací prvky používají, data zadaná do nich se zapamatují napříč Page navigacemi, jak je znázorněno oblíbenou barvou ListBox na následujícím obrázku.

Page with controls that remember state

Page Pokud má ovládací prvky jiné než ty v předchozím seznamu nebo když je stav uložený ve vlastních objektech, musíte napsat kód, který způsobí, že deník bude pamatovat stav napříč Page navigacemi.

Pokud si potřebujete zapamatovat malé části stavu napříč Page navigacemi, můžete použít vlastnosti závislostí (viz) DependencyPropertynakonfigurované příznakem FrameworkPropertyMetadata.Journal metadat.

Pokud stav, který si vaše Page potřeby musí pamatovat napříč navigacemi, zahrnuje více částí dat, může být méně náročné na kód zapouzdření stavu v jedné třídě a implementaci IProvideCustomContentState rozhraní.

Pokud potřebujete procházet různé stavy jednoho Page, aniž byste museli přecházet ze Page samotného, můžete použít IProvideCustomContentState a NavigationService.AddBackEntry.

Soubory cookie

Dalším způsobem, jak mohou aplikace WPF ukládat data, jsou soubory cookie, které jsou vytvořeny, aktualizovány a odstraněny pomocí SetCookie a GetCookie metod. Soubory cookie, které můžete vytvořit ve WPF, jsou stejné jako jiné typy webových aplikací. soubory cookie jsou libovolné části dat, které jsou uloženy aplikací na klientském počítači buď během relací aplikace, nebo napříč relacemi aplikace. Data cookie obvykle mají formu páru název/hodnota v následujícím formátu.

Hodnota názvu=

Při předání SetCookiedat spolu s Uri umístěním, pro které má být soubor cookie nastaven, je soubor cookie vytvořen v paměti a je k dispozici pouze po dobu trvání aktuální relace aplikace. Tento typ souboru cookie se označuje jako soubor cookie relace.

Pokud chcete soubor cookie uložit mezi relacemi aplikace, musí být datum vypršení platnosti přidáno do souboru cookie pomocí následujícího formátu.

HODNOTA NÁZVU=; expires=DAY, DD-MMM-YYYY HH:MM:SS GMT

Soubor cookie s datem vypršení platnosti je uložen ve složce Dočasné soubory internetu v aktuální instalaci Systému Windows, dokud nevyprší platnost souboru cookie. Takový soubor cookie se označuje jako trvalý soubor cookie , protože se udržuje napříč relacemi aplikace.

Načtete relace i trvalé soubory cookie voláním GetCookie metody a předáte Uri umístění, kde byl soubor cookie nastaven metodou SetCookie .

Tady jsou některé způsoby, jak jsou soubory cookie podporovány ve WPF:

  • Samostatné aplikace WPF a XBAPs mohou vytvářet a spravovat soubory cookie.

  • K souborům cookie vytvořeným XBAP je možné přistupovat z prohlížeče.

  • XBAPs ze stejné domény mohou vytvářet a sdílet soubory cookie.

  • XBAPs a html stránky ze stejné domény mohou vytvářet a sdílet soubory cookie.

  • Soubory cookie se odesílají, když XBAPs a volné stránky XAML provádějí webové požadavky.

  • K souborům cookie mají přístup jak XBAPs nejvyšší úrovně, tak XBAPs hostované v IFRAMES.

  • Podpora souborů cookie ve WPF je stejná pro všechny podporované prohlížeče.

  • V Internet Exploreru jsou zásady P3P, které se týkají souborů cookie, dodrženy WPF, zejména s ohledem na XBAPs první strany a třetích stran.

Strukturovaná navigace

Pokud potřebujete předat data z jednoho Page do druhého, můžete je předat jako argumenty konstruktoru Pagebez parametrů . Všimněte si, že pokud používáte tuto techniku, musíte zachovat Page aktivní; pokud ne, při příštím přechodu na Page, WPF znovu vytvoří Page pomocí konstruktoru bez parametrů.

Alternativně Page můžete implementovat vlastnosti, které jsou nastaveny s daty, která je potřeba předat. Věci se ale můžou zkomplikovat, když Page je potřeba data předat zpět do Page té, která na ni přešla. Problémem je, že navigace nativně nepodporuje mechanismy pro záruku, že Page se vrátí po přechodu z něj. Navigace v podstatě nepodporuje sémantiku volání/návratu. Chcete-li tento problém vyřešit, WPF poskytuje PageFunction<T> třídu, kterou můžete použít k zajištění toho, aby Page se vrátila předvídatelným a strukturovaným způsobem. Další informace naleznete v tématu Přehled strukturované navigace.

The NavigationWindow – třída

K tomuto okamžiku jste viděli gamut navigačních služeb, které s největší pravděpodobností používáte k vytváření aplikací s pohybitelným obsahem. Tyto služby byly popsány v kontextu XBAPs, i když nejsou omezeny na XBAP. Moderní operační systémy a aplikace pro Windows využívají možnosti prohlížeče moderních uživatelů k začlenění navigace ve stylu prohlížeče do samostatných aplikací. K běžným příkladům patří:

  • Word Tesaurus: Navigace v možnostech slov

  • Průzkumník souborů: Procházení souborů a složek

  • Průvodci: Rozdělení složité úlohy na více stránek, mezi kterými je možné přecházet. Příkladem je Průvodce komponentami systému Windows, který zpracovává přidávání a odebírání funkcí systému Windows.

Pokud chcete do samostatných aplikací začlenit navigaci ve stylu prohlížeče, můžete použít NavigationWindow třídu. NavigationWindow se odvozuje a Window rozšiřuje o stejnou podporu pro navigaci, kterou poskytuje XBAPs. Můžete použít NavigationWindow buď hlavní okno samostatné aplikace, nebo jako sekundární okno, například dialogové okno.

K implementaci , NavigationWindowstejně jako u většiny tříd nejvyšší úrovně ve WPF (Window, Pagea tak dále), použijete kombinaci značek a kódu za sebou. To je ukázáno v následujícím příkladu.

<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

Tento kód vytvoří NavigationWindow automaticky přechod na Page soubor (HomePage.xaml) při NavigationWindow otevření. Pokud se jedná o NavigationWindow hlavní okno aplikace, můžete ho spustit pomocí atributu StartupUri . To je znázorněno v následujícím kódu.

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

Následující obrázek znázorňuje NavigationWindow hlavní okno samostatné aplikace.

A main window

Z obrázku vidíte, že NavigationWindow má název, i když nebyl nastaven v NavigationWindow kódu implementace z předchozího příkladu. Místo toho je název nastaven pomocí WindowTitle vlastnosti, která je zobrazena v následujícím kódu.

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

WindowWidth Nastavení a WindowHeight vlastnosti mají vliv také na NavigationWindowhodnotu .

Obvykle implementujete vlastní NavigationWindow , když potřebujete přizpůsobit jeho chování nebo jeho vzhled. Pokud ani jeden z nich neuděláte, můžete použít zástupce. Pokud zadáte identifikátor URI balíčku jako PageStartupUri v samostatné aplikaci, Application automaticky vytvoří NavigationWindow hostitele Page. Následující kód ukazuje, jak to povolit.

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

Pokud chcete, aby sekundární okno aplikace, například dialogové okno, bylo NavigationWindow, můžete ho otevřít pomocí kódu v následujícím příkladu.

// 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()

Výsledek si můžete prohlédnout na následujícím obrázku.

A dialog box

Jak vidíte, zobrazí tlačítka Zpět a Vpřed ve stylu Internet Exploreru, NavigationWindow která uživatelům umožňují procházet deník. Tato tlačítka poskytují stejné uživatelské prostředí, jak je znázorněno na následujícím obrázku.

Back and Forward buttons in a NavigationWindow

Pokud vaše stránky poskytují podporu a uživatelské rozhraní pro navigaci v deníku, můžete skrýt tlačítka Zpět a Vpřed zobrazená NavigationWindow nastavením hodnoty ShowsNavigationUI vlastnosti na false.

Případně můžete použít podporu přizpůsobení ve WPF k nahrazení uživatelského rozhraní samotného NavigationWindow rozhraní.

Třída Frame

Prohlížeč i NavigationWindow okna, která hostují obsah pro navigaci. V některých případech mají aplikace obsah, který nemusí být hostován celým oknem. Místo toho se takový obsah hostuje uvnitř jiného obsahu. Obsah s možností navigace můžete vložit do jiného Frame obsahu pomocí třídy. Frame poskytuje stejnou podporu jako NavigationWindow A XBAPs.

Následující příklad ukazuje, jak přidat Frame k deklarativním Page způsobem pomocí elementu Frame .

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

Tento kód nastaví Source atribut Frame elementu s identifikátorem URI balíčku, Page na který Frame by měl původně přejít. Následující obrázek znázorňuje XBAP s Page přecházením Frame mezi několika stránkami.

A frame that has navigated between multiple pages

Nemusíte používat Frame pouze uvnitř obsahu objektu Page. Je také běžné hostovat Frame uvnitř obsahu Window.

Ve výchozím nastavení Frame používá vlastní deník pouze v nepřítomnosti jiného deníku. Frame Pokud je součástí obsahu, který je hostovaný uvnitř nebo NavigationWindow v XBAP, použije deník, Frame který patří do NavigationWindow XBAP nebo XBAP. Někdy ale Frame může být potřeba, aby byla zodpovědná za svůj vlastní deník. Jedním z důvodů, proč to udělat, je povolit navigaci v deníku na stránkách, které jsou hostovány pomocí Frame. To je znázorněno na následujícím obrázku.

Frame and Page diagram

V takovém případě můžete nakonfigurovat Frame použití vlastního Frame deníku nastavením JournalOwnership vlastnosti na OwnsJournalhodnotu . To je znázorněno v následujícím kódu.

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

Následující obrázek znázorňuje účinek navigace v rámci Frame vlastního deníku.

A frame that uses its own journal

Všimněte si, že položky deníku jsou zobrazeny navigačním uživatelským rozhraním v nástroji Frame, nikoli Internet Explorerem.

Poznámka:

Frame Pokud je součástí obsahu hostovaného v Windowsouboru , Frame používá vlastní deník a v důsledku toho zobrazí vlastní navigační uživatelské rozhraní.

Pokud vaše uživatelské prostředí vyžaduje Frame , aby poskytovalo vlastní deník bez zobrazení navigačního uživatelského rozhraní, můžete navigační uživatelské rozhraní skrýt nastavením NavigationUIVisibility na Hiddenhodnotu . To je znázorněno v následujícím kódu.

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

Frame a NavigationWindow jsou třídy, které se označují jako hostitelé navigace. Navigační hostitel je třída, která může přejít na obsah a zobrazit ho. K tomu každý hostitel navigace používá vlastní NavigationService a deník. Základní konstrukce navigačního hostitele je znázorněna na následujícím obrázku.

Navigator diagrams

V podstatě to umožňuje NavigationWindow a Frame poskytovat stejnou podporu navigace, kterou XBAP poskytuje, když je hostovaný v prohlížeči.

Kromě použití NavigationService a deníku navigace hostitelé implementují stejné členy, které NavigationService implementuje. To je znázorněno na následujícím obrázku.

A journal in a Frame and in a NavigationWindow

To vám umožní programovat podporu navigace přímo proti nim. Můžete to zvážit, pokud potřebujete poskytnout vlastní navigační uživatelské rozhraní pro hostovaný Frame v Windowsouboru . Oba typy navíc implementují další členy související s navigacemi, včetně BackStack (NavigationWindow.BackStack, Frame.BackStack) a ForwardStack (NavigationWindow.ForwardStack, Frame.ForwardStack), které umožňují vytvořit výčet položek deníku v zadním zásobníku a dopředné zásobníku.

Jak už bylo zmíněno dříve, v aplikaci může existovat více než jeden deník. Následující obrázek obsahuje příklad toho, kdy k tomu může dojít.

Multiple journals within one application

V tomto tématu Page jsme použili balíčky XBAPs k předvedení různých možností navigace WPF. Kompilovaný Page do aplikace ale není jediným typem obsahu, na který lze přejít, a balíčky XBAPs nejsou jediným způsobem, jak identifikovat obsah.

Jak ukazuje tato část, můžete také přejít na volné soubory XAML, soubory HTML a objekty.

Volný soubor XAML je soubor s následujícími vlastnostmi:

  • Obsahuje pouze XAML (to znamená žádný kód).

  • Má odpovídající deklaraci oboru názvů.

  • Má příponu názvu souboru .xaml.

Představte si například následující obsah, který je uložený jako volný soubor 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>

Když dvakrát kliknete na soubor, prohlížeč se otevře a přejde na obsah a zobrazí ho. To je znázorněno na následujícím obrázku.

Display of the content in the Person.XAML file

Volný soubor XAML můžete zobrazit z následujících možností:

  • Web na místním počítači, intranetu nebo internetu.

  • Sdílená složka UNC (Universal Naming Convention).

  • Místní disk.

Do oblíbených položek prohlížeče můžete přidat volný soubor XAML nebo domovskou stránku prohlížeče.

Poznámka:

Další informace o publikování a spuštění volných stránek XAML naleznete v tématu Nasazení aplikace WPF.

Jedním z omezení s ohledem na volný KÓD XAML je, že můžete hostovat pouze obsah, který je bezpečný ke spuštění v částečném vztahu důvěryhodnosti. Window Například nemůže být kořenovým prvkem volného souboru XAML. Další informace najdete v tématu Zabezpečení částečné důvěryhodnosti WPF.

Jak můžete očekávat, můžete také přejít do HTML. Stačí zadat identifikátor URI, který používá schéma HTTP. Například následující XAML ukazuje Frame , že přejde na stránku HTML.

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

Přechod na HTML vyžaduje zvláštní oprávnění. Nemůžete například přecházet z XBAP, který běží v izolovaném prostoru zabezpečení zóny Internetu. Další informace najdete v tématu Zabezpečení částečné důvěryhodnosti WPF.

Ovládací WebBrowser prvek podporuje hostování dokumentů HTML, navigaci a interoperabilitu kódu nebo spravovaného kódu. Podrobné informace o ovládacím WebBrowser prvku naleznete v tématu WebBrowser.

Podobně jako Framenavigace do HTML vyžaduje WebBrowser zvláštní oprávnění. Například z aplikace s částečnou důvěryhodností můžete přejít pouze na HTML umístěný v lokalitě původu. Další informace najdete v tématu Zabezpečení částečné důvěryhodnosti WPF.

Pokud máte data uložená jako vlastní objekty, jedním ze způsobů, jak tato data zobrazit, je vytvořit Page s obsahem, který je s těmito objekty svázán (viz Přehled datových vazeb). Pokud k zobrazení objektů nepotřebujete režijní náklady na vytvoření celé stránky, můžete na ně přejít přímo.

Vezměte v Person úvahu třídu, která je implementována v následujícím kódu.

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

K němu přejdete tak, že zavoláte metodu NavigationWindow.Navigate , jak ukazuje následující kód.

<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

Výsledek si můžete prohlédnout na následujícím obrázku.

A page that navigates to a class

Z tohoto obrázku vidíte, že se nezobrazuje nic užitečného. Ve skutečnosti je zobrazená hodnota návratová hodnota ToString metody objektu Person ; ve výchozím nastavení je to jediná hodnota, kterou WPF může použít k reprezentaci objektu. Metodu ToString můžete přepsat tak, aby vracela smysluplnější informace, i když bude stále jen řetězcovou hodnotou. Jednou z technik, kterou můžete použít, která využívá možnosti prezentace WPF, je použití datové šablony. Můžete implementovat datovou šablonu, kterou WPF může přidružit k objektu určitého typu. Následující kód ukazuje datovou šablonu objektu 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>

V této části je šablona dat přidružena k Person typu pomocí x:Type rozšíření značek v atributu DataType . Šablona dat pak sváže TextBlock prvky (viz TextBlock) s vlastnostmi Person třídy. Následující obrázek znázorňuje aktualizovaný vzhled objektu Person .

Navigating to a class that has a data template

Výhodou této techniky je konzistence, kterou získáte tím, že budete moct opakovaně používat šablonu dat k zobrazení objektů konzistentně kdekoli v aplikaci.

Další informace o šablonách dat najdete v tématu Přehled šablon dat.

Zabezpečení

Podpora navigace WPF umožňuje přecházet přes internet na XBAPs a umožňuje aplikacím hostovat obsah třetích stran. K ochraně aplikací i uživatelů před škodlivým chováním poskytuje WPF řadu funkcí zabezpečení, které jsou popsány v zabezpečení a částečné důvěryhodnosti WPF.

Viz také