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, PageFunction<T> kelas 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 yang disebut, secara opsional meneruskan parameter yang diperlukan oleh halaman yang dipanggil.

  • Halaman yang dipanggil, ketika pengguna telah selesai menggunakan halaman panggilan, mengembalikan secara khusus ke halaman panggilan, secara opsional:

    • 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:

Screenshot shows the flow between calling page and called page.

Anda dapat menerapkan perilaku ini dengan menggunakan PageFunction<T> sebagai halaman yang disebut.

Navigasi Terstruktur dengan PageFunction

Topik ini menunjukkan cara mengimplementasikan mekanisme dasar navigasi terstruktur yang melibatkan satu PageFunction<T>. Dalam sampel ini, memanggil PagePageFunction<T> untuk mendapatkan String nilai dari pengguna dan mengembalikannya.

Membuat Halaman Panggilan

Halaman yang memanggil PageFunction<T> dapat berupa Page atau PageFunction<T>. Dalam contoh ini, ini adalah , seperti yang Pageditunjukkan 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 halaman yang disebut, 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 mirip PageFunction<T> dengan deklarasi Page dengan penambahan argumen jenis. Seperti yang Anda lihat dari contoh kode, argumen jenis ditentukan dalam markup XAML, menggunakan x:TypeArguments atribut, dan code-behind, menggunakan sintaks argumen jenis 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 jenis kustom sebagai argumen jenis 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 Parameter PageFunction dan Passing

Untuk memanggil halaman, halaman panggilan harus membuat instans halaman yang dipanggil dan menavigasi ke halaman tersebut Navigate menggunakan metode . 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 panggilan yang menangani Click peristiwa untuk membuat instans halaman yang Hyperlink 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 segera, Anda masih perlu menggunakan kode untuk membuat instans dan menavigasi ke halaman yang dipanggil untuk mengumpulkan data yang dikembalikan oleh halaman yang disebut. Untuk alasan ini, PageFunction<T> kebutuhan untuk tetap hidup; jika tidak, saat berikutnya Anda menavigasi ke PageFunction<T>, WPF membuat instans PageFunction<T> penggunaan konstruktor tanpa parameter.

Namun, sebelum halaman yang dipanggil dapat kembali, halaman perlu mengembalikan data yang dapat diambil oleh halaman panggilan.

Mengembalikan Hasil Tugas dan Data Tugas dari Tugas ke Halaman Panggilan

Setelah pengguna selesai menggunakan halaman yang dipanggil, masuk dalam contoh ini dengan menekan tombol OK atau Batal, halaman yang dipanggil perlu 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> terapkan OnReturn metode . 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 protected virtual metode yang Anda panggil untuk mengembalikan data Anda ke halaman panggilan. Data Anda perlu dimas dalam instans jenis generik ReturnEventArgs<T> , yang argumen jenisnya menentukan jenis nilai yang Result dikembalikan. 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 yang dikembalikan berjenis String.

Ketika OnReturn dipanggil, halaman panggilan membutuhkan beberapa cara untuk menerima nilai pengembalian dari PageFunction<T>. Untuk alasan ini, PageFunction<T> menerapkan Return peristiwa untuk memanggil halaman untuk ditangani. Ketika OnReturn dipanggil, Return dinaikkan, sehingga halaman panggilan dapat mendaftar 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 dipertahankan PageFunction<T> dalam jurnal ditentukan oleh RemoveFromJournal properti . Secara default, fungsi halaman secara otomatis dihapus ketika 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 mengilustrasikan penggunaan paling dasar untuk PageFunction<T> 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.

Baca juga