Přehled strukturované navigace

Obsah, který může hostovat aplikace prohlížeče XAML (XBAP), Framenebo se NavigationWindow skládá ze stránek, které lze identifikovat pomocí identifikátorů URI balíčku a přejít na hypertextové odkazy. Struktura stránek a způsobů, kterými se dají procházet, jak jsou definovány hypertextovými odkazy, se označuje jako navigační topologie. Taková topologie vyhovuje nejrůznějším typům aplikací, zejména těm, které procházejí dokumenty. U takových aplikací může uživatel přecházet z jedné stránky na jinou stránku, aniž by o druhé stránce nemusel vědět něco o druhé.

Jiné typy aplikací ale mají stránky, které potřebují vědět, kdy se mezi nimi přechází. Představte si například aplikaci pro lidské zdroje, která má jednu stránku pro výpis všech zaměstnanců v organizaci – stránku Seznam zaměstnanců. Tato stránka by také mohla uživatelům umožnit přidat nového zaměstnance kliknutím na hypertextový odkaz. Po kliknutí přejde stránka na stránku Přidat zaměstnance, aby se shromáždily podrobnosti nového zaměstnance a vrátily se na stránku Seznam zaměstnanců, aby se vytvořil nový zaměstnanec a aktualizoval se seznam. Tento styl navigace se podobá volání metody pro zpracování a vrácení hodnoty, která se označuje jako strukturované programování. Tento styl navigace se označuje jako strukturovaná navigace.

Třída Page neimplementuje podporu strukturované navigace. Místo toho třída PageFunction<T> je odvozena a Page rozšiřuje ji o základní konstrukce vyžadované pro strukturovanou navigaci. Toto téma ukazuje, jak vytvořit strukturovanou navigaci pomocí PageFunction<T>.

Strukturovaná navigace

Když jedna stránka volá jinou stránku ve strukturované navigaci, vyžadují se některá nebo všechna následující chování:

  • Volající stránka přejde na volanou stránku a volitelně předává parametry vyžadované pojmenovanou stránkou.

  • Volaná stránka, když uživatel dokončil pomocí volající stránky, se vrátí konkrétně na volající stránku, volitelně:

    • Vrácení informací o stavu, které popisují, jak byla volající stránka dokončena (například jestli uživatel stiskl tlačítko OK nebo tlačítko Storno).

    • Vrácení dat shromážděných od uživatele (například podrobnosti o novém zaměstnanci)

  • Když se volající stránka vrátí na volanou stránku, z historie navigace se odebere z historie navigace, aby se izolovala jedna instance volané stránky od jiné.

Toto chování je znázorněno na následujícím obrázku:

Screenshot shows the flow between calling page and called page.

Toto chování můžete implementovat pomocí označované PageFunction<T> stránky.

Strukturovaná navigace pomocí PageFunction

Toto téma ukazuje, jak implementovat základní mechaniku strukturované navigace zahrnující jeden PageFunction<T>. V této ukázce Page volá hodnotu PageFunction<T> , která získá String hodnotu od uživatele a vrátí ji.

Vytvoření volající stránky

Stránka, která volá, PageFunction<T> může být buď a Page nebo PageFunction<T>. V tomto příkladu je to , Pagejak je znázorněno v následujícím kódu.

<Page 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="StructuredNavigationSample.CallingPage"
    WindowTitle="Calling Page" 
    WindowWidth="250" WindowHeight="150">
</Page>
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;

namespace StructuredNavigationSample
{
    public partial class CallingPage : Page
    {
        public CallingPage()
        {
            InitializeComponent();
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Navigation

Namespace StructuredNavigationSample

Public Class CallingPage
    Inherits Page
    Public Sub New()
        Me.InitializeComponent()
}
End Sub
    }
}
End Class

End Namespace

Vytvoření funkce stránky pro volání

Vzhledem k tomu, že volající stránka může použít volanou stránku ke shromažďování a vracení dat od uživatele, je implementována jako obecná třída, PageFunction<T> jejíž typ argumentu určuje typ hodnoty, kterou volá stránka vrátí. Následující kód ukazuje počáteční implementaci volané stránky pomocí PageFunction<T>, která vrací String.

<PageFunction
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sys="clr-namespace:System;assembly=mscorlib" 
    x:Class="StructuredNavigationSample.CalledPageFunction"
    x:TypeArguments="sys:String"
    Title="Page Function" 
    WindowWidth="250" WindowHeight="150">

  <Grid Margin="10">

    <Grid.ColumnDefinitions>
      <ColumnDefinition Width="Auto" />
      <ColumnDefinition />
    </Grid.ColumnDefinitions>
    <Grid.RowDefinitions>
      <RowDefinition Height="Auto" />
      <RowDefinition />
    </Grid.RowDefinitions>

    <!-- Data -->
    <Label Grid.Column="0" Grid.Row="0">DataItem1:</Label>
    <TextBox Grid.Column="1" Grid.Row="0" Name="dataItem1TextBox"></TextBox>

    <!-- Accept/Cancel buttons -->
    <TextBlock Grid.Column="1" Grid.Row="1" HorizontalAlignment="Right">
      <Button Name="okButton" IsDefault="True" MinWidth="50">OK</Button>
      <Button Name="cancelButton" IsCancel="True" MinWidth="50">Cancel</Button>
    </TextBlock>

  </Grid>

</PageFunction>
using System;
using System.Windows;
using System.Windows.Navigation;

namespace StructuredNavigationSample
{
    public partial class CalledPageFunction : PageFunction<String>
    {
        public CalledPageFunction()
        {
            InitializeComponent();
        }
Imports System.Windows
Imports System.Windows.Navigation

Namespace StructuredNavigationSample

Public Class CalledPageFunction
    Inherits PageFunction(Of String)
    Public Sub New()
        Me.InitializeComponent()
    End Sub
    }
}
End Class

End Namespace

Deklarace typu PageFunction<T> je podobná deklaraci deklarace Page s přidáním argumentů typu. Jak je vidět v příkladu kódu, argumenty typu jsou zadány v kódu XAML, pomocí atributu x:TypeArguments a kódu na pozadí pomocí standardní syntaxe argumentu obecného typu.

Jako argumenty typu nemusíte používat pouze třídy rozhraní .NET Framework. Je PageFunction<T> možné volat, aby se shromáždila data specifická pro doménu, která jsou abstrahována jako vlastní typ. Následující kód ukazuje, jak použít vlastní typ jako argument typu pro .PageFunction<T>

namespace SDKSample
{
    public class CustomType
    {
Public Class CustomType
    }
}
End Class
<PageFunction
    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.CustomTypePageFunction"
    x:TypeArguments="local:CustomType">
</PageFunction>
using System.Windows.Navigation;

namespace SDKSample
{
    public partial class CustomTypePageFunction : PageFunction<CustomType>
    {
Partial Public Class CustomTypePageFunction
    Inherits System.Windows.Navigation.PageFunction(Of CustomType)
    }
}
End Class

Argumenty typu pro PageFunction<T> poskytnutí základu pro komunikaci mezi volající stránkou a pojmenovanou stránkou, které jsou popsány v následujících částech.

Jak vidíte, typ, který je identifikován s deklarací role PageFunction<T> hraje důležitou roli při vracení dat z PageFunction<T> volající stránky.

Volání pageFunction a předávání parametrů

Pokud chcete zavolat stránku, musí volající stránka vytvořit instanci volané stránky a přejít na ni pomocí Navigate metody. To umožňuje volající stránce předávat počáteční data na volané stránce, například výchozí hodnoty pro data shromážděná na volané stránce.

Následující kód ukazuje volanou stránku s konstruktorem bez parametrů, který přijímá parametry z volající stránky.

using System;
using System.Windows;
using System.Windows.Navigation;

namespace StructuredNavigationSample
{
    public partial class CalledPageFunction : PageFunction<String>
    {
Imports System.Windows
Imports System.Windows.Navigation

Namespace StructuredNavigationSample

Public Class CalledPageFunction
    Inherits PageFunction(Of String)
public CalledPageFunction(string initialDataItem1Value)
{
    InitializeComponent();

Public Sub New(ByVal initialDataItem1Value As String)
    Me.InitializeComponent()
    // Set initial value
    this.dataItem1TextBox.Text = initialDataItem1Value;
}
    ' Set initial value
    Me.dataItem1TextBox.Text = initialDataItem1Value
End Sub
    }
}
End Class

End Namespace

Následující kód ukazuje volající stránku zpracovávající Click událost Hyperlink vytvoření instance volané stránky a předání počáteční řetězcové hodnoty.

<Hyperlink Name="pageFunctionHyperlink">Call Page Function</Hyperlink>
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;

namespace StructuredNavigationSample
{
    public partial class CallingPage : Page
    {
        public CallingPage()
        {
            InitializeComponent();
            this.pageFunctionHyperlink.Click += new RoutedEventHandler(pageFunctionHyperlink_Click);
        }
        void pageFunctionHyperlink_Click(object sender, RoutedEventArgs e)
        {

            // Instantiate and navigate to page function
            CalledPageFunction CalledPageFunction = new CalledPageFunction("Initial Data Item Value");
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Navigation

Namespace StructuredNavigationSample

Public Class CallingPage
    Inherits Page
    Public Sub New()
        Me.InitializeComponent()
        AddHandler Me.pageFunctionHyperlink.Click, New RoutedEventHandler(AddressOf Me.pageFunctionHyperlink_Click)
    End Sub
    Private Sub pageFunctionHyperlink_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
}
End Sub
    }
}
End Class

End Namespace

Není nutné předávat parametry na volanou stránku. Místo toho můžete udělat toto:

Jak ale uvidíte krátce, budete stále potřebovat kód k vytvoření instance a přechod na volanou stránku, kde budete shromažďovat data vrácená volanou stránkou. Z tohoto důvodu je potřeba udržovat PageFunction<T> aktivní; jinak při příštím přechodu na PageFunction<T>instanci WPF vytvoří instanci PageFunction<T> pomocí konstruktoru bez parametrů.

Před vrácením volané stránky ale musí vracet data, která lze načíst volající stránkou.

Vrácení výsledků úkolů a dat úkolu z úkolu na volající stránku

Jakmile uživatel dokončí používání pojmenované stránky, podepíše se v tomto příkladu stisknutím tlačítek OK nebo Storno, musí se volaná stránka vrátit. Vzhledem k tomu, že volající stránka používala volanou stránku ke shromažďování dat od uživatele, volající stránka vyžaduje dva typy informací:

  1. Určuje, jestli uživatel zrušil volanou stránku (stisknutím tlačítka OK nebo tlačítka Storno v tomto příkladu). To umožňuje volající stránce určit, jestli se mají zpracovávat data, která volající stránka shromáždila od uživatele.

  2. Data poskytnutá uživatelem.

Chcete-li vrátit informace, PageFunction<T> implementuje metodu OnReturn . Následující kód ukazuje, jak ho volat.

using System;
using System.Windows;
using System.Windows.Navigation;

namespace StructuredNavigationSample
{
    public partial class CalledPageFunction : PageFunction<String>
    {
Imports System.Windows
Imports System.Windows.Navigation

Namespace StructuredNavigationSample

Public Class CalledPageFunction
    Inherits PageFunction(Of String)
        void okButton_Click(object sender, RoutedEventArgs e)
        {
            // Accept when Ok button is clicked
            OnReturn(new ReturnEventArgs<string>(this.dataItem1TextBox.Text));
        }

        void cancelButton_Click(object sender, RoutedEventArgs e)
        {
            // Cancel
            OnReturn(null);
        }
    }
}
    Private Sub okButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
        ' Accept when Ok button is clicked
        Me.OnReturn(New ReturnEventArgs(Of String)(Me.dataItem1TextBox.Text))
    End Sub

    Private Sub cancelButton_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
        ' Cancel
        Me.OnReturn(Nothing)
    End Sub
End Class

End Namespace

Pokud v tomto příkladu uživatel stiskne tlačítko Storno, vrátí se na volající stránku hodnota null . Pokud se místo toho stiskne tlačítko OK, vrátí se řetězcová hodnota poskytnutá uživatelem. OnReturnprotected virtual je metoda, kterou voláte k vrácení dat na volající stránku. Data musí být zabalena v instanci obecného ReturnEventArgs<T> typu, jejíž argument typu určuje typ hodnoty, která Result vrací. Tímto způsobem, když deklarujete PageFunction<T> s určitým argumentem typu, hlásíte, že PageFunction<T> vrátí instanci typu, která je určena argumentem typu. V tomto příkladu je argument typu a v důsledku toho návratová hodnota typu String.

Při OnReturn volání potřebuje volající stránka nějaký způsob, jak přijmout návratovou PageFunction<T>hodnotu . Z tohoto důvodu PageFunction<T> implementuje Return událost pro volání stránek, které se mají zpracovat. Při OnReturn volání je vyvolána, Return takže volající stránka se může zaregistrovat Return k přijetí oznámení.

using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;

namespace StructuredNavigationSample
{
    public partial class CallingPage : Page
    {
Imports System.Windows
Imports System.Windows.Controls
Imports System.Windows.Navigation

Namespace StructuredNavigationSample

Public Class CallingPage
    Inherits Page
        void pageFunctionHyperlink_Click(object sender, RoutedEventArgs e)
        {

            // Instantiate and navigate to page function
            CalledPageFunction CalledPageFunction = new CalledPageFunction("Initial Data Item Value");
            CalledPageFunction.Return += pageFunction_Return;
            this.NavigationService.Navigate(CalledPageFunction);
        }
        void pageFunction_Return(object sender, ReturnEventArgs<string> e)
        {
            this.pageFunctionResultsTextBlock.Visibility = Visibility.Visible;

            // Display result
            this.pageFunctionResultsTextBlock.Text = (e != null ? "Accepted" : "Canceled");

            // If page function returned, display result and data
            if (e != null)
            {
                this.pageFunctionResultsTextBlock.Text += "\n" + e.Result;
            }
        }
    }
}
    Private Sub pageFunctionHyperlink_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
        ' Instantiate and navigate to page function
        Dim calledPageFunction As New CalledPageFunction("Initial Data Item Value")
        AddHandler calledPageFunction.Return, New ReturnEventHandler(Of String)(AddressOf Me.calledPageFunction_Return)
        MyBase.NavigationService.Navigate(calledPageFunction)
    End Sub
    Private Sub calledPageFunction_Return(ByVal sender As Object, ByVal e As ReturnEventArgs(Of String))

        Me.pageFunctionResultsTextBlock.Visibility = Windows.Visibility.Visible

        ' Display result
        Me.pageFunctionResultsTextBlock.Text = IIf((Not e Is Nothing), "Accepted", "Canceled")

        ' If page function returned, display result and data
        If (Not e Is Nothing) Then
            Me.pageFunctionResultsTextBlock.Text = (Me.pageFunctionResultsTextBlock.Text & ChrW(10) & e.Result)
        End If

    End Sub
End Class

End Namespace

Odebrání stránek úkolů po dokončení úkolu

Při vrácení volané stránky a uživatel nezrušil volanou stránku, volající stránka zpracuje data poskytnutá uživatelem a vrátí se také z volané stránky. Získávání dat tímto způsobem je obvykle izolovaná aktivita; když se volá stránka, musí volající stránka vytvořit a přejít na novou volající stránku, aby zachytila více dat.

Pokud se ale z deníku neodebere volaná stránka, uživatel bude moct přejít zpět na předchozí instanci volající stránky. PageFunction<T> Určuje, zda je v deníku zachována RemoveFromJournal vlastnost. Ve výchozím nastavení se funkce stránky automaticky odebere, pokud OnReturn je volána, protože RemoveFromJournal je nastavena na true. Chcete-li zachovat funkci stránky v historii navigace po OnReturn zavolání, nastavte RemoveFromJournal na falsehodnotu .

Další typy strukturované navigace

Toto téma znázorňuje nejzásadnější použití funkce PageFunction<T> pro podporu strukturované navigace s voláním a vrácením. Díky tomuto základu můžete vytvářet složitější typy strukturované navigace.

Volající stránka například vyžaduje více stránek, aby shromáždila dostatek dat od uživatele nebo aby prováděla úlohu. Použití více stránek se označuje jako "průvodce".

V jiných případech můžou mít aplikace komplexní topologie navigace, které závisí na strukturované navigaci, aby fungovaly efektivně. Další informace naleznete v tématu Přehled topologií navigace.

Viz také