Przegląd Strukturyzowana nawigacja

Zawartość, która może być hostowana przez aplikację przeglądarki XAML (XBAP), Frameobiekt lub obiekt NavigationWindow składa się z stron, które mogą być identyfikowane przez identyfikatory URI (uniform resource identifiers) pakietu i przechodzi do niej przez hiperlinki. Struktura stron i sposobów nawigowania, zgodnie z definicją hiperlinków, jest nazywana topologią nawigacji. Taka topologia pasuje do różnych typów aplikacji, szczególnie tych, które przechodzą przez dokumenty. W przypadku takich aplikacji użytkownik może przechodzić z jednej strony do innej bez konieczności znajomości żadnej ze stron.

Jednak inne typy aplikacji mają strony, które muszą wiedzieć, kiedy zostały nawigowane między nimi. Rozważmy na przykład aplikację kadr, która ma jedną stronę, aby wyświetlić listę wszystkich pracowników w organizacji — stronę "Lista pracowników". Ta strona może również umożliwić użytkownikom dodawanie nowego pracownika, klikając hiperlink. Po kliknięciu strona przechodzi do strony "Dodaj pracownika", aby zebrać szczegóły nowego pracownika i zwrócić je do strony "Lista pracowników", aby utworzyć nowego pracownika i zaktualizować listę. Ten styl nawigacji jest podobny do wywoływania metody w celu wykonania pewnego przetwarzania i zwrócenia wartości, która jest znana jako programowanie strukturalne. W związku z tym ten styl nawigacji jest określany jako nawigacja ze strukturą.

Klasa Page nie implementuje obsługi nawigacji strukturalnej. PageFunction<T> Zamiast tego klasa pochodzi z Page klasy i rozszerza ją o podstawowe konstrukcje wymagane do nawigacji strukturalnej. W tym temacie pokazano, jak ustanowić nawigację ze strukturą przy użyciu polecenia PageFunction<T>.

Nawigacja ze strukturą

Gdy jedna strona wywołuje inną stronę w nawigacji ze strukturą, wymagane są niektóre lub wszystkie następujące zachowania:

  • Strona wywołująca przechodzi do wywoływanej strony, opcjonalnie przekazując parametry wymagane przez wywołaną stronę.

  • Wywołana strona, gdy użytkownik zakończył korzystanie ze strony wywołującej, zwraca się specjalnie do strony wywołującej, opcjonalnie:

    • Zwracanie informacji o stanie opisujących sposób ukończenia strony wywołującej (na przykład tego, czy użytkownik nacisnął przycisk OK, czy przycisk Anuluj).

    • Zwracanie tych danych zebranych od użytkownika (na przykład nowych szczegółów pracownika).

  • Gdy strona wywołująca powróci do wywoływanej strony, wywołana strona zostanie usunięta z historii nawigacji, aby odizolować jedno wystąpienie wywoływanej strony od innej.

Te zachowania przedstawiono na poniższej ilustracji:

Screenshot shows the flow between calling page and called page.

Te zachowania można zaimplementować przy użyciu PageFunction<T> elementu jako nazywanej strony.

Nawigacja ze strukturą z funkcją PageFunction

W tym temacie pokazano, jak zaimplementować podstawową mechanikę nawigacji strukturalnej obejmującej jeden PageFunction<T>element . W tym przykładzie wywołaj metodę PageString , PageFunction<T> aby uzyskać wartość od użytkownika i zwrócić ją.

Tworzenie strony wywołującej

Strona wywołująca element PageFunction<T> może być elementem Page lub .PageFunction<T> W tym przykładzie jest to element Page, jak pokazano w poniższym kodzie.

<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

Tworzenie funkcji page do wywołania

Ponieważ strona wywołująca może używać wywoływanej strony do zbierania i zwracania danych od użytkownika, jest implementowana jako klasa ogólna, PageFunction<T> której argument typu określa typ wartości zwracanej przez wywołaną stronę. Poniższy kod przedstawia początkową implementację wywoływanej strony przy użyciu PageFunction<T>elementu , który zwraca wartość 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

Deklaracja obiektu PageFunction<T> jest podobna do deklaracji obiektu Page z dodawaniem argumentów typu. Jak widać w przykładzie kodu, argumenty typu są określane zarówno w adiustacji XAML, jak i za pomocą atrybutu i kodu, przy użyciu standardowej x:TypeArguments składni argumentu typu ogólnego.

Nie musisz używać tylko klas programu .NET Framework jako argumentów typu. Element PageFunction<T> może być wywoływany w celu zebrania danych specyficznych dla domeny, które są abstrakcyjne jako typ niestandardowy. Poniższy kod pokazuje, jak używać typu niestandardowego jako argumentu typu dla klasy 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 dla PageFunction<T> elementu zapewniają podstawę komunikacji między stroną wywołującą a wywołaną stroną, które zostały omówione w poniższych sekcjach.

Jak zobaczysz, typ, który jest identyfikowany z deklaracją obiektu PageFunction<T> , odgrywa ważną rolę w zwracaniu danych ze PageFunction<T> strony do strony wywołującej.

Wywoływanie parametrów PageFunction i przekazywanie

Aby wywołać stronę, strona wywołująca musi utworzyć wystąpienie wywołanej strony i przejść do niej przy użyciu Navigate metody . Dzięki temu strona wywołująca może przekazywać początkowe dane do wywoływanej strony, na przykład wartości domyślne dla danych zbieranych przez wywołaną stronę.

Poniższy kod przedstawia wywołaną stronę z konstruktorem bez parametrów umożliwiającym akceptowanie parametrów ze strony wywołującej.

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

Poniższy kod przedstawia stronę wywołującą, która obsługuje Click zdarzenie Hyperlink , aby utworzyć wystąpienie wywołanej strony i przekazać jej początkową wartość ciągu.

<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

Nie musisz przekazywać parametrów do wywoływanej strony. Zamiast tego można wykonać następujące czynności:

Jednak jak zobaczysz wkrótce, nadal będziesz potrzebować kodu, aby utworzyć wystąpienie i przejść do wywoływanej strony, aby zebrać dane zwrócone przez wywołaną stronę. Z tego powodu należy zachować żywą żywą wartość. W przeciwnym razie PageFunction<T> przy następnym przejściu PageFunction<T>do wystąpienia WPF PageFunction<T> użyj konstruktora bez parametrów.

Zanim jednak wywołana strona będzie mogła zwrócić dane, które można pobrać za pomocą strony wywołującej.

Zwracanie wyników zadania i danych zadania z zadania do strony wywołującej

Gdy użytkownik zakończy korzystanie z wywoływanej strony, zaloguj się w tym przykładzie, naciskając przyciski OK lub Anuluj, wywołana strona musi wrócić. Ponieważ strona wywołująca użyła wywoływanej strony do zbierania danych od użytkownika, strona wywołująca wymaga dwóch typów informacji:

  1. Czy użytkownik anulował wywołaną stronę (naciskając przycisk OK lub przycisk Anuluj w tym przykładzie). Dzięki temu strona wywołująca umożliwia określenie, czy dane są przetwarzane przez stronę wywołującą zebraną od użytkownika.

  2. Dane, które zostały dostarczone przez użytkownika.

Aby zwrócić informacje, PageFunction<T> implementuje metodę OnReturn . Poniższy kod pokazuje, jak go wywołać.

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

W tym przykładzie, jeśli użytkownik naciśnie przycisk Anuluj, zostanie zwrócona wartość null na stronie wywołującej. Jeśli zamiast tego zostanie naciśnięty przycisk OK, zostanie zwrócona wartość ciągu podana przez użytkownika. OnReturn to metoda wywoływana protected virtual w celu zwrócenia danych do strony wywołującej. Dane muszą być spakowane w wystąpieniu typu ogólnego ReturnEventArgs<T> , którego argument type określa typ zwracanej wartości Result . W ten sposób, po zadeklarowaniu PageFunction<T> za pomocą określonego argumentu typu, stwierdzasz, że zwraca PageFunction<T> wystąpienie typu określonego przez argument typu. W tym przykładzie argument typu i w związku z tym zwracana wartość jest typu String.

Gdy OnReturn jest wywoływana, strona wywołująca wymaga pewnego sposobu odbierania wartości zwracanej elementu PageFunction<T>. Z tego powodu PageFunction<T> implementuje Return zdarzenie do obsługi stron wywołujących. Po OnReturn wywołaniu jest wywoływana, Return więc strona wywołująca może zarejestrować się w Return usłudze w celu odebrania powiadomienia.

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

Usuwanie stron zadań po zakończeniu zadania

Gdy wywołana strona zostanie zwrócona, a użytkownik nie anulował wywoływanej strony, strona wywołująca będzie przetwarzać dane dostarczone przez użytkownika, a także zwracane ze strony wywoływanej. Pozyskiwanie danych w ten sposób jest zwykle działaniem izolowanym; gdy wywołana strona zwraca, strona wywołująca musi utworzyć nową stronę wywołującą i przejść do nowej strony wywołującej, aby przechwycić więcej danych.

Jeśli jednak wywołana strona nie zostanie usunięta z dziennika, użytkownik będzie mógł wrócić do poprzedniego wystąpienia strony wywołującej. Czy obiekt PageFunction<T> jest zachowywany w dzienniku, jest określany przez RemoveFromJournal właściwość . Domyślnie funkcja strony jest automatycznie usuwana, gdy OnReturn jest wywoływana, ponieważ RemoveFromJournal jest ustawiona na truewartość . Aby zachować funkcję strony w historii nawigacji po OnReturn wywołaniu, ustaw wartość falseRemoveFromJournal .

Inne typy nawigacji strukturalnej

W tym temacie przedstawiono najbardziej podstawowe użycie elementu PageFunction<T> do obsługi nawigacji ze strukturą wywołania/zwrócenia. Ta podstawa zapewnia możliwość tworzenia bardziej złożonych typów nawigacji strukturalnej.

Na przykład czasami wiele stron jest wymaganych przez stronę wywołującą w celu zebrania wystarczającej ilości danych od użytkownika lub wykonania zadania. Użycie wielu stron jest określane jako "kreator".

W innych przypadkach aplikacje mogą mieć złożone topologie nawigacji, które zależą od nawigacji strukturalnej w celu efektywnego działania. Aby uzyskać więcej informacji, zobacz Omówienie topologii nawigacji.

Zobacz też