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:
Ç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:
Arama sayfasından:
Parametresiz oluşturucuyu kullanarak çağrılan PageFunction<T> örneği oluşturma.
parametrelerini içinde Propertiesdepolayın.
adlı PageFunction<T>öğesine gidin.
adlı PageFunction<T>kaynaktan:
- içinde Propertiesdepolanan parametreleri alın ve kullanın.
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:
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.
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 false
olarak 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.
.NET Desktop feedback