Přehled strukturované navigace
Obsah, který může hostovat aplikace prohlížeče XAML (XBAP), Framenebo NavigationWindow, se skládá ze stránek, které lze identifikovat pomocí jednotných identifikátorů zdrojů (URI) balíčku a navigovat pomocí hypertextových odkazů. 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 PageFunction<T> třída je odvozena z Page a 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 používání této stránky, se vrátí konkrétně na stránku, která ji vyvolala, a to 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, volaná stránka se odebere z historie navigace, aby se odlišila jedna instance volané stránky od druhé.
Toto chování je znázorněno na následujícím obrázku:
Toto chování můžete implementovat pomocí PageFunction<T> jako vyvolané stránky.
Strukturovaná navigace pomocí PageFunction
Toto téma ukazuje, jak implementovat základní mechanismy strukturované navigace zahrnující jeden PageFunction<T>. V této ukázce Page zavolá PageFunction<T>, aby získal String hodnotu od uživatele a vrátil ji.
Vytvoření volací stránky
Stránka, která volá PageFunction<T>, ta může být buď Page, nebo PageFunction<T>. V tomto příkladu je to Page, jak 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, PageFunction<T> je implementována jako obecná třída, jejíž typ argumentu určuje typ hodnoty, kterou vrátí volaná stránka. Následující kód ukazuje počáteční implementaci volané stránky pomocí PageFunction<T>, která vrátí 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 PageFunction<T> se podobá deklaraci Page s přidáním argumentů typu. Jak je vidět v příkladu kódu, argumenty typu jsou zadány ve značkách XAML pomocí atributu x:TypeArguments
a v kódu za použití standardní syntaxe pro obecné typy.
Jako argumenty typu nemusíte používat pouze třídy rozhraní .NET Framework. Je možné volat PageFunction<T> ke shromažďování dat specifických 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> poskytují základ 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 deklarací PageFunction<T>, hraje důležitou roli při vracení dat z PageFunction<T> na volající stránku.
Volání PageFunction a Předávání Parametrů
Pokud chcete zavolat stránku, musí volající stránka vytvořit instanci pojmenované stránky a přejít na ni pomocí metody Navigate. 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, která zpracovává Click událost Hyperlink k 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:
Z volající stránky:
Vytvořte instanci volaného PageFunction<T> pomocí konstruktoru bez parametrů.
Uložte parametry do Properties.
Přejděte na označenou PageFunction<T>.
Z čísla volaného PageFunction<T>:
- Načtení a použití parametrů uložených v Properties.
Ale jak uvidíte za chvíli, je stále potřeba použít kód k vytvoření instance a přesměrování na volanou stránku, aby se shromáždila data, která vrátí volaná stránka. Z tohoto důvodu musí být PageFunction<T> zachovány; jinak při dalším přechodu na PageFunction<T>WPF inicializuje instanci PageFunction<T> pomocí konstruktoru bez parametrů.
Než se může volaná stránka vrátit, musí však vrátit data, která může načíst volající stránka.
Vrácení výsledku a dat úkolu z úlohy na volající stránku
Jakmile uživatel dokončí používání volané stránky, což je v tomto příkladu znázorněno stisknutím tlačítek OK nebo Zrušit, volaná stránka se musí 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í:
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.
Data poskytnutá uživatelem.
Pokud chcete 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.
OnReturn je metoda protected virtual
, kterou voláte k vrácení dat na volající stránku. Data je potřeba zabalit do instance obecného typu ReturnEventArgs<T>, jehož argument typu určuje typ hodnoty, která Result vrátí. 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 volání OnReturn volající stránka potřebuje nějaký způsob, jak přijmout návratovou hodnotu PageFunction<T>. Z tohoto důvodu PageFunction<T> implementuje událost Return pro volání stránek, které se mají zpracovat. Když je OnReturn spuštěn, Return se aktivuje, takže volající stránka se může zaregistrovat na Return, aby obdržela 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
Pokud se volaná stránka vrátí a uživatel ji nezrušil, volající stránka zpracuje data poskytnutá uživatelem i vrácená z volané stránky. Získávání dat tímto způsobem je obvykle izolovaná aktivita; když se vrátí volaná stránka, musí zdrojová stránka vytvořit a přejít na novou zdrojovou 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. Zda je PageFunction<T> zachováno v deníku, určuje vlastnost RemoveFromJournal. Ve výchozím nastavení se funkce stránky automaticky odebere, když je zavolána OnReturn, protože RemoveFromJournal je nastavená na true
. Chcete-li zachovat funkci stránky v historii navigace po zavolání OnReturn, nastavte RemoveFromJournal na false
.
Další typy strukturované navigace
Toto téma znázorňuje nejzákladnější použití PageFunction<T> pro podporování 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é
.NET Desktop feedback