Freigeben über


Übersicht über die strukturierte Navigation

Der von einer XAML browser application (XBAP), einem Frame oder einem NavigationWindow gehostete Inhalt besteht aus Seiten, die über die uniform resource identifiers (URIs) des Pakets identifiziert und über Links aufgerufen werden. Die Struktur der Seiten und die durch Links definierte Navigation in ihnen werden als Navigationstopologie bezeichnet. Eine solche Topologie kann für unterschiedliche Anwendungstypen eingesetzt werden, insbesondere für die Navigation in Dokumenten. In diesen Anwendungen kann der Benutzer von einer Seite zu einer anderen Seite navigieren, ohne dass die Seite Informationen zu der anderen Seite enthält.

In anderen Anwendungstypen ist es hingegen erforderlich, dass die Seiten Informationen über den Navigationsverlauf beinhalten. Beispiel: Eine Personalanwendung enthält eine Seite, auf der alle Mitarbeiter eines Unternehmens aufgelistet sind (die "Mitarbeiterliste"). Auf dieser Seite können Benutzer mithilfe eines Links einen neuen Mitarbeiter hinzufügen. Wenn der Benutzer auf diesen Link klickt, navigiert die Seite zu der Seite "Mitarbeiter hinzufügen", auf der die Daten des neuen Mitarbeiters erfasst werden. Anschließend wird die Seite "Mitarbeiterliste" wieder aufgerufen, um den neuen Mitarbeiter zu erstellen und die Liste zu aktualisieren. Diese Art der Navigation entspricht dem Aufruf einer Methode, um bestimmte Verarbeitungsschritte auszuführen und einen Wert zurückzugeben, was auch als strukturierte Programmierung bezeichnet wird. Dementsprechend wird diese Art der Navigation als strukturierte Navigation bezeichnet.

Die Page-Klasse implementiert keine Unterstützung für die strukturierte Navigation. Stattdessen wird die PageFunction<T>-Klasse von Page abgeleitet und erweitert diese um die grundlegenden Konstrukte für die strukturierte Navigation. In diesem Thema wird gezeigt, wie Sie mithilfe von PageFunction<T> die strukturierte Navigation einrichten.

Dieses Thema enthält folgende Abschnitte.

  • Strukturierte Navigation
  • Strukturierte Navigation mit PageFunction
  • Andere Arten der strukturierten Navigation
  • Verwandte Abschnitte

Strukturierte Navigation

Wenn eine Seite in einer strukturierten Navigation eine andere Seite aufruft, sind die folgenden Verhaltensweisen ganz oder teilweise erforderlich:

  • Die aufrufende Seite navigiert zu der aufgerufenen Seite und übergibt ggf. für die aufgerufene Seite erforderliche Parameter.

  • Die aufgerufene Seite kehrt zu der aufrufenden Seite zurück, wenn der Benutzer die Bearbeitung in der aufrufenden Seite abgeschlossen hat. Optional:

    • Es werden Zustandsinformationen zurückgegeben, die angeben, wie die aufrufende Seite beendet wurde (z. B. ob der Benutzer auf die Schaltfläche OK oder Abbrechen geklickt hat).

    • Die von dem Benutzer erfassten Daten werden zurückgegeben (z. B. die Daten eines neuen Mitarbeiters).

  • Wenn die aufrufende Seite die aufgerufene Seite erneut anzeigt, wird die aufgerufene Seite aus dem Navigationsverlauf entfernt, um eine Instanz einer aufgerufenen Seite von einer anderen Instanz zu trennen.

Diese Verhaltensweisen werden in der folgenden Abbildung dargestellt.

Fluss zwischen aufrufender und aufgerufener Seite

Sie implementieren diese Verhalten, indem Sie eine PageFunction<T> als aufgerufene Seite verwenden.

Strukturierte Navigation mit PageFunction

In diesem Thema wird gezeigt, wie Sie die grundlegende Funktionsweise der strukturierten Navigation mit einer einzelnen PageFunction<T> implementieren. In diesem Beispiel ruft eine Page eine PageFunction<T> auf, um einen String-Wert vom Benutzer abzurufen und zurückzugeben.

Erstellen einer aufrufenden Seite

Die Seite, die eine PageFunction<T> aufruft, kann eine Page oder eine PageFunction<T> sein. In diesem Beispiel handelt es sich um eine Page, wie dem folgenden Code zu entnehmen ist.

<Page 
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    x:Class="StructuredNavigationSample.CallingPage"
    WindowTitle="Calling Page" 
    WindowWidth="250" WindowHeight="150">


...


</Page>
Imports System.Windows ' RoutedEventArgs, RoutedEventHandler, Visibility
Imports System.Windows.Controls ' Page
Imports System.Windows.Navigation ' ReturnEventArgs

Namespace StructuredNavigationSample

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


...


End Sub


...


End Class

End Namespace
using System.Windows; // RoutedEventArgs, RoutedEventHandler, Visibility
using System.Windows.Controls; // Page
using System.Windows.Navigation; // ReturnEventArgs

namespace StructuredNavigationSample
{
    public partial class CallingPage : Page
    {
        public CallingPage()
        {
            InitializeComponent();


...


}


...


    }
}

Erstellen einer aufzurufenden Seitenfunktion

Da die aufrufende Seite mithilfe der aufgerufenen Seite Daten von dem Benutzer erfassen und zurückgeben kann, wird PageFunction<T> als allgemeine Klasse implementiert, durch deren Typargument die Art des Werts angegeben wird, den die aufgerufene Seite zurückgibt. Der folgende Code stellt die Anfangsimplementierung der aufgerufenen Seite dar. Es wird eine PageFunction<T> verwendet, die eine String zurückgibt.

<PageFunction
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://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>
Imports System ' String
Imports System.Windows ' RoutedEventArgs, RoutedEventHandler
Imports System.Windows.Navigation ' PageFunction

Namespace StructuredNavigationSample

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


...


End Class

End Namespace
using System; // String
using System.Windows; // RoutedEventArgs, RoutedEventHandler
using System.Windows.Navigation; // PageFunction

namespace StructuredNavigationSample
{
    public partial class CalledPageFunction : PageFunction<String>
    {
        public CalledPageFunction()
        {
            InitializeComponent();
        }


...


    }
}

Die Deklaration einer PageFunction<T> ähnelt der Deklaration einer Page, sie weist jedoch zusätzlich Typargumente auf. Wie Sie dem Codebeispiel entnehmen können, werden die Typargumente sowohl im XAML-Markup (mithilfe des x:TypeArguments-Attributs), als auch im Code-Behind (mithilfe der standardmäßigen Syntax für allgemeine Typargumente) angegeben.

Sie müssen nicht immer .NET Framework-Klassen als Typargumente verwenden. Sie können eine PageFunction<T> aufrufen, um domänenspezifische Daten zu erfassen, die als benutzerdefinierter Typ abstrahiert werden. Im folgenden Code wird gezeigt, wie ein benutzerdefinierter Typ als Typargument für eine PageFunction<T> verwendet wird.

Public Class CustomType


...


End Class
namespace SDKSample
{
    public class CustomType
    {


...


    }
}
<PageFunction
    xmlns="https://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="https://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="clr-namespace:SDKSample" 
    x:Class="SDKSample.CustomTypePageFunction"
    x:TypeArguments="local:CustomType">


...


</PageFunction>
Partial Public Class CustomTypePageFunction
    Inherits System.Windows.Navigation.PageFunction(Of CustomType)
using System.Windows.Navigation; // PageFunction

namespace SDKSample
{
    public partial class CustomTypePageFunction : PageFunction<CustomType>
    {

Die Typargumente für die PageFunction<T> sind die Grundlage für die Kommunikation zwischen einer aufrufenden Seite und einer aufgerufenen Seite, was in den folgenden Abschnitten näher erläutert wird.

Wie Sie sehen, hat der Typ, der durch die Deklaration einer PageFunction<T> angegeben wird, eine wichtige Funktion beim Zurückgeben von Daten aus einer PageFunction<T> an die aufrufende Seite.

Aufrufen einer PageFunction und Übergeben von Parametern

Um eine Seite aufzurufen, muss die aufrufende Seite die aufgerufene Seite instanzieren und mithilfe der Navigate-Methode zu dieser navigieren. Die aufrufende Seite kann so erste Daten an die aufgerufene Seite übergeben, darunter Standardwerte für die von der aufgerufenen Seite erfassten Daten.

Im folgenden Code ist die aufgerufene Seite mit einem anderen als dem Standardkonstruktor dargestellt, um Parameter aus der aufrufenden Seite zu übernehmen.

Imports System ' String
Imports System.Windows ' RoutedEventArgs, RoutedEventHandler
Imports System.Windows.Navigation ' PageFunction

Namespace StructuredNavigationSample

Public Class CalledPageFunction
    Inherits PageFunction(Of String)


...


Public Sub New(ByVal initialDataItem1Value As String)
    Me.InitializeComponent()


...


    ' Set initial value
    Me.dataItem1TextBox.Text = initialDataItem1Value
End Sub


...


End Class

End Namespace
using System; // String
using System.Windows; // RoutedEventArgs, RoutedEventHandler
using System.Windows.Navigation; // PageFunction

namespace StructuredNavigationSample
{
    public partial class CalledPageFunction : PageFunction<String>
    {


...


        public CalledPageFunction(string initialDataItem1Value)
        {
            InitializeComponent();



...


    // Set initial value
    this.dataItem1TextBox.Text = initialDataItem1Value;
}


...


    }
}

Im folgenden Code ist die aufrufende Seite dargestellt, die das Click-Ereignis des Hyperlink-Elements verarbeitet, um die aufgerufene Seite zu instanziieren und einen ersten Zeichenfolgenwert an diese zu übergeben.

Imports System.Windows ' RoutedEventArgs, RoutedEventHandler, Visibility
Imports System.Windows.Controls ' Page
Imports System.Windows.Navigation ' ReturnEventArgs

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
using System.Windows; // RoutedEventArgs, RoutedEventHandler, Visibility
using System.Windows.Controls; // Page
using System.Windows.Navigation; // ReturnEventArgs

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");


...


}


...


    }
}
<Hyperlink Name="pageFunctionHyperlink">Call Page Function</Hyperlink>

Es ist nicht erforderlich, Parameter an die aufgerufene Seite zu übergeben. Sie können stattdessen auch die folgenden Schritte durchführen.

Sie müssen jedoch weiterhin Code verwenden, um die aufgerufene Seite zu instanzieren und zu dieser zu navigieren, sodass die von der aufgerufenen Seite zurückgegebenen Daten erfasst werden können (siehe Beschreibung weiter unten). Die PageFunction<T> muss daher weiterhin aktiv sein. Andernfalls würde WPF die PageFunction<T> mit dem Standardkonstruktor instanzieren, wenn Sie das nächste Mal zu der PageFunction<T> navigieren.

Bevor die aufgerufene Seite wieder angezeigt werden kann, muss sie die Daten zurückgeben, die von der aufrufenden Seite abgerufen werden können.

Zurückgeben von Aufgabenergebnissen und Aufgabendaten aus einer Aufgabe an eine aufrufende Seite

Nachdem der Benutzer alle Aufgaben auf der aufgerufenen Seite beendet hat und wie in diesem Beispiel auf OK oder Abbrechen geklickt hat, muss die aufgerufene Seite wieder angezeigt werden. Da die aufrufende Seite die aufgerufene Seite zum Erfassen von Daten des Benutzers verwendet hat, erfordert die aufrufende Seite zwei Arten von Informationen:

  1. Ob der Benutzer die aufgerufene Seite abgebrochen hat (indem er wie in diesem Beispiel auf OK oder Abbrechen geklickt hat). Die aufrufende Seite ermittelt anhand dieser Informationen, ob die von der aufrufenden Seite erfassten Daten des Benutzers verarbeitet werden sollen.

  2. Die Daten, die vom Benutzer angegeben wurden.

Um Informationen zurückzugeben, implementiert PageFunction<T> die OnReturn-Methode. Im folgenden Code wird veranschaulicht, wie diese aufgerufen wird.

Imports System ' String
Imports System.Windows ' RoutedEventArgs, RoutedEventHandler
Imports System.Windows.Navigation ' PageFunction

Namespace StructuredNavigationSample

Public Class CalledPageFunction
    Inherits PageFunction(Of String)


...


    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
using System; // String
using System.Windows; // RoutedEventArgs, RoutedEventHandler
using System.Windows.Navigation; // PageFunction

namespace StructuredNavigationSample
{
    public partial class CalledPageFunction : PageFunction<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);
        }
    }
}

Wenn der Benutzer in diesem Beispiel auf die Schaltfläche Abbrechen klickt, wird der Wert null an die aufrufende Seite zurückgegeben. Wird stattdessen die Schaltfläche OK ausgewählt, wird der vom Benutzer angegebene Zeichenfolgenwert zurückgegeben. OnReturn ist eine protected virtual-Methode, die aufgerufen wird, um Daten an die aufrufende Seite zurückzugeben. Die Daten müssen in einer Instanz des allgemeinen ReturnEventArgs<T>-Typs zusammengefasst werden, dessen Typargument die Art des Werts kennzeichnet, der von Result zurückgegeben wird. Wenn Sie eine PageFunction<T> mit einem bestimmten Typargument deklarieren, geben Sie an, dass eine PageFunction<T> eine Instanz des durch das Typargument definierten Typs zurückgibt. In diesem Beispiel entsprechen das Typargument und infolgedessen der Rückgabewert dem Typ String.

Wenn OnReturn aufgerufen wird, muss die aufrufende Seite den Rückgabewert der PageFunction<T> empfangen können. Aus diesem Grund implementiert PageFunction<T> das Return-Ereignis für die Verarbeitung durch die aufrufende Seite. Wenn OnReturn aufgerufen wird, wird Return ausgelöst. Die aufrufende Seite kann sich so mit Return registrieren, um die Benachrichtigung zu empfangen.

Imports System.Windows ' RoutedEventArgs, RoutedEventHandler, Visibility
Imports System.Windows.Controls ' Page
Imports System.Windows.Navigation ' ReturnEventArgs

Namespace StructuredNavigationSample

Public Class CallingPage
    Inherits Page


...


    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
using System.Windows; // RoutedEventArgs, RoutedEventHandler, Visibility
using System.Windows.Controls; // Page
using System.Windows.Navigation; // ReturnEventArgs

namespace StructuredNavigationSample
{
    public partial class CallingPage : 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;
            }
        }
    }
}

Entfernen von Aufgabenseiten nach Abschluss einer Aufgabe

Wenn eine aufgerufene Seite wieder angezeigt wird und der Benutzer diese nicht abgebrochen hat, verarbeitet die aufrufende Seite die von dem Benutzer angegebenen und von der aufgerufenen Seite zurückgegebenen Daten. Eine solche Datenerfassung erfolgt zumeist isoliert. Wenn die aufgerufene Seite wieder angezeigt wird, muss die aufrufende Seite eine neue aufrufende Seite erstellen und zu dieser navigieren, um weitere Daten zu erfassen.

Der Benutzer kann jedoch zu einer vorherigen Instanz der aufrufenden Seite zurück navigieren, sofern die aufgerufene Seite nicht aus dem Journal entfernt wurde. Ob eine PageFunction<T> in dem Journal beibehalten wird, wird durch die RemoveFromJournal-Eigenschaft festgelegt. Standardmäßig wird eine Seitenfunktion automatisch entfernt, wenn OnReturn aufgerufen wird, da RemoveFromJournal auf true festgelegt ist. Um eine Seitenfunktion im Navigationsverlauf beizubehalten, nachdem OnReturn aufgerufen wurde, legen Sie RemoveFromJournal auf false fest.

Andere Arten der strukturierten Navigation

In diesem Thema wird die grundlegende Verwendung einer PageFunction<T> veranschaulicht, um eine strukturierte Navigation mit Aufruf/Rückgabe zu unterstützten. Auf dieser Grundlage können Sie dann komplexere Typen der strukturierten Navigation erstellen.

In bestimmten Situationen benötigt eine aufrufende Seite beispielsweise mehrere Seiten, um genügend Daten zu einem Benutzer zu erfassen oder um eine Aufgabe auszuführen. Die Verwendung mehrerer Seiten wird als "Assistent" bezeichnet.

In anderen Situationen weisen Anwendungen möglicherweise komplexe Navigationstopologien auf, für deren effektive Ausführung eine strukturierte Navigation erforderlich ist. Weitere Informationen finden Sie unter Übersicht über Navigationstopologien.

Siehe auch

Referenz

PageFunction<T>

NavigationService

Konzepte

Übersicht über Navigationstopologien