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:
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:
Z volající stránky:
Vytvořte instanci volaného PageFunction<T> pomocí konstruktoru bez parametrů.
Uložte parametry do Propertiessouboru .
Přejděte na volanou PageFunction<T>.
Z volala PageFunction<T>:
- Načtení a použití parametrů uložených v Propertiessouboru .
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í:
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.
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 false
hodnotu .
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é
.NET Desktop feedback
Váš názor
https://aka.ms/ContentUserFeedback.
Připravujeme: V průběhu roku 2024 budeme postupně vyřazovat problémy z GitHub coby mechanismus zpětné vazby pro obsah a nahrazovat ho novým systémem zpětné vazby. Další informace naleznete v tématu:Odeslat a zobrazit názory pro