Megosztás a következőn keresztül:


Strukturált navigáció – áttekintés

Az olyan tartalom, amelyet egy XAML böngészőalkalmazás (XBAP), egy Framevagy egy NavigationWindow képes üzemeltetni, olyan oldalakból áll, amelyek egységes erőforrás-azonosítókkal (URI-kkal) azonosíthatók, és amelyekre hivatkozásokkal lehet navigálni. A hivatkozások által definiált oldalak struktúráját és navigálási módjait navigációs topológiának nevezzük. Az ilyen topológia számos alkalmazástípusnak felel meg, különösen azoknak, amelyek végigjárják a dokumentumokat. Ilyen alkalmazások esetén a felhasználó anélkül navigálhat az egyik oldalról a másikra, hogy bármelyik oldalnak tudnia kellene valamit a másikról.

Más típusú alkalmazások azonban olyan oldalakat is tartalmaz, amelyekről tudniuk kell, hogy mikor navigáltak közöttük. Vegyük például azt az emberierőforrás-alkalmazást, amelynek egy oldala van a szervezet összes alkalmazottjának listázásához – ez a "Alkalmazottak listázása" oldal. Ez a lap azt is lehetővé teheti, hogy a felhasználók egy hivatkozásra kattintva új alkalmazottat vegyenek fel. Ha rákattintott, a lap egy "Alkalmazott hozzáadása" lapra lép az új alkalmazott adatainak összegyűjtéséhez, majd visszakerül az "Alkalmazottak listázása" lapra az új alkalmazott létrehozásához és a lista frissítéséhez. Ez a navigációs stílus hasonló egy metódus meghívásához, amely valamilyen feldolgozást végez, és visszaad egy értéket, amelyet strukturált programozásnak neveznek. Ezért ezt a navigációs stílust strukturált navigációsnéven ismerjük.

A Page osztály nem támogatja a strukturált navigációt. Ehelyett a PageFunction<T> osztály a Page-ből származik, és kiterjeszti olyan alapvető szerkezetekkel, amelyek szükségesek a strukturált navigációhoz. Ez a témakör bemutatja, hogyan hozhat létre strukturált navigációt PageFunction<T>használatával.

Strukturált navigáció

Ha egy oldal egy strukturált navigációban meghív egy másik lapot, az alábbi viselkedések némelyikére vagy mindegyikére szükség van:

  • A hívólap a hívott lapra navigál, és opcionálisan átadja a hívott oldal által megkövetelt paramétereket.

  • A hívott oldal, ha egy felhasználó befejezte a hívóoldal használatát, kifejezetten a hívó oldalra tér vissza, opcionálisan:

    • A hívó oldal befejezését leíró állapotinformációk visszaadása (például hogy egy felhasználó lenyomta-e az OK gombot vagy a Mégse gombot).

    • A felhasználótól gyűjtött adatok visszaadása (például új alkalmazottak adatai).

  • Amikor a hívó oldal visszatér a hívott lapra, a rendszer eltávolítja a hívott lapot a navigációs előzményekből, hogy elkülönítse a hívott lap egyik példányát a másiktól.

Ezeket a viselkedéseket a következő ábra szemlélteti:

Képernyőkép a hívási oldal és a hívott oldal közötti folyamatról.

Ezeket a viselkedéseket úgy valósíthatja meg, hogy a PageFunction<T>-t használja hívott oldalként.

Strukturált navigáció a PageFunction használatával

Ez a témakör bemutatja, hogyan valósítható meg a strukturált navigáció alapvető mechanikája egyetlen PageFunction<T>használatával. Ebben a példában egy Page meghív egy PageFunction<T>, hogy lekérjen egy String értéket a felhasználótól, és visszaadja azt.

Hívólap létrehozása

A PageFunction<T> hívó lap lehet a Page vagy a PageFunction<T>. Ebben a példában ez egy Page, ahogyan az az alábbi kódban is látható.

<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

Oldalfunkció létrehozása a meghíváshoz

Mivel a hívólap a hívott lap használatával adatokat gyűjthet és adhat vissza a felhasználótól, a PageFunction<T> általános osztályként lesz implementálva, amelynek típusargumentuma megadja a hívott lap által visszaadott érték típusát. Az alábbi kód a hívott oldal kezdeti implementációját mutatja be PageFunction<T>alkalmazásával, amely String-et ad vissza.

<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

A PageFunction<T> deklarációja hasonló egy Page deklarációhoz a típusargumentumok hozzáadásával. Ahogy a kód példájából látható, a típusargumentumok az XAML jelölésben, a x:TypeArguments attribútummal, és a kód mögött is meg vannak adva standard általános típusú argumentumszintaxis használatával.

Nem kell csak .NET-keretrendszerosztályokat használnia típusargumentumként. A PageFunction<T> meghívható tartományspecifikus adatok gyűjtésére, amelyek egyéni típusként vannak absztrahálva. Az alábbi kód bemutatja, hogyan használható egy saját típus mint típusargumentum egy PageFunction<T>számára.

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

A PageFunction<T> típusargumentumai biztosítják a hívó oldal és a hívott oldal közötti kommunikáció alapjait, amelyeket a következő szakaszok tárgyalnak.

Amint láthatja, a PageFunction<T> deklarációjával azonosított típus fontos szerepet játszik. Adatokat ad vissza egy PageFunction<T> a hívóoldalnak.

Egy PageFunction meghívása és paraméterek átadása

Egy lap meghívásához a hívóoldalnak példányosítania kell a hívott lapot, és a Navigate metódussal kell rá navigálnia. Ez lehetővé teszi, hogy a hívó oldal a hívott lapra továbbítsa a kezdeti adatokat, például a hívott oldal által összegyűjtött adatok alapértelmezett értékeit.

Az alábbi kód egy nem paraméter nélküli konstruktorral jeleníti meg a hívott oldalt a hívó oldal paramétereinek elfogadásához.

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

Az alábbi kód a ClickHyperlink eseményét kezelő hívólapot mutatja a hívott oldal példányosításához és egy kezdeti sztringérték átadásához.

<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

Nem szükséges paramétereket átadnia a hívott lapnak. Ehelyett a következőket teheti:

De ahogy hamarosan látni fogja, továbbra is kódot kell használnia ahhoz, hogy példányosítson és a hívott oldalra navigáljon, hogy összegyűjtse az általa visszaadott adatokat. A PageFunction<T>-t életben kell tartani azért, hogy a következőkor, amikor a PageFunction<T>-re navigál, a WPF ne egy új példányt hozzon létre a paraméter nélküli konstruktor használatával a PageFunction<T>-ből.

Ahhoz azonban, hogy a hívott oldal visszatérjen, vissza kell adnia azokat az adatokat, amelyeket a hívóoldal lekérhet.

Tevékenység eredményének és tevékenységadatainak visszaadása tevékenységből egy hívó lapra

Miután a felhasználó befejezte a hívott oldal használatát, amit ebben a példában az OK vagy a Mégse gomb lenyomása jelez, a hívott oldalnak vissza kell térnie. Mivel a hívóoldal a hívott oldalt használta a felhasználótól származó adatok gyűjtésére, a hívóoldalnak kétféle információra van szüksége:

  1. Azt jelzi, hogy a felhasználó megszakította-e a hívott oldalt (a példában az OK vagy a Mégse gombra kattintva). Ez lehetővé teszi, hogy a hívó oldal határozza meg, hogy feldolgozzák-e a felhasználótól gyűjtött hívólap adatait.

  2. A felhasználó által megadott adatok.

Az információk visszaadásához PageFunction<T> implementálja a OnReturn metódust. Az alábbi kód bemutatja, hogyan hívhatja meg.

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

Ebben a példában, ha egy felhasználó lenyomja a Mégse gombot, a rendszer null értéket ad vissza a hívóoldalra. Ha az OK gombot lenyomja, a rendszer visszaadja a felhasználó által megadott sztringértéket. OnReturn egy protected virtual metódus, amellyel az adatait visszaküldi a hívólapra. Az adatokat az általános ReturnEventArgs<T> típusú példányba kell csomagolni, amelynek típusargumentumában meg kell adni az Result visszaadott érték típusát. Amikor egy adott típusargumentummal rendelkező PageFunction<T>-t deklarál, azt mondja, hogy a PageFunction<T> a típusargumentum által meghatározott típusú példányt ad vissza. Ebben a példában a típus argumentum, és következésképpen a visszatérési érték Stringtípusú.

Ha OnReturn van meghívva, a hívóoldalnak valamilyen módon meg kell kapnia a PageFunction<T>visszatérési értékét. Ezért PageFunction<T> implementálja a Return eseményt a lapok kezeléséhez. Amikor a OnReturn hívása megtörténik, a Return emelkedik, így a hívó oldal regisztrálhat a Return-n, hogy megkapja az értesítést.

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

Feladatlapok eltávolítása feladat befejezésekor

Amikor egy hívott oldal visszatér, és a felhasználó nem mondta le a hívott lapot, a hívó oldal feldolgozni fogja a felhasználó által megadott és a hívott oldalról is visszaadott adatokat. Az ilyen módon történő adatgyűjtés általában elszigetelt tevékenység; Amikor a hívott oldal visszatér, a hívóoldalnak létre kell hoznia és egy új hívóoldalra kell navigálnia, hogy több adatot rögzítsen.

Ha azonban nem távolít el egy hívott lapot a naplóból, a felhasználó vissza tud majd navigálni a hívólap egy korábbi példányára. Az, hogy a naplóban megtartják-e a PageFunction<T>-t, a RemoveFromJournal tulajdonságtól függ. Alapértelmezés szerint egy lapfüggvény automatikusan eltávolításra kerül, amikor OnReturn meghívásra kerül, mert RemoveFromJournal értéke true-re van beállítva. Ha egy lapfunkciót a navigációs előzményekben szeretne megtartani a OnReturn hívása után, állítsa be RemoveFromJournal-et false-re.

A strukturált navigáció egyéb típusai

Ez a témakör bemutatja a PageFunction<T> legegyszerűbb használatát a hívás-vissza strukturált navigáció támogatásához. Ez az alap lehetővé teszi a strukturált navigáció összetettebb típusainak létrehozását.

Előfordulhat például, hogy egy hívó oldal több oldalt is igényel ahhoz, hogy elegendő adatot gyűjtsön egy felhasználótól, vagy hogy elvégezhesse a feladatot. Több oldal használatát "varázslónak" nevezzük.

Más esetekben az alkalmazások összetett navigációs topológiával rendelkezhetnek, amelyek a strukturált navigációtól függenek a hatékony működéshez. További információ: navigációs topológiák áttekintése.

Lásd még