Aracılığıyla paylaş


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

Bir XAML tarayıcı uygulaması (XBAP), bir Frameveya bir NavigationWindow tarafından barındırılabilen içerik, paket tekdüzen kaynak tanımlayıcıları (URI' ler) tarafından tanımlanıp köprülerle gidilebilen sayfalardan oluşur. Köprüler tarafından tanımlanan sayfaların yapısı ve gezinilme yolları, gezinti topolojisi olarak bilinir. Böyle bir topoloji, özellikle belgelerde gezinen çeşitli uygulama türlerine uygundur. Bu tür uygulamalar için kullanıcı, herhangi bir sayfanın diğer sayfa hakkında bilgi sahibi olması gerekmeden bir sayfadan diğerine gidebilir.

Ancak, diğer uygulama türleri arasında ne zaman gezinildiğini bilmesi gereken sayfalara sahiptir. Örneğin, bir kuruluştaki tüm çalışanları listelemek için bir sayfası olan bir insan kaynakları uygulamasını ("Çalışanları Listele" sayfası) düşünün. Bu sayfa, kullanıcıların köprüye tıklayarak yeni bir çalışan eklemesine de izin verebilir. Tıklandığında, sayfa yeni çalışanın ayrıntılarını toplamak ve yeni çalışanı oluşturmak ve listeyi güncelleştirmek için "Çalışanları Listele" sayfasına geri göndermek için bir "Çalışan Ekle" sayfasına gider. Bu gezinti stili, bazı işlemler gerçekleştirmek ve yapılandırılmış programlama olarak bilinen bir değer döndürmek için bir yöntem çağırmaya benzer. Bu nedenle, bu gezinti stili yapılandırılmış gezinti olarak bilinir.

Page sınıfı yapılandırılmış gezinti için destek uygulamaz. Bunun yerine, PageFunction<T> sınıfı öğesinden Page türetilir ve bunu yapılandırılmış gezinti için gereken temel yapılarla genişletir. Bu konu, kullanarak PageFunction<T>yapılandırılmış gezintinin nasıl oluşturulduğunu gösterir.

Yapılandırılmış Gezinti

Bir sayfa yapılandırılmış gezintide başka bir sayfayı çağırdığında, aşağıdaki davranışların bir kısmı veya tümü gereklidir:

  • Çağıran sayfa, çağrılan sayfaya gider ve isteğe bağlı olarak çağrılan sayfanın gerektirdiği parametreleri geçirir.

  • Kullanıcı arama sayfasını kullanmayı tamamladığında çağrılan sayfa, isteğe bağlı olarak özel olarak arama sayfasına döner:

    • Arama sayfasının nasıl tamamlandığını açıklayan durum bilgileri döndürüldü (örneğin, bir kullanıcının Tamam düğmesine mi yoksa İptal düğmesine mi bastığı).

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

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

Bu davranışlar aşağıdaki şekilde gösterilmiştir:

Screenshot shows the flow between calling page and called page.

Çağrılan sayfa olarak kullanarak PageFunction<T> bu davranışları uygulayabilirsiniz.

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

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

Arama Sayfası Oluşturma

öğesini çağıran PageFunction<T> sayfa veya PagePageFunction<T>olabilir. Bu örnekte, aşağıdaki kodda gösterildiği gibi bir Pageşeklindedir.

<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ılacak Sayfa İşlevi Oluşturma

Çağıran sayfa, kullanıcıdan veri toplamak ve döndürmek için çağrılan sayfayı kullanabildiğinden, PageFunction<T> tür bağımsız değişkeni çağrılan sayfanın döndüreceği değerin türünü belirten genel bir sınıf olarak uygulanır. Aşağıdaki kod, çağrılan sayfanın ilk uygulamasını gösterir ve PageFunction<T>bir döndürür 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

bildirimi PageFunction<T> , tür bağımsız değişkenlerinin eklenmesiyle bildirimine Page benzer. Kod örneğinden görebileceğiniz gibi, tür bağımsız değişkenleri hem XAML işaretlemesinde x:TypeArguments hem özniteliği kullanılarak hem de standart genel tür bağımsız değişkeni söz dizimi kullanılarak arka planda kod kullanılarak belirtilir.

Tür bağımsız değişkenleri olarak yalnızca .NET Framework sınıflarını kullanmanız gerekmez. Özel PageFunction<T> tür olarak soyutlanmış etki alanına özgü verileri toplamak için bir çağrılabilir. Aşağıdaki kod, bir için PageFunction<T>tür bağımsız değişkeni olarak özel bir türün nasıl kullanılacağını 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 PageFunction<T> tür bağımsız değişkenleri, aşağıdaki bölümlerde ele alınan bir çağrı sayfası ile çağrılan sayfa arasındaki iletişimin temelini sağlar.

Gördüğünüz gibi, bildirimiyle tanımlanan tür, bir'den PageFunction<T>PageFunction<T> arama sayfasına veri döndürmede önemli bir rol oynar.

PageFunction çağırma ve Parametreleri Geçirme

Bir sayfayı çağırmak için çağrılan sayfanın örneğini oluşturması ve yöntemini kullanarak sayfaya gitmeleri Navigate gerekir. Bu, çağrılan sayfanın çağrılan sayfa tarafından toplanan verilerin varsayılan değerleri gibi ilk verileri çağrılan sayfaya geçirmesine olanak tanır.

Aşağıdaki kod, çağrılan sayfadan parametreleri kabul etmek için parametresiz oluşturucuya sahip çağrılan 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ılan sayfanın örneğini oluşturup ilk dize değerini geçirmek için öğesinin olayını Hyperlink işleyen Click ç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çirmeniz gerekmez. Bunun yerine aşağıdakileri yapabilirsiniz:

Ancak kısa bir süre sonra göreceğiniz gibi, çağrılan sayfanın döndürdiği verileri toplamak için örnek oluşturup çağrılan sayfaya gitmek için kod kullanmanız gerekir. Bu nedenle, canlı PageFunction<T> tutulması gerekir; aksi takdirde, öğesine bir sonraki gitmenizde PageFunction<T>WPF parametresiz oluşturucuyu kullanarak örneğini PageFunction<T> oluşturur.

Ancak çağrılan sayfanın döndürülebilmesi için çağrı sayfası tarafından alınabilecek verileri döndürmesi gerekir.

Görev Sonucunu ve Görev Verilerini Bir Görevden Arama Sayfasına Döndürme

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

  1. Kullanıcının çağrılan sayfayı iptal edip etmediği (bu örnekte Tamam düğmesine veya İptal düğmesine basarak). Bu, çağrı sayfasının, çağrı sayfasının kullanıcıdan topladığı verilerin işlenip işlenmeyeceğini belirlemesine olanak tanır.

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

Bilgi döndürmek PageFunction<T> için yöntemini uygular OnReturn . Aşağıdaki kodda nasıl çağrılacakları gösterilmektedir.

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ı sayfasına değeri null döndürülür. Bunun yerine Tamam düğmesine basılırsa, kullanıcı tarafından sağlanan dize değeri döndürülür. OnReturn , verilerinizi arama sayfasına döndürmek için çağırdığınız bir protected virtual yöntemdir. Verilerinizin, tür bağımsız değişkeni döndüren değerin Result türünü belirten genel ReturnEventArgs<T> türün bir örneğinde paketlenmesi gerekir. Bu şekilde, belirli bir tür bağımsız değişkeniyle bir PageFunction<T> bildirdiğinizde, bir'in PageFunction<T> tür bağımsız değişkeni tarafından belirtilen türün bir örneğini döndüreceğini belirtirsiniz. Bu örnekte tür bağımsız değişkeni ve sonuç olarak dönüş değeri türündedir String.

Çağrıldığında OnReturn , çağıran sayfanın değerinin dönüş değerini almak için bir yol olması PageFunction<T>gerekir. Bu nedenle çağıran PageFunction<T> sayfaların işlemesi Return için olayını uygular. çağrıldığında OnReturn oluşturulur Return , böylece çağrı sayfası bildirimi almak için ile Return kaydolabilir.

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ürdüğünde ve kullanıcı çağrılan sayfayı iptal etmediğinde, arama sayfası 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ılan sayfa döndürdüğünde, çağrı sayfasının daha fazla veri yakalamak için yeni bir arama sayfası oluşturması ve bu sayfaya gitmeleri gerekir.

Ancak, çağrılan bir sayfa günlükten kaldırılmadığı sürece, kullanıcı arama sayfasının önceki bir örneğine geri dönebilir. günlükte a'nın PageFunction<T> tutulup tutulmadığı özelliği tarafından RemoveFromJournal belirlenir. Varsayılan olarak, bir sayfa işlevi olarak ayarlandığından trueçağrıldığında OnReturnRemoveFromJournal otomatik olarak kaldırılır. Çağrıldıktan sonra OnReturn sayfa işlevini gezinti geçmişinde tutmak için falseolarak ayarlayınRemoveFromJournal.

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

Bu konu başlığında, çağrısı/dönüş yapılandırılmış gezintisini desteklemek için en PageFunction<T> temel kullanımı gösterilmektedir. Bu temel size daha karmaşık türde yapılandırılmış gezintiler oluşturma olanağı sağlar.

Örneğin, bazen bir kullanıcıdan yeterli veri toplamak veya bir görev gerçekleştirmek için bir çağrı sayfası için birden çok sayfa gerekir. Birden çok sayfa kullanımına "sihirbaz" denir.

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 Topolojilerine Genel Bakış.

Ayrıca bkz.