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:

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:
Arama sayfasından:
Parametresiz oluşturucu kullanarak PageFunction<T> çağrılır örneğini oluşturma.
Parametreleri içinde Properties depolar.
adlı klasöre PageFunction<T> gidin.
PageFunction<T>çağrılır:
- içinde depolanan parametreleri alın ve Properties kullanın.
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:
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.
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ış.