Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Inhoud die kan worden gehost door een XAML-browsertoepassing (XBAP), een Frameof een NavigationWindow bestaat uit pagina's die kunnen worden geïdentificeerd door uniform resource-id's (URI's) en waarnaar kan worden genavigeerd door hyperlinks. De structuur van pagina's en de manieren waarop ze kunnen worden genavigeerd, zoals gedefinieerd door hyperlinks, wordt een navigatietopologie genoemd. Een dergelijke topologie past bij een verscheidenheid aan toepassingstypen, met name die door documenten navigeren. Voor dergelijke toepassingen kan de gebruiker van de ene pagina naar een andere pagina navigeren zonder dat een van beide pagina's iets hoeft te weten over de andere.
Andere typen toepassingen hebben echter pagina's die wel moeten weten wanneer ze tussendoor zijn genavigeerd. Denk bijvoorbeeld aan een human resources-toepassing met één pagina om alle werknemers in een organisatie weer te geven: de pagina Werknemers vermelden. Op deze pagina kunnen gebruikers ook een nieuwe werknemer toevoegen door op een hyperlink te klikken. Wanneer erop wordt geklikt, gaat de pagina naar de pagina 'Een werknemer toevoegen' om de gegevens van de nieuwe werknemer te verzamelen en terug te keren naar de pagina Werknemers vermelden om de nieuwe werknemer te maken en de lijst bij te werken. Deze navigatiestijl is vergelijkbaar met het aanroepen van een methode om een bepaalde verwerking uit te voeren en een waarde te retourneren, die gestructureerd programmeren wordt genoemd. Als zodanig wordt deze stijl van navigatie ook wel gestructureerde navigatiegenoemd.
De Page-klasse implementeert geen ondersteuning voor gestructureerde navigatie. In plaats daarvan is de PageFunction<T> klasse afgeleid van Page en wordt deze uitgebreid met de basisconstructies die vereist zijn voor gestructureerde navigatie. In dit onderwerp wordt beschreven hoe u gestructureerde navigatie tot stand brengt met behulp van PageFunction<T>.
Gestructureerde navigatie
Wanneer een pagina een andere pagina aanroept in een gestructureerde navigatie, zijn sommige of alle volgende gedragingen vereist:
De aanroepende pagina navigeert naar de aangeroepen pagina, optioneel door parameters door te geven die vereist zijn voor de aangeroepen pagina.
De opgeroepen pagina keert, wanneer een gebruiker klaar is met het gebruik van de oproepende pagina, specifiek terug naar de oproepende pagina, optioneel.
Retourneert statusinformatie die beschrijft hoe de belpagina is voltooid (bijvoorbeeld of een gebruiker op een KNOP OK of op de knop Annuleren heeft gedrukt).
Retourneert die gegevens die zijn verzameld van de gebruiker (bijvoorbeeld nieuwe werknemersgegevens).
Wanneer de aanroepende pagina terugkeert naar de aangeroepen pagina, wordt de aangeroepen pagina verwijderd uit de navigatiegeschiedenis om één exemplaar van een aangeroepen pagina van een andere te isoleren.
Dit gedrag wordt geïllustreerd door de volgende afbeelding:
U kunt deze gedragingen implementeren door een PageFunction<T> als de aangeroepen pagina te gebruiken.
Gestructureerde navigatie met PageFunction
In dit onderwerp laten we zien hoe u de basismechanica implementeert van gestructureerde navigatie met één PageFunction<T>. In dit voorbeeld roept een Page een PageFunction<T> aan om een String waarde van de gebruiker op te halen en deze te retourneren.
Een belpagina maken
De pagina die een PageFunction<T> aanroept, kan een Page of een PageFunction<T>zijn. In dit voorbeeld is het een Page, zoals wordt weergegeven in de volgende code.
<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
Een paginafunctie maken die moet worden aangeroepen
Omdat de aanroepende pagina de aangeroepen pagina kan gebruiken om gegevens van de gebruiker te verzamelen en te retourneren, wordt PageFunction<T> geïmplementeerd als een algemene klasse waarvan het typeargument het type aangeeft van de waarde die de aangeroepen pagina retourneert. De volgende code toont de eerste implementatie van de aangeroepen pagina met behulp van een PageFunction<T>, die een Stringretourneert.
<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
De declaratie van een PageFunction<T> is vergelijkbaar met de declaratie van een Page met de toevoeging van de typeargumenten. Zoals u in het codevoorbeeld kunt zien, worden de typeargumenten opgegeven in zowel XAML-markeringen, met behulp van het kenmerk x:TypeArguments en code-behind, met behulp van de standaard algemene argumentsyntaxis.
U hoeft niet alleen .NET Framework-klassen als typeargumenten te gebruiken. Een PageFunction<T> kan worden aangeroepen om domeinspecifieke gegevens te verzamelen die als aangepast type worden geabstraheerd. De volgende code laat zien hoe u een aangepast type gebruikt als een typeargument voor een 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
De typeargumenten voor de PageFunction<T> vormen de basis voor de communicatie tussen een aanroepende pagina en de aangeroepen pagina, die in de volgende secties worden besproken.
Zoals u zult zien, speelt het type dat wordt geïdentificeerd door de declaratie van een PageFunction<T> een belangrijke rol bij het retourneren van gegevens van een PageFunction<T> naar de aanroepende pagina.
Een PageFunction aanroepen en parameters doorgeven
Als u een pagina wilt aanroepen, moet de aanroeppagina de aangeroepen pagina instantiëren en naar deze pagina navigeren met behulp van de methode Navigate. Hierdoor kan de aanroepende pagina initiële gegevens doorgeven aan de aangeroepen pagina, zoals standaardwaarden voor de gegevens die door de aangeroepen pagina worden verzameld.
De volgende code toont de aangeroepen pagina met een niet-parameterloze constructor om parameters van de aanroepende pagina te accepteren.
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
De volgende code toont hoe de aanroepende pagina de Click-gebeurtenis van de Hyperlink verwerkt om de aangeroepen pagina te instantiëren en een initiële tekenreekswaarde door te geven.
<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
U hoeft geen parameters door te geven aan de aangeroepen pagina. In plaats daarvan kunt u het volgende doen:
Vanaf de belpagina:
Instantieer de aangeroepen PageFunction<T> met behulp van de parameterloze constructor.
Sla de parameters op in Properties.
Navigeer naar de genaamde PageFunction<T>.
Uit de aangeroepen PageFunction<T>:
- Haal de parameters op die zijn opgeslagen in Propertiesen gebruik deze.
Maar zoals u binnenkort ziet, hebt u nog steeds code nodig om te instantiëren en naar de aangeroepen pagina te navigeren om de gegevens te verzamelen die door de aangeroepen pagina worden geretourneerd. Daarom moet de PageFunction<T> in leven worden gehouden; als u de volgende keer naar de PageFunction<T>navigeert, wordt de PageFunction<T> door WPF geïnstitueerd met behulp van de parameterloze constructor.
Voordat de aangeroepen pagina kan worden geretourneerd, moet deze echter gegevens retourneren die kunnen worden opgehaald door de aanroepende pagina.
Taakresultaat en taakgegevens van een taak retourneren naar een aanroepende pagina
Nadat de gebruiker klaar is met de aangeroepen pagina, wat in dit voorbeeld wordt gesignaleerd door op de knoppen OK of Annuleren te drukken, moet de aangeroepen pagina worden teruggestuurd. Omdat de aanroepende pagina de aangeroepen pagina heeft gebruikt om gegevens van de gebruiker te verzamelen, zijn voor de aanroepende pagina twee typen gegevens vereist:
Of de gebruiker de aangeroepen pagina heeft geannuleerd (door op de knop OK of op de knop Annuleren in dit voorbeeld te drukken). Hierdoor kan de aanroepende pagina bepalen of de gegevens moeten worden verwerkt die de aanroepende pagina van de gebruiker heeft verzameld.
De gegevens die door de gebruiker zijn verstrekt.
Als u gegevens wilt retourneren, implementeert PageFunction<T> de methode OnReturn. De volgende code laat zien hoe u deze aanroept.
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
Als een gebruiker in dit voorbeeld op de knop Annuleren drukt, wordt een waarde van null geretourneerd naar de belpagina. Als in plaats daarvan op de knop OK wordt gedrukt, wordt de tekenreekswaarde geretourneerd die door de gebruiker wordt opgegeven.
OnReturn is een protected virtual methode die u aanroept om uw gegevens terug te sturen naar de aanroepende pagina. Uw gegevens moeten worden verpakt in een exemplaar van het algemene ReturnEventArgs<T> type, waarvan het typeargument het type waarde aangeeft dat Result retourneert. Als u op deze manier een PageFunction<T> declareert met een bepaald typeargument, geeft u aan dat een PageFunction<T> een exemplaar retourneert van het type dat is opgegeven door het typeargument. In dit voorbeeld is het typeargument en bijgevolg de retourwaarde van het type String.
Wanneer OnReturn wordt aangeroepen, heeft de aanroepende pagina een manier nodig om de retourwaarde van de PageFunction<T>te ontvangen. Daarom implementeert PageFunction<T> de Return gebeurtenis voor het aanroepen van pagina's die moeten worden verwerkt. Wanneer OnReturn wordt aangeroepen, wordt Return gegenereerd, zodat de belpagina kan worden geregistreerd bij Return om de melding te ontvangen.
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
Taakpagina's verwijderen wanneer een taak is voltooid
Wanneer een aangeroepen pagina wordt geretourneerd en de gebruiker de aangeroepen pagina niet heeft geannuleerd, worden de gegevens verwerkt die door de gebruiker zijn verstrekt en die ook zijn geretourneerd vanaf de aangeroepen pagina. Gegevensverwerving op deze manier is meestal een geïsoleerde activiteit; wanneer de aangeroepen pagina terugkomt, moet de aanroepende pagina opnieuw een aanroepende pagina maken en hiernaartoe navigeren om meer gegevens vast te leggen.
Tenzij een aangeroepen pagina echter uit het logboek wordt verwijderd, kan een gebruiker teruggaan naar een eerder exemplaar van de aanroepende pagina. Of een PageFunction<T> in het logboek wordt bewaard, wordt bepaald door de eigenschap RemoveFromJournal. Standaard wordt een paginafunctie automatisch verwijderd wanneer OnReturn wordt aangeroepen omdat RemoveFromJournal is ingesteld op true. Als u een paginafunctie in de navigatiegeschiedenis wilt houden nadat OnReturn is aangeroepen, stelt u RemoveFromJournal in op false.
Andere typen gestructureerde navigatie
In dit onderwerp ziet u het meest eenvoudige gebruik van een PageFunction<T> ter ondersteuning van gestructureerde navigatie met oproepen/retourneren. Deze basis biedt u de mogelijkheid om complexere typen gestructureerde navigatie te maken.
Soms zijn bijvoorbeeld meerdere pagina's vereist door een aanroepende pagina om voldoende gegevens van een gebruiker te verzamelen of om een taak uit te voeren. Het gebruik van meerdere pagina's wordt een 'wizard' genoemd.
In andere gevallen kunnen toepassingen complexe navigatietopologieën hebben die afhankelijk zijn van gestructureerde navigatie om effectief te werken. Zie Overzicht van navigatietopologieënvoor meer informatie.
Zie ook
- PageFunction<T>
- NavigationService
- Overzicht van navigatietopologieën
.NET Desktop feedback