Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Konten yang dapat dihosting oleh aplikasi browser XAML (XBAP), Frame, atau NavigationWindow terdiri dari halaman yang dapat diidentifikasi oleh pengidentifikasi sumber daya seragam paket (URI) dan dinavigasi oleh hyperlink. Struktur halaman dan cara menavigasinya, seperti yang didefinisikan oleh hyperlink, dikenal sebagai topologi navigasi. Topologi semacam itu cocok dengan berbagai jenis aplikasi, terutama yang menavigasi melalui dokumen. Untuk aplikasi tersebut, pengguna dapat menavigasi dari satu halaman ke halaman lain tanpa salah satu halaman perlu mengetahui apa pun tentang yang lain.
Namun, jenis aplikasi lain memiliki halaman yang perlu diketahui kapan aplikasi tersebut telah dinavigasi. Misalnya, pertimbangkan aplikasi sumber daya manusia yang memiliki satu halaman untuk mencantumkan semua karyawan dalam organisasi—halaman "Daftar Karyawan". Halaman ini juga dapat memungkinkan pengguna untuk menambahkan karyawan baru dengan mengklik hyperlink. Saat diklik, halaman menavigasi ke halaman "Tambahkan Karyawan" untuk mengumpulkan detail karyawan baru dan mengembalikannya ke halaman "Daftar Karyawan" untuk membuat karyawan baru dan memperbarui daftar. Gaya navigasi ini mirip dengan memanggil metode untuk melakukan beberapa pemrosesan dan mengembalikan nilai, yang dikenal sebagai pemrograman terstruktur. Dengan demikian, gaya navigasi ini dikenal sebagai navigasi terstruktur.
Kelas Page tidak menerapkan dukungan untuk navigasi terstruktur. Sebaliknya, kelas PageFunction<T> berasal dari Page dan memperluasnya dengan konstruksi dasar yang diperlukan untuk navigasi terstruktur. Topik ini menunjukkan cara membuat navigasi terstruktur menggunakan PageFunction<T>.
Navigasi Terstruktur
Saat satu halaman memanggil halaman lain dalam navigasi terstruktur, beberapa atau semua perilaku berikut diperlukan:
Halaman panggilan menavigasi ke halaman tujuan, dengan pilihan meneruskan parameter yang diperlukan oleh halaman yang dipanggil.
Halaman yang dipanggil, ketika pengguna telah selesai menggunakannya, secara khusus kembali ke halaman pemanggil, jika diinginkan:
Mengembalikan informasi status yang menjelaskan bagaimana halaman panggilan selesai (misalnya, apakah pengguna menekan tombol OK atau tombol Batal).
Mengembalikan data yang dikumpulkan dari pengguna (misalnya, detail karyawan baru).
Saat halaman panggilan kembali ke halaman yang dipanggil, halaman yang dipanggil dihapus dari riwayat navigasi untuk mengisolasi satu instans halaman yang dipanggil dari halaman lain.
Perilaku ini diilustrasikan oleh gambar berikut:
Anda dapat menerapkan perilaku ini dengan menggunakan PageFunction<T> sebagai halaman yang dipanggil.
Navigasi Terstruktur dengan PageFunction
Topik ini menunjukkan cara mengimplementasikan mekanisme dasar navigasi terstruktur yang melibatkan satu PageFunction<T>. Dalam sampel ini, Page memanggil PageFunction<T> untuk mendapatkan nilai String dari pengguna dan mengembalikannya.
Membuat Halaman Panggilan
Halaman yang memanggil PageFunction<T> dapat berupa Page atau PageFunction<T>. Dalam contoh ini, ini adalah Page, seperti yang ditunjukkan dalam kode berikut.
<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
Membuat Fungsi Halaman untuk Dipanggil
Karena halaman panggilan dapat menggunakan halaman yang dipanggil untuk mengumpulkan dan mengembalikan data dari pengguna, PageFunction<T> diimplementasikan sebagai kelas generik yang argumen jenisnya menentukan jenis nilai yang akan dikembalikan halaman yang dipanggil. Kode berikut menunjukkan implementasi awal dari halaman yang dipanggil, menggunakan PageFunction<T>yang mengembalikan 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
Deklarasi PageFunction<T> mirip dengan deklarasi Page dengan penambahan argumen jenis. Seperti yang Anda lihat dari contoh kode, argumen jenis ditentukan dalam markup XAML menggunakan atribut x:TypeArguments dan dalam code-behind menggunakan sintaks tipe argumen generik standar.
Anda tidak perlu hanya menggunakan kelas .NET Framework sebagai argumen jenis. PageFunction<T> dapat dipanggil untuk mengumpulkan data khusus domain yang diabstraksi sebagai jenis kustom. Kode berikut menunjukkan cara menggunakan tipe khusus sebagai parameter tipe untuk 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
Argumen jenis untuk PageFunction<T> menyediakan fondasi untuk komunikasi antara halaman panggilan dan halaman yang dipanggil, yang dibahas di bagian berikut.
Seperti yang akan Anda lihat, jenis yang diidentifikasi dengan deklarasi PageFunction<T> memainkan peran penting dalam mengembalikan data dari PageFunction<T> ke halaman panggilan.
Memanggil PageFunction dan Memasukkan Parameter
Untuk memanggil halaman, halaman panggilan harus membuat instans halaman yang dipanggil dan menavigasi ke halaman tersebut menggunakan metode Navigate. Ini memungkinkan halaman panggilan untuk meneruskan data awal ke halaman yang disebut, seperti nilai default untuk data yang dikumpulkan oleh halaman yang disebut.
Kode berikut menunjukkan halaman yang dipanggil dengan konstruktor tanpa parameter untuk menerima parameter dari halaman panggilan.
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
Kode berikut menunjukkan halaman pemanggil yang menangani event Click dari Hyperlink untuk membuat instans dari halaman yang dipanggil dan meneruskannya nilai string awal.
<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
Anda tidak diharuskan meneruskan parameter ke halaman yang dipanggil. Sebagai gantinya, Anda dapat melakukan hal berikut:
Dari halaman pemanggil:
Buat instans yang disebut PageFunction<T> menggunakan konstruktor tanpa parameter.
Simpan parameter di Properties.
Navigasikan ke PageFunction<T>yang disebut .
Dari PageFunction<T>yang disebut :
- Ambil dan gunakan parameter yang disimpan di Properties.
Tetapi, seperti yang akan Anda lihat sebentar lagi, Anda masih perlu menggunakan kode untuk membuat instans dan menavigasi ke halaman tujuan untuk mengumpulkan data yang dikembalikan oleh halaman tersebut. Oleh karena itu, PageFunction<T> harus tetap hidup; jika tidak, lain kali Anda menavigasi ke PageFunction<T>, WPF akan membuat instans PageFunction<T> menggunakan konstruktor tanpa parameter.
Namun, sebelum halaman yang dipanggil dapat kembali, halaman perlu mengembalikan data yang dapat diambil oleh halaman panggilan.
Mengembalikan Hasil dan Data dari Tugas ke Halaman Pemanggilan
Setelah pengguna selesai menggunakan halaman yang dipanggil, yang ditandai dalam contoh ini dengan menekan tombol OK atau Batal, halaman yang dipanggil harus dikembalikan. Karena halaman panggilan menggunakan halaman yang dipanggil untuk mengumpulkan data dari pengguna, halaman panggilan memerlukan dua jenis informasi:
Apakah pengguna membatalkan halaman yang dipanggil (dengan menekan tombol OK atau tombol Batalkan dalam contoh ini). Ini memungkinkan halaman panggilan untuk menentukan apakah akan memproses data yang dikumpulkan halaman panggilan dari pengguna.
Data yang disediakan oleh pengguna.
Untuk mengembalikan informasi, PageFunction<T> menerapkan metode OnReturn. Kode berikut menunjukkan cara memanggilnya.
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
Dalam contoh ini, jika pengguna menekan tombol Batalkan, nilai null dikembalikan ke halaman panggilan. Jika tombol OK ditekan sebagai gantinya, nilai string yang disediakan oleh pengguna dikembalikan.
OnReturn adalah metode protected virtual yang Anda panggil untuk mengembalikan data Anda ke halaman panggilan. Data Anda perlu dikemas dalam sebuah instans dari jenis ReturnEventArgs<T> generik, yang argumen jenisnya menentukan jenis nilai yang Result mengembalikan. Dengan cara ini, ketika Anda mendeklarasikan PageFunction<T> dengan argumen jenis tertentu, Anda menyatakan bahwa PageFunction<T> akan mengembalikan instans jenis yang ditentukan oleh argumen jenis. Dalam contoh ini, argumen jenis dan, akibatnya, nilai pengembalian berjenis String.
Ketika OnReturn dipanggil, halaman panggilan membutuhkan beberapa cara untuk menerima nilai pengembalian dari PageFunction<T>. Untuk alasan ini, PageFunction<T> mengimplementasikan peristiwa Return agar dapat ditangani oleh halaman yang memanggilnya. Ketika OnReturn dipanggil, Return dinaikkan, sehingga halaman panggilan dapat mendaftar dengan Return untuk menerima pemberitahuan.
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
Menghapus Halaman Tugas Saat Tugas Selesai
Ketika halaman yang dipanggil kembali, dan pengguna tidak membatalkan halaman yang dipanggil, halaman panggilan akan memproses data yang disediakan oleh pengguna dan juga dikembalikan dari halaman yang dipanggil. Akuisisi data dengan cara ini biasanya merupakan aktivitas yang terisolasi; ketika halaman yang dipanggil kembali, halaman panggilan perlu membuat dan menavigasi ke halaman panggilan baru untuk mengambil lebih banyak data.
Namun, kecuali halaman yang disebut dihapus dari jurnal, pengguna akan dapat menavigasi kembali ke instans sebelumnya dari halaman panggilan. Apakah PageFunction<T> akan disimpan dalam jurnal ditentukan oleh properti RemoveFromJournal. Secara default, fungsi halaman secara otomatis dihapus saat OnReturn dipanggil karena RemoveFromJournal diatur ke true. Untuk menyimpan fungsi halaman dalam riwayat navigasi setelah OnReturn dipanggil, atur RemoveFromJournal ke false.
Jenis Navigasi Terstruktur Lainnya
Topik ini menggambarkan penggunaan paling dasar PageFunction<T> dalam mendukung navigasi terstruktur panggilan/pengembalian. Fondasi ini memberi Anda kemampuan untuk membuat jenis navigasi terstruktur yang lebih kompleks.
Misalnya, terkadang beberapa halaman diperlukan oleh halaman panggilan untuk mengumpulkan data yang cukup dari pengguna atau untuk melakukan tugas. Penggunaan beberapa halaman disebut sebagai "wizard".
Dalam kasus lain, aplikasi mungkin memiliki topologi navigasi kompleks yang bergantung pada navigasi terstruktur untuk beroperasi secara efektif. Untuk informasi selengkapnya, lihat Gambaran Umum Topologi Navigasi .
Lihat juga
.NET Desktop feedback