Bagikan melalui


Gambaran Umum Navigasi Terstruktur

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:

Cuplikan layar memperlihatkan alur antara halaman panggilan dan halaman yang dipanggil.

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:

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:

  1. 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.

  2. 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