Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
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:
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:
A hívó oldalról:
Példányosíthatja a hívott PageFunction<T> a paraméter nélküli konstruktor használatával.
Tárolja a paramétereket a Properties-ben.
Lépjen a megadott PageFunction<T>-ra.
A hívott PageFunction<T>:
- A Propertiestárolt paraméterek lekérése és használata.
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:
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.
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
.NET Desktop feedback