Yapılandırılmış Gezintiye Genel Bakış

Bir XAML tarayıcı uygulaması (XBAP), veya bir tarafından barındır edilemeyen içerik, paket tekdüdüz kaynak tanımlayıcıları Frame ( URI) tarafından tanımlanıp köprülerle gidilen sayfalardan NavigationWindow oluşur. Sayfaların yapısı ve köprülerle tanımlandığı şekilde gezinebilir yolları gezinti topolojisi olarak bilinir. Bu tür bir topoloji, özellikle belgelerde gezinenler olmak üzere çeşitli uygulama türlerine uyar. Bu tür uygulamalar için, kullanıcı herhangi bir sayfadan diğerine herhangi bir şey bilmek zorunda kalmadan bir sayfadan diğerine gezinebilirsiniz.

Ancak, diğer uygulama türleri arasında ne zaman gezinildiklerini bilmek gereken sayfalara sahiptir. Örneğin, bir kuruluşta tüm çalışanları ("Çalışanları Listele" sayfası) tek sayfalı bir insan kaynakları uygulaması düşünün. Bu sayfa, kullanıcıların köprüye tıklayarak yeni bir çalışan eklemesine de olanak sağlar. Bu sayfa tık olduğunda, yeni çalışanın ayrıntılarını toplamak ve yeni çalışanı oluşturmak ve listeyi güncelleştirmek için bunları "Çalışanları Listele" sayfasına geri dönmek için bir "Çalışan Ekle" sayfasına gidin. Bu gezinti stili, bazı işlemleri gerçekleştirmek ve yapılandırılmış programlama olarak bilinen bir değer dönmek için yöntem çağırmaya benzer. Bu nedenle, bu gezinti stili yapılandırılmış gezinti olarak bilinir.

Pagesınıfı yapılandırılmış gezinti desteği uygulamaz. Bunun yerine PageFunction<T> sınıfı, sınıfından Page türettir ve yapılandırılmış gezinti için gereken temel yapılarla genişletmektedir. Bu konu, kullanarak yapılandırılmış gezintinin nasıl oluşturulacaklarını PageFunction<T> gösterir.

Yapılandırılmış Gezinti

Bir sayfa yapılandırılmış gezintide başka bir sayfa çağırsa, aşağıdaki davranışların bazıları veya hepsi gereklidir:

  • Arama sayfası, çağrılı sayfa için gerekli parametreleri isteğe bağlı olarak iletir.

  • Çağrı yapılan sayfa, kullanıcı çağrı sayfasını kullanmayı tamamlamışsa, isteğe bağlı olarak özel olarak çağrı sayfasına geri döner:

    • Çağrı sayfasının nasıl tamamlandıktan (örneğin, bir kullanıcının Tamam düğmesine mi yoksa İptal düğmesine mi basıp basıp basmayarak) ilgili durum bilgilerini döndüren bilgiler döndüren.

    • Kullanıcıdan toplanan verileri (örneğin, yeni çalışan ayrıntıları) döndürerek.

  • Çağrı yapılan sayfa çağrılı sayfaya döndüğünde, çağrılan sayfanın bir örneğini başka bir sayfadan yalıtmak için çağrılı sayfa gezinti geçmişinden kaldırılır.

Bu davranışlar aşağıdaki şekilde gösterildiği gibi:

Screenshot shows the flow between calling page and called page.

Bu davranışları, çağrılı sayfa olarak PageFunction<T> kullanarak gerçekleştirebilirsiniz.

PageFunction ile Yapılandırılmış Gezinti

Bu konu, tek bir içeren yapılandırılmış gezintinin temel mekaniğinin nasıl uygulandığını PageFunction<T> gösterir. Bu örnekte, Page kullanıcıdan bir PageFunction<T> değer almak ve bunu iade etmek için bir String çağrısında dır.

Arama Sayfası Oluşturma

çağrısında bulunan PageFunction<T> sayfa veya PagePageFunction<T> olabilir. Bu örnekte, aşağıdaki kodda Page gösterildiği gibi bir 'dır.

<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

Çağrı yapmak için Sayfa İşlevi Oluşturma

Çağıran sayfa, kullanıcıdan veri toplamak ve bu verileri almak için çağrılı sayfayı kullanabileceğinden, tür bağımsız değişkeni çağrılır sayfanın dönüş değerinin türünü belirten genel bir PageFunction<T> sınıf olarak uygulanır. Aşağıdaki kod, bir döndüren bir kullanarak çağrılan sayfanın PageFunction<T> ilk uygulamasını String gösterir.

<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

bildirimi, PageFunction<T> tür bağımsız değişkenlerinin ekleriyle Page bir bildirimine benzer. Kod örneğinde de gördüğünüz gibi, tür bağımsız değişkenleri hem XAML işaretlemesinde, özniteliği kullanılarak hem de arka kod kullanılarak, standart genel tür bağımsız değişken söz x:TypeArguments dizimi kullanılarak belirtilir.

Tür bağımsız değişkenleri olarak yalnızca .NET Framework sınıflarını kullanmak zorunda değilsiniz. Özel PageFunction<T> tür olarak soyutlanacak etki alanına özgü verileri toplamak için bir çağrılmalıdır. Aşağıdaki kod, özel bir türün bir için tür bağımsız değişkeni olarak nasıl kullanıla bir olduğunu PageFunction<T> gösterir.

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

için tür bağımsız değişkenleri, aşağıdaki bölümlerde ele alınarak çağrılan sayfa ile çağrılan sayfa PageFunction<T> arasındaki iletişimin temelini sağlar.

Gördüğünüz gibi, bildirimiyle tanımlanan tür, bir'den çağrı sayfasına veri iade etmede PageFunction<T> önemli PageFunction<T> bir rol oynar.

PageFunction Çağırma ve Parametreleri Geçirme

Bir sayfayı çağıran sayfanın çağrılır sayfayı örneğini eklemesi ve yöntemini kullanarak sayfaya gezinmesi Navigate gerekir. Bu, çağrıyı yapılan sayfa tarafından toplanan verilerin varsayılan değerleri gibi, çağrıyı yapılan sayfaya ilk verileri iletir.

Aşağıdaki kod, çağrı sayfasından parametreleri kabul etmek için parametresiz olmayan bir oluşturucuya sahip çağrılı sayfayı gösterir.

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

Aşağıdaki kod, çağrılı sayfayı örnekleyen ve bir başlangıç dizesi değeri iletir olaylarını ele alan ClickHyperlink çağrı sayfasını gösterir.

<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

Çağrılan sayfaya parametre geçmemiz gerekmez. Bunun yerine, şunları yapabilirsiniz:

Ancak kısa bir süre sonra göreceğiniz gibi, çağrılı sayfa tarafından döndürülen verileri toplamak için yine de kod kullanarak çağrılı sayfaya gidin. Bu nedenle, canlı tutulması gerekir; aksi takdirde, ' a bir sonraki PageFunction<T>PageFunction<T> gidin, WPF parametresiz PageFunction<T> oluşturucu kullanarak örneğini oluşturur.

Ancak çağrıyı yapılan sayfanın geri dönemeden önce çağrı sayfası tarafından alınarak veri dönmesi gerekir.

Bir Görevden Çağrı Sayfasına Görev Sonucu ve Görev Verileri Döndüren

Kullanıcı çağrılı sayfayı kullanmayı bitirdikten sonra, bu örnekte Tamam veya İptal düğmelerine basarak bunu onaylar, çağrılı sayfanın geri dönmesi gerekir. Çağrı sayfası kullanıcıdan veri toplamak için çağrılı sayfayı kullandığından, çağrı sayfası iki tür bilgi gerektirir:

  1. Kullanıcının çağrılmış sayfayı iptal edip etme (bu örnekte Tamam düğmesine veya İptal düğmesine basarak). Bu, çağrı sayfasının kullanıcıdan toplanan verileri işip işlemeyeceklerini belirlemeye olanak sağlar.

  2. Kullanıcı tarafından sağlanan veriler.

Bilgi almak için PageFunction<T> yöntemini OnReturn kullanır. Aşağıdaki kodda bu kodun nasıl çağrıl olduğu gösterir.

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

Bu örnekte, bir kullanıcı İptal düğmesine basarsa, çağrısı null sayfasına değeri döndürülür. Bunun yerine Tamam düğmesine basıldığında kullanıcı tarafından sağlanan dize değeri döndürülür. OnReturn , protected virtual verilerinizi çağrı sayfasına geri dönmek için çağıran bir yöntemdir. Verilerinizin, tür bağımsız değişkeninin döndüren değer türünü belirten genel ReturnEventArgs<T> tür örneğinde paketlemesi Result gerekir. Bu şekilde, belirli bir tür bağımsız değişkeniyle bir bildirerek, bir türü bağımsız değişkeni tarafından belirtilen türün bir örneğini dönüş PageFunction<T>PageFunction<T> olduğunu belirterek. Bu örnekte, tür bağımsız değişkeni ve sonuç olarak dönüş değeri String türündedir.

çağrıldı OnReturn mı, çağrı sayfası dönüş değerini almak için bir yol PageFunction<T> gerekir. Bu nedenle, PageFunction<T> iş uygulanacak sayfaları çağırma olayı Return uygulanır. Çağrıldıklarda, çağrı sayfası bildirimi OnReturn almak için ile ReturnReturn kaydolabilirsiniz.

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

Görev Tamamlandığında Görev Sayfalarını Kaldırma

Çağrılan sayfa döndürülürken kullanıcı çağrılan sayfayı iptal etmeyerek, çağrılan sayfa, kullanıcı tarafından sağlanan ve çağrılan sayfadan döndürülen verileri işler. Bu şekilde veri alımı genellikle yalıtılmış bir etkinliktir; çağrılı sayfa döndür geldiğinde, çağrı sayfasının daha fazla veri yakalamak için yeni bir çağrı sayfası oluşturması ve yeni bir çağrı sayfasına gezinmesi gerekir.

Ancak, günlükten çağrılır bir sayfa kaldırıldığı sürece, kullanıcı arama sayfasının önceki bir örneğine geri dönebilirsiniz. günlükte PageFunction<T> bir korunarak olup olmadığı özelliği tarafından RemoveFromJournal belirlenir. Varsayılan olarak, olarak ayarlanmış olduğundan çağrılsa OnReturn bir sayfa işlevi otomatik olarak RemoveFromJournaltrue kaldırılır. Çağrıldikten sonra gezinti geçmişinde bir sayfa OnReturn işlevini tutmak için olarak RemoveFromJournalfalse ayarlayın.

Diğer Yapılandırılmış Gezinti Türleri

Bu konu, çağrı/dönüş yapılandırılmış gezintiyi PageFunction<T> desteklemek için bir'in en temel kullanımını göstermektedir. Bu temel size daha karmaşık türde yapılandırılmış gezinti oluşturma olanağı sağlar.

Örneğin, bazen bir kullanıcıdan yeterli veri toplamak veya bir görevi gerçekleştirmek için bir çağrı sayfası tarafından birden çok sayfa gerekir. Birden çok sayfa kullanımı "sihirbaz" olarak adlandırılır.

Diğer durumlarda, uygulamaların etkili bir şekilde çalışması için yapılandırılmış gezintiye bağımlı karmaşık gezinti topolojileri olabilir. Daha fazla bilgi için bkz. Gezinti Topolojileri'ne Genel Bakış.

Ayrıca bkz.