Gezintiye Genel Bakış
Windows Presentation Foundation (WPF), iki tür uygulamada kullanılabilen tarayıcı stili gezinmeyi destekler: tek başına uygulamalar ve XAML tarayıcı uygulamaları (xbap). İçeriği gezinti için paketlemek için WPF Page sınıfı sağlar. ' Yi kullanarak bir veya kullanarak bir Page veya programlı olarak bir ile diğerine gidebilirsiniz HyperlinkNavigationService . WPF, ' den gelen ve geri gitmek için kullanılan sayfaları hatırlama günlüğünü kullanır.
Page, Hyperlink , NavigationService ve Journal, WPF tarafından sunulan gezinti desteğinin çekirdeğini oluşturur. Bu genel bakış, gevşek Extensible Application Markup Language (XAML) dosyaları, HTML dosyaları ve nesneler için gezinti içeren gelişmiş gezinti desteğini kapsamadan önce bu özellikleri ayrıntılı olarak araştırır.
Not
Bu konuda, "Browser" terimi, şu anda Microsoft Internet Explorer ve Firefox içeren WPF uygulamalarını barındırabilen tarayıcılara başvurur. Belirli WPF özelliklerinin yalnızca belirli bir tarayıcı tarafından desteklendiği, tarayıcı sürümüne başvurulur.
WPF uygulamalarında gezinme
Bu konu, WPF 'de anahtar gezinti özelliklerine genel bir bakış sağlar. Bu yetenekler hem tek başına uygulamalar hem de XBAP 'ler için kullanılabilir, ancak bu konu, bunları bir XBAP bağlamı içinde gösterir.
Not
Bu konuda, XBAP oluşturma ve dağıtma konusu ele alınmaktadır. XBAP 'ler hakkında daha fazla bilgi için bkz. WPF XAML tarayıcı uygulamalarına genel bakış.
Bu bölümde, aşağıdaki gezinti yönleri açıklanmaktadır ve gösterilmektedir:
Sayfa uygulama
WPF 'de .NET Framework nesneleri, özel nesneleri, numaralandırma değerlerini, kullanıcı denetimlerini, XAML dosyalarını ve HTML dosyalarını içeren çeşitli içerik türlerine gidebilirsiniz. Bununla birlikte, içerik paketlemeyi kullanmanın en yaygın ve uygun yolunun kullanarak olduğunu fark edeceksiniz Page . Ayrıca, Page görünüşlerinin geliştirilmesi ve geliştirmeyi basitleştirmek için gezintiye özgü özellikler uygular.
Kullanarak Page , aşağıdaki gibi bir biçimlendirme kullanarak XAML içeriğinin gezinebilir bir sayfasını bildirimli olarak uygulayabilirsiniz.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" />
PageXaml biçimlendirmesinde uygulanan bir, Page kök öğesine sahıptır ve WPF XML ad alanı bildirimi gerektirir. PageÖğesi, gitmek ve göstermek istediğiniz içeriği içerir. Page.ContentAşağıdaki biçimlendirmede gösterildiği gibi, özellik öğesini ayarlayarak içerik eklersiniz.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<Page.Content>
<!-- Page Content -->
Hello, Page!
</Page.Content>
</Page>
Page.Content yalnızca bir alt öğe içerebilir; Yukarıdaki örnekte, içerik tek bir dizedir, "Merhaba, sayfa!" Uygulamada, içeriğinizi eklemek ve oluşturmak için genellikle alt öğe (bkz. Page.Content) olarak bir düzen denetimi kullanırsınız.
Bir öğenin alt öğeleri Page bir ve içeriği olarak kabul edilir Page ve sonuç olarak açık bildirimi kullanmanız gerekmez Page.Content . Aşağıdaki biçimlendirme, önceki örneğe bildirime dayalı olarak eşdeğerdir.
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<!-- Page Content -->
Hello, Page!
</Page>
Bu durumda, Page.Content öğesinin alt öğeleriyle otomatik olarak ayarlanır Page . Daha fazla bilgi için bkz. WPF Içerik modeli.
Yalnızca biçimlendirme Page , içerik görüntülemek için yararlıdır. Ancak, Page Ayrıca, kullanıcıların sayfayla etkileşime geçmesini sağlayan denetimleri görüntüleyebilir ve olayları işleyerek ve uygulama mantığını çağırarak kullanıcı etkileşimine yanıt verebilir. Etkileşimli bir Page şekilde, aşağıdaki örnekte gösterildiği gibi biçimlendirme ve arka plan kod birleşimi kullanılarak uygulanır.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.HomePage">
Hello, from the XBAP HomePage!
</Page>
using System.Windows.Controls;
namespace SDKSample
{
public partial class HomePage : Page
{
public HomePage()
{
InitializeComponent();
}
}
}
Imports System.Windows.Controls
Namespace SDKSample
Partial Public Class HomePage
Inherits Page
Public Sub New()
InitializeComponent()
End Sub
End Class
End Namespace
Biçimlendirme dosyası ve arka plan kod dosyasının birlikte çalışmasına izin vermek için aşağıdaki yapılandırma gereklidir:
Biçimlendirme ' de,
Pageöğesix:Classözniteliğini içermelidir. uygulama oluşturulduğunda, biçimlendirme dosyasında mevcut olan,x:ClassMicrosoft derleme altyapısının (MSBuild) 'partialdan türetilen Page ve özniteliği tarafından belirtilen ada sahip bir sınıf oluşturmasına neden olurx:Class. Bu, XAML şeması () için bir XML ad alanı bildiriminin eklenmesini gerektirirxmlns:x="http://schemas.microsoft.com/winfx/2006/xaml". OluşturulanpartialsınıfInitializeComponent, olayları kaydetmek ve biçimlendirmede uygulanan özellikleri ayarlamak için çağırılır.Arka plan kod içinde, sınıf,
partialbiçimlendirme içindeki özniteliği tarafından belirtilen aynı ada sahip bir sınıf olmalıdırx:Classve ' den türetmelidir Page . Bu, arka plan kod dosyasının,partialuygulama oluşturulduğunda biçimlendirme dosyası için oluşturulan sınıfla ilişkilendirilmesini sağlar (bkz.partial).Arka plan kod içinde, Page sınıfının yöntemini çağıran bir Oluşturucu uygulaması gerekir
InitializeComponent.InitializeComponent, biçimlendirme dosyasının oluşturulanpartialsınıfı tarafından olayları kaydetmek ve biçimlendirmede tanımlanan özellikleri ayarlamak için uygulanır.
Not
Visual Studio kullanarak projenize yeni bir eklediğinizde, PagePage her iki biçimlendirme ve arka plan kodu kullanılarak uygulanır ve burada açıklanan biçimlendirme ve arka plan kod dosyaları arasındaki ilişkiyi oluşturmak için gerekli yapılandırmayı içerir.
' A sahip olduktan sonra Page Bu sayfaya gidebilirsiniz. Uygulamanın ilk gittiği adı belirtmek için Page , Başlat 'ı yapılandırmanız gerekir Page .
Başlangıç sayfasını yapılandırma
XBAP 'ler bir tarayıcıda barındırılmak için belirli bir uygulama altyapısı miktarı gerektirir. WPF, Application sınıf gerekli uygulama altyapısını kuran bir uygulama tanımının parçasıdır (bkz. Application).
bir uygulama tanımı genellikle, biçimlendirme dosyası MSBuild öğesi olarak yapılandırıldığında hem biçimlendirme hem de arka plan kodu kullanılarak uygulanır ApplicationDefinition . Aşağıda bir XBAP için uygulama tanımı verilmiştir.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.App" />
using System.Windows;
namespace SDKSample
{
public partial class App : Application { }
}
Imports System.Windows
Namespace SDKSample
Partial Public Class App
Inherits Application
End Class
End Namespace
Bir XBAP, PagePage XBAP başlatıldığında otomatik olarak yüklenen bir başlangıcını belirtmek için uygulama tanımını kullanabilir. Bunu, StartupUri özelliği, istenen için Tekdüzen Kaynak tanımlayıcısı (URI) ile ayarlayarak yapabilirsiniz Page .
Not
Çoğu durumda,, Page bir uygulamayla derlenir veya bir uygulamayla birlikte dağıtılır. Bu gibi durumlarda, öğesini tanımlayan URI, PagePage DÜZENINE uygun bir URI olan bir paket URI 'sidir. Paket URI 'Leri, WPF 'de paket URI 'lerindedaha fazla ele alınmıştır. Ayrıca, aşağıda açıklanan http düzenini kullanarak içeriğe gidebilirsiniz.
StartupUriAşağıdaki örnekte gösterildiği gibi biçimlendirme içinde bildirimli olarak ayarlayabilirsiniz.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.App"
StartupUri="PageWithHyperlink.xaml" />
Bu örnekte, özniteliği, StartupUri giriş sayfası. xaml tanımlayan göreli bir paket URI 'si ile ayarlanır. XBAP başlatıldığında, giriş sayfası. xaml otomatik olarak gezilebilir ve görüntülenir. Bu, bir Web sunucusundan başlatılan bir XBAP 'yi gösteren aşağıdaki şekilde gösterilmiştir.

Not
XBAP geliştirme ve dağıtımı hakkında daha fazla bilgi için bkz. WPF XAML tarayıcı uygulamalarına genel bakış ve WPF uygulaması dağıtma.
Konak penceresinin başlığını, genişliğini ve yüksekliğini yapılandırma
Önceki şekilden fark ettiğiniz bir şey, hem tarayıcının hem de sekme panelinin başlığının XBAP 'nin URI 'sidir. Büyük olmasının yanı sıra başlık etkileyici veya bilgilendirici değildir. Bu nedenle, Page özelliği ayarlayarak başlığı değiştirmeniz için bir yol sunar WindowTitle . Ayrıca, sırasıyla ve ayarlarını yaparak tarayıcı penceresinin genişlik ve yüksekliğini yapılandırabilirsiniz WindowWidthWindowHeight .
WindowTitle, WindowWidth ve WindowHeight Aşağıdaki örnekte gösterildiği gibi biçimlendirme içinde bildirimli olarak ayarlanabilir.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.HomePage"
WindowTitle="Page Title"
WindowWidth="500"
WindowHeight="200">
Hello, from the XBAP HomePage!
</Page>
Sonuç aşağıdaki şekilde gösterilmiştir.

Köprü gezintisi
Tipik bir XBAP çeşitli sayfalar içerir. Bir sayfadan diğerine gitmenin en kolay yolu bir kullanmaktır Hyperlink . HyperlinkPage Aşağıdaki biçimlendirmede gösterilen öğesini kullanarak bildirimli olarak bir öğesine ekleyebilirsiniz Hyperlink .
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
WindowTitle="Page With Hyperlink"
WindowWidth="250"
WindowHeight="250">
<Hyperlink NavigateUri="UriOfPageToNavigateTo.xaml">
Navigate to Another Page
</Hyperlink>
</Page>
Bir Hyperlink öğesi şunları gerektirir:
' Nin, Page özniteliği tarafından belirtildiği gibi, öğesine gitmek için paket URI 'si
NavigateUri.Kullanıcının gezinti işlemini başlatmak için tıklatabilecek içerik (örneğin, metin ve görüntüler
Hyperlink) (öğenin içerebileceği içerik için bkz Hyperlink .).
Aşağıdaki şekilde, öğesine sahip olan bir XBAP gösterilmektedir PageHyperlink .

İstediğiniz gibi, ' Hyperlink ye TıKLAMAK XBAP 'ın Page özniteliği tarafından tanımlanan öğesine gitmesini sağlar NavigateUri . Ayrıca, XBAP, Page Internet Explorer 'Daki son sayfalar listesine bir giriş ekler. Bu, aşağıdaki şekilde gösterilmiştir.

Ayrıca, bir öğesinden diğerine gezinmeyi desteklemenin yanı PageHyperlink sıra parça gezintisini da destekler.
Parça gezintisi
Parça gezintisi , geçerli ya da diğeri içindeki bir içerik parçasına yönelik gezindir Page . WPF 'de, içerik parçası, adlandırılmış bir öğe tarafından içerilen içeriktir. Adlandırılmış bir öğe, Name özniteliği ayarlanmış bir öğedir. Aşağıdaki biçimlendirme TextBlock bir içerik parçası içeren adlandırılmış bir öğeyi gösterir.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
WindowTitle="Page With Fragments" >
<!-- Content Fragment called "Fragment1" -->
<TextBlock Name="Fragment1">
Ea vel dignissim te aliquam facilisis ...
</TextBlock>
</Page>
Bir Hyperlink içerik parçasına gitmek için NavigateUri özniteliği şunları içermelidir:
PageGidilecek içerik parçasının URI 'si.
Bir "#" karakteri.
Pageİçerik parçasını içeren içindeki öğesinin adı.
Bir parça URI 'SI aşağıdaki biçime sahiptir.
PageUriElementName
Aşağıda bir Hyperlink içerik parçasına gitmek için yapılandırılmış bir örneği gösterilmektedir.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
WindowTitle="Page That Navigates To Fragment" >
<Hyperlink NavigateUri="PageWithFragments.xaml#Fragment1">
Navigate To pack Fragment
</Hyperlink>
</Page>
Not
Bu bölüm, WPF 'de varsayılan parça gezintisi uygulamasını açıklar. WPF ayrıca, kısmen olayını işlemeyi gerektiren kendi parça gezinti düzeninizi uygulamanıza olanak tanır NavigationService.FragmentNavigation .
Önemli
Gevşek XAML sayfalarındaki parçalara gidebilirsiniz (kök öğe olarak yalnızca biçimlendirme XAML dosyaları Page ), yalnızca SAYFALARıN http aracılığıyla gözatılabilir olması durumunda olabilir.
Ancak, gevşek bir XAML sayfası kendi parçalara gidebilir.
Gezinti hizmeti
HyperlinkBir kullanıcının belirli bir gezinmede gezinmeyi başlatmasına olanak sağlarken Page , sayfanın bulunması ve indirilmesi işi sınıfı tarafından gerçekleştirilir NavigationService . Temelde, gibi NavigationService istemci kodu adına bir gezinti isteği işleme yeteneği sağlar Hyperlink . Ayrıca, NavigationService bir gezinti isteğini izlemek ve etkili bir şekilde eğmek için daha yüksek düzeyde destek uygular.
Bir Hyperlink tıklandığında, WPF NavigationService.Navigate , Page belirtilen paket URI 'sinde öğesini bulup indirmek için çağırır. İndirilen, Page kök nesnesi indirilen bir örnek olan bir nesne ağacına dönüştürülür Page . Kök nesneye bir başvuru, PageNavigationService.Content özelliğinde depolanır. Gezindiği içeriğin paket URI 'SI NavigationService.Source özelliğinde depolanır, ancak NavigationService.CurrentSource Bu, gezindiği son SAYFANıN paket URI 'sini depolar.
Not
Bir WPF uygulamasının şu anda birden fazla etkin olması mümkündür NavigationService . Daha fazla bilgi için bu konunun ilerleyen kısımlarında bulunan Gezinti konakları bölümüne bakın.
Gezinti hizmeti ile programlama yoluyla gezinme
NavigationServiceGezinmede biçimlendirme sırasında gezinme uygulanıp uygulanmadığı hakkında bilmeniz gerekmez Hyperlink , çünkü sizin HyperlinkNavigationService adınıza kullanır. Yani, a 'nın doğrudan veya dolaylı üst öğesi Hyperlink bir gezinti ana bilgisayarı (bkz. Hyperlink), bir Hyperlink Gezinti isteğini işlemek için gezinti konağının gezinti hizmetini bulup kullanabilirler.
Ancak, NavigationService aşağıdakiler de dahil olmak üzere doğrudan kullanmanız gerektiğinde durumlar vardır:
Parametresiz bir Oluşturucu kullanarak bir örneği oluşturmanız gerektiğinde Page .
Üzerine geçmeden önce üzerinde Özellikler ayarlamanız gerekir Page .
PageGezilmesi gereken, yalnızca çalışma zamanında belirlenebilir.
Bu durumlarda, nesnenin yöntemini çağırarak programlı bir şekilde gezinmeyi başlatmak için kod yazmanız gerekir NavigateNavigationService . Bu, bir başvurusu almayı gerektirir NavigationService .
NavigationService 'e başvuru alma
Gezinti konakları bölümünde ele alınan nedenlerden dolayı bir WPF uygulaması birden fazla olabilir . Bu, kodunuzun, NavigationService genellikle geçerli olan olan bir ' ı bulmak için bir yol olması anlamına gelir NavigationServicePage . Yöntemini çağırarak bir öğesine başvuru alabilirsiniz NavigationServicestaticNavigationService.GetNavigationService . NavigationServiceBelirli bir öğesine gidildiği için, PagePage yönteminin bağımsız değişkeni olarak öğesine bir başvuru geçirin GetNavigationService . Aşağıdaki kod, geçerli için nasıl alınacağını gösterir NavigationServicePage .
using System.Windows.Navigation;
// Get a reference to the NavigationService that navigated to this Page
NavigationService ns = NavigationService.GetNavigationService(this);
' Get a reference to the NavigationService that navigated to this Page
Dim ns As NavigationService = NavigationService.GetNavigationService(Me)
Bir için öğesini bulmak için bir kısayol olarak NavigationServicePage , Page özelliğini uygular NavigationService . Bu, aşağıdaki örnekte gösterilir.
using System.Windows.Navigation;
// Get a reference to the NavigationService that navigated to this Page
NavigationService ns = this.NavigationService;
' Get a reference to the NavigationService that navigated to this Page
Dim ns As NavigationService = Me.NavigationService
Not
PageYalnızca olayını başlatan öğesine bir başvuru alabilir NavigationServicePageLoaded .
Sayfa nesnesine programlama yoluyla gezinme
Aşağıdaki örnek, ile NavigationService programlı olarak bir öğesine gitmek için ' nin nasıl kullanılacağını gösterir Page . PageYalnızca tek, parametresiz bir Oluşturucu kullanılarak örneklendiği için programlı gezinme gereklidir. PageParametresiz oluşturucusu ile aşağıdaki biçimlendirme ve kodda gösterilmektedir.
<Page
x:Class="SDKSample.PageWithNonDefaultConstructor"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="PageWithNonDefaultConstructor">
<!-- Content goes here -->
</Page>
using System.Windows.Controls;
namespace SDKSample
{
public partial class PageWithNonDefaultConstructor : Page
{
public PageWithNonDefaultConstructor(string message)
{
InitializeComponent();
this.Content = message;
}
}
}
Namespace SDKSample
Partial Public Class PageWithNonDefaultConstructor
Inherits Page
Public Sub New(ByVal message As String)
InitializeComponent()
Me.Content = message
End Sub
End Class
End Namespace
PagePage Parametresiz oluşturucusu ile öğesine gider, aşağıdaki biçimlendirme ve kodda gösterilmiştir.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.NSNavigationPage">
<Hyperlink Click="hyperlink_Click">
Navigate to Page with Non-Default Constructor
</Hyperlink>
</Page>
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
namespace SDKSample
{
public partial class NSNavigationPage : Page
{
public NSNavigationPage()
{
InitializeComponent();
}
void hyperlink_Click(object sender, RoutedEventArgs e)
{
// Instantiate the page to navigate to
PageWithNonDefaultConstructor page = new PageWithNonDefaultConstructor("Hello!");
// Navigate to the page, using the NavigationService
this.NavigationService.Navigate(page);
}
}
}
Namespace SDKSample
Partial Public Class NSNavigationPage
Inherits Page
Public Sub New()
InitializeComponent()
End Sub
Private Sub hyperlink_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
' Instantiate the page to navigate to
Dim page As New PageWithNonDefaultConstructor("Hello!")
' Navigate to the page, using the NavigationService
Me.NavigationService.Navigate(page)
End Sub
End Class
End Namespace
HyperlinkBu tıklatıldığında, eksik PagePage oluşturucuyu kullanarak gezinmek ve yöntemi çağırmak için ' i örnekleyerek gezinti başlatılır NavigationService.Navigate . NavigateNavigationServicebir paket URI 'si yerine, gidilecek nesnenin başvurusunu kabul eder.
Paket URI 'SI ile programlama yoluyla gezinme
Program aracılığıyla bir paket URI 'SI oluşturmanız gerekiyorsa (örneğin, çalışma zamanında paket URI 'sini yalnızca belirleyebiliyorsanız), NavigationService.Navigate yöntemini kullanabilirsiniz. Bu, aşağıdaki örnekte gösterilir.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.NSUriNavigationPage">
<Hyperlink Click="hyperlink_Click">Navigate to Page by Pack URI</Hyperlink>
</Page>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
namespace SDKSample
{
public partial class NSUriNavigationPage : Page
{
public NSUriNavigationPage()
{
InitializeComponent();
}
void hyperlink_Click(object sender, RoutedEventArgs e)
{
// Create a pack URI
Uri uri = new Uri("AnotherPage.xaml", UriKind.Relative);
// Get the navigation service that was used to
// navigate to this page, and navigate to
// AnotherPage.xaml
this.NavigationService.Navigate(uri);
}
}
}
Namespace SDKSample
Partial Public Class NSUriNavigationPage
Inherits Page
Public Sub New()
InitializeComponent()
End Sub
Private Sub hyperlink_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
' Create a pack URI
Dim uri As New Uri("AnotherPage.xaml", UriKind.Relative)
' Get the navigation service that was used to
' navigate to this page, and navigate to
' AnotherPage.xaml
Me.NavigationService.Navigate(uri)
End Sub
End Class
End Namespace
Geçerli sayfa yenileniyor
PageÖzelliği, özelliğinde depolanan paket URI 'si ile aynı paket URI 'sine sahipse indirilmez NavigationService.Source . WPF 'yi geçerli sayfayı yeniden indirmeye zorlamak için NavigationService.Refresh Aşağıdaki örnekte gösterildiği gibi yöntemini çağırabilirsiniz.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.NSRefreshNavigationPage">
<Hyperlink Click="hyperlink_Click">Refresh this page</Hyperlink>
</Page>
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
namespace SDKSample
{
public partial class NSRefreshNavigationPage : Page
{
Namespace SDKSample
Partial Public Class NSRefreshNavigationPage
Inherits Page
void hyperlink_Click(object sender, RoutedEventArgs e)
{
// Force WPF to download this page again
this.NavigationService.Refresh();
}
}
}
Private Sub hyperlink_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
' Force WPF to download this page again
Me.NavigationService.Refresh()
End Sub
End Class
End Namespace
Gezinti ömrü
Gördüğünüz gibi, gezintiyi başlatmak için birçok yol vardır. Gezinti başlatıldığında ve gezinme devam ederken, tarafından uygulanan aşağıdaki olayları kullanarak gezintiyi izleyebilir ve etkileyebilirsiniz NavigationService :
Navigating. Yeni bir gezinti istendiğinde gerçekleşir. Gezinmeyi iptal etmek için kullanılabilir.
NavigationProgress. Bir indirme sırasında, gezinti ilerleme bilgileri sağlamak için düzenli aralıklarla gerçekleşir.
Navigated. Sayfa bulunduğunda ve indirildiğinde gerçekleşir.
NavigationStopped. Gezinti durdurulduğunda (çağırarak StopLoading ) veya geçerli bir gezinti sürerken yeni bir gezinti istendiğinde gerçekleşir.
NavigationFailed. İstenen içeriğe gidilirken bir hata ortaya çıktığında gerçekleşir.
LoadCompleted. Gezinilmiş içerik yüklenip ayrıştırıldığında ve işlemeye başladıktan sonra gerçekleşir.
FragmentNavigation. Bir içerik parçasına Gezinti başladığında gerçekleşir, bu durum:
Hemen, istenen parça geçerli içeriktir.
Kaynak içerik yüklendikten sonra, istenen parça farklı içeriklerde yer alıyorsa.
Gezinti olayları aşağıdaki şekilde gösterilen sırayla oluşturulur.

Genel olarak, Page Bu olaylar konusunda endişe yoktur. Bir uygulamanın bunlarla ilgilenmesi daha olasıdır ve bu nedenle, bu olaylar sınıf tarafından da oluşturulur Application :
Her seferinde NavigationService bir olay ortaya geçirirse, Application sınıf ilgili olayı oluşturur. Frame ve NavigationWindow ilgili kapsamlarında gezintiyi algılamak için aynı olayları sunun.
Bazı durumlarda, Page Bu olaylarla ilgileniyor olabilirsiniz. Örneğin, bir, PageNavigationService.Navigating gezintiyi kendinden uzağa iptal edilip edilmeyeceğini tespit etmek için olayı işleyebilir. Bu, aşağıdaki örnekte gösterilir.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.CancelNavigationPage">
<Button Click="button_Click">Navigate to Another Page</Button>
</Page>
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Navigation;
namespace SDKSample
{
public partial class CancelNavigationPage : Page
{
public CancelNavigationPage()
{
InitializeComponent();
// Can only access the NavigationService when the page has been loaded
this.Loaded += new RoutedEventHandler(CancelNavigationPage_Loaded);
this.Unloaded += new RoutedEventHandler(CancelNavigationPage_Unloaded);
}
void button_Click(object sender, RoutedEventArgs e)
{
// Force WPF to download this page again
this.NavigationService.Navigate(new Uri("AnotherPage.xaml", UriKind.Relative));
}
void CancelNavigationPage_Loaded(object sender, RoutedEventArgs e)
{
this.NavigationService.Navigating += new NavigatingCancelEventHandler(NavigationService_Navigating);
}
void CancelNavigationPage_Unloaded(object sender, RoutedEventArgs e)
{
this.NavigationService.Navigating -= new NavigatingCancelEventHandler(NavigationService_Navigating);
}
void NavigationService_Navigating(object sender, NavigatingCancelEventArgs e)
{
// Does the user really want to navigate to another page?
MessageBoxResult result;
result = MessageBox.Show("Do you want to leave this page?", "Navigation Request", MessageBoxButton.YesNo);
// If the user doesn't want to navigate away, cancel the navigation
if (result == MessageBoxResult.No) e.Cancel = true;
}
}
}
Namespace SDKSample
Partial Public Class CancelNavigationPage
Inherits Page
Public Sub New()
InitializeComponent()
' Can only access the NavigationService when the page has been loaded
AddHandler Loaded, AddressOf CancelNavigationPage_Loaded
AddHandler Unloaded, AddressOf CancelNavigationPage_Unloaded
End Sub
Private Sub button_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
' Force WPF to download this page again
Me.NavigationService.Navigate(New Uri("AnotherPage.xaml", UriKind.Relative))
End Sub
Private Sub CancelNavigationPage_Loaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
AddHandler NavigationService.Navigating, AddressOf NavigationService_Navigating
End Sub
Private Sub CancelNavigationPage_Unloaded(ByVal sender As Object, ByVal e As RoutedEventArgs)
RemoveHandler NavigationService.Navigating, AddressOf NavigationService_Navigating
End Sub
Private Sub NavigationService_Navigating(ByVal sender As Object, ByVal e As NavigatingCancelEventArgs)
' Does the user really want to navigate to another page?
Dim result As MessageBoxResult
result = MessageBox.Show("Do you want to leave this page?", "Navigation Request", MessageBoxButton.YesNo)
' If the user doesn't want to navigate away, cancel the navigation
If result = MessageBoxResult.No Then
e.Cancel = True
End If
End Sub
End Class
End Namespace
Bir işleyiciyi bir gezinti olayı ile kaydettiğinizde Page , önceki örnekte olduğu gibi, olay işleyicisinin kaydını da silmeniz gerekir. Bunu yapmazsanız, WPF gezintisinin günlüğü kullanarak gezintiyi hatırlıyor olması açısından yan etkileri olabilir Page .
Günlükle gezinti hatırlama
WPF, bir arka yığın ve bir ileri yığını olan sayfaları anımsamak için iki yığın kullanır. Geçerli PagePage ya da var olan bir yeni ya da ileri ' ye gittiğinizde Page , geçerli bir PagePageeklenir. Geçerli bir Page öncekine geri gittiğinizde Page , geçerli Page olan Pageeklenir. Arka yığın, ileri yığın ve bunları yönetme işlevleri, toplu olarak günlük olarak adlandırılır. Arka yığındaki her öğe ve ileri yığın, sınıfının bir örneğidir JournalEntry ve JournalEntryolarak adlandırılır.
Internet Explorer 'da günlük gezinme
Kavramsal olarak, günlük, Internet Explorer 'daki geri ve İleri düğmeleriyle aynı şekilde çalışır. Bunlar aşağıdaki şekilde gösterilmiştir.

Internet Explorer tarafından barındırılan XBAP 'ler için WPF, Internet Explorer 'ın Gezinti Kullanıcı arabirimindeki günlüğü tümleştirir. Bu, kullanıcıların Internet Explorer 'daki geri, Ilerive son sayfalar düğmelerini kullanarak bir XBAP içindeki sayfalarda gezinmelerini sağlar.
Önemli
Internet Explorer 'da, bir Kullanıcı bir XBAP 'den uzağa ve geri gittiğinde, günlükte yalnızca canlı tutulmayan sayfaların günlük girişleri tutulur. Sayfaların canlı tutulması hakkında tartışma için, bu konunun ilerleyen kısımlarında sayfa ömrü ve günlük bölümüne bakın.
Varsayılan olarak, Page Internet Explorer 'ın Page listesinde görünen her bir metın, için URI 'dir Page . Çoğu durumda bu, kullanıcıya özellikle anlamlı değildir. Neyse ki, aşağıdaki seçeneklerden birini kullanarak metni değiştirebilirsiniz:
İliştirilmiş
JournalEntry.Nameöznitelik değeri.Öznitelik
Page.Titledeğeri.Geçerli
Page.WindowTitleiçin öznitelik değeri ve URI'sı. PageGeçerli için Page URI. (Varsayılan)
Seçeneklerin liste sırası, metni bulmak için öncelik sırasıyla eştir. Örneğin, JournalEntry.Name ayarlanırsa diğer değerler yoksayılır.
Aşağıdaki örnek, bir Page.Title günlük girdisi için görüntülenen metni değiştirmek için özniteliğini kullanır.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.PageWithTitle"
Title="This is the title of the journal entry for this page.">
</Page>
using System.Windows.Controls;
namespace SDKSample
{
public partial class PageWithTitle : Page
{
Namespace SDKSample
Partial Public Class PageWithTitle
Inherits Page
}
}
End Class
End Namespace
WPF Kullanarak Günlükte Gezinme
Bir kullanıcı günlükte Geri,İler ve Son Sayfalar'ı kullanarak günlükte gezinebilir Internet Explorer, wpF tarafından sağlanan hem bildirimsel hem de programlı mekanizmaları kullanarak da günlükte gezinebilirsiniz. Bunu yapmak için sayfalarınıza özel gezinti KULLANıCı'ları sağlamak gerekir.
tarafından ortaya çıkar kullanılan gezinti komutlarını kullanarak günlük gezintisi desteğini bildirimli olarak NavigationCommands ekebilirsiniz. Aşağıdaki örnek, gezinti komutunun nasıl BrowseBack kullanılageldi?
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.NavigationCommandsPage">
<Hyperlink Command="NavigationCommands.BrowseBack">Back</Hyperlink>
<Hyperlink Command="NavigationCommands.BrowseForward">Forward</Hyperlink>
</Page>
Sınıfın aşağıdaki üyelerinden birini kullanarak program aracılığıyla günlükte NavigationService gezinebilirsiniz:
Günlük, bu konunun devamlarında Gezinti Geçmişi ile İçerik Durumunu Koruma konu başlığı altında ele alınarak program aracılığıyla da iş olabilir.
Sayfa Ömrü ve Günlük
Grafikler, animasyonlar ve medya gibi zengin içerik içeren birkaç sayfa içeren bir XBAP düşünün. Özellikle video ve ses medyası kullanılıyorsa, bu tür sayfaların bellek ayak izi oldukça büyük olabilir. Günlükte gezinilen sayfaların "hatırlanıyor" olduğu kabul edilebilirse, böyle bir XBAP hızla büyük ve fark edilebilir miktarda bellek tüketebilir.
Bu nedenle, günlüğün varsayılan davranışı bir nesneye başvuru yerine Page her bir günlük girdisinde meta verileri Page depolamaktır. Bir günlük girdisi'ne gidiliyorsa, belirtilen 'nin Page yeni bir örneğini oluşturmak için meta verileri Page kullanılır. Sonuç olarak, Page gezinen her biri aşağıdaki şekilde gösterilen yaşam süresine sahip olur.

Varsayılan günlük oluşturma davranışını kullanmak bellek tüketiminde tasarruf etse de sayfa başına işleme performansı azaltabilirsiniz; bir yeniden Page kanıtlayan, özellikle de çok fazla içerik varsa, zaman yoğun olabilir. Günlükte bir örneği Page tutmamız gerekirse, bunu yapmak için iki teknik çizebilirsiniz. İlk olarak, yöntemini çağırarak program aracılığıyla Page bir nesneye NavigationService.Navigate gidin.
İkinci olarak, özelliğini olarak ayarerek (varsayılan değerdir) WPF'nin günlükte bir örneğini PageKeepAlivetrue tutması false belirtebilirsiniz. Aşağıdaki örnekte gösterildiği gibi işaretlemede KeepAlive bildirimli olarak ayarlama yapabilirsiniz.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.KeepAlivePage"
KeepAlive="True">
An instance of this page is stored in the journal.
</Page>
Canlı olarak Page tutulan bir için yaşam süresi, yaşam süresi farklı olandan farklıdır. İlk kez canlı tutulan bir'e gidilende, tıpkı canlı tutulmamış Page bir gibi bir örneği Page olur. Ancak, örneğinin bir örneği günlükte tutularak, günlükte olduğu sürece bir daha örneği asla yeniden örnek Page olarak elde edlanamaz. Sonuç olarak, her gidilende çağrılacak bir başlatma mantığı varsa, oluşturucudan olay için bir işleyiciye PagePage taşımanız Loaded gerekir. Aşağıdaki şekilde gösterildiği gibi, ve olayları sırasıyla bir'e her gidilende Loaded ve buradan yine de UnloadedPage yükseltildi.

bir Page canlı tutulmazsa, aşağıdakilerden birini yapmamalıdır:
Bir başvuru veya herhangi bir bölümünü depolar.
Olay işleyicilerini, tarafından uygulanmamış olaylarla kaydetme.
Bunlardan birini yapmak, günlükten kaldırılmış olsa bile bellekte tutulacak olan Page başvurular oluşturmanızı sağlar.
Genel olarak, bir canlı Page tutmama varsayılan davranışını tercih Page edersiniz. Ancak, bunun bir sonraki bölümde ele alınacak durum etkileri vardır.
Gezinti Geçmişi ile İçerik Durumunu Koruma
bir canlı tutulmazsa ve kullanıcıdan veri toplayan denetimlere sahipse, kullanıcı ne olur? PagePage Kullanıcı deneyimi açısından bakıldığında, kullanıcının daha önce girdiği verileri görmeyi beklemesi gerekir. Ne yazık ki, her gezinti ile yeni bir örneği oluşturulduğundan, verileri toplayan denetimler yeniden örnek oluşturulur ve Page veriler kaybolur.
Neyse ki günlük, denetim verileri de dahil olmak üzere Page gezintilerde verileri anımsama desteği sağlar. Özellikle, her biri için günlük Page girişi ilişkili durum için geçici bir kapsayıcı olarak Page davranır. Aşağıdaki adımlarda, bir içinde gezinken bu Page desteğin nasıl kullanıldıkları özetler:
Günlükte geçerli Page için bir giriş eklenir.
durumu, Page bu sayfa için arka yığına eklenen günlük girdisi ile birlikte depolanır.
Yeni, Page 'a gidildi.
Sayfa Page günlüğü kullanılarak sayfasına geri gidilende aşağıdaki adımlar uzer:
Page(arka yığında en üst günlük girdisi) örneği.
Page, için günlük girdisi ile depolanan durumla yenilenir. Page
Page, 'a geri gidildi.
WPF, üzerinde aşağıdaki denetimler kullanılırken bu desteği otomatik olarak Page kullanır:
Bir bu denetimleri kullanıyorsa, aşağıdaki şekilde Sık Kullanılan Renk tarafından da olduğu gibi gezintilerde bunlara PagePagePageListBox veriler anımsanıyor.

bir önceki listede yer alan denetimlerden farklı denetimlere sahipse veya durum özel nesnelerde depolanıyorsa, günlüğün gezintiler arasında durumu hatırlaması için kod PagePage yazmanız gerekir.
Gezintiler arasında küçük durum parçalarını hatırlamaya ihtiyacınız varsa meta veri bayrağıyla yapılandırılmış bağımlılık özelliklerini Page (bkz. DependencyProperty ) FrameworkPropertyMetadata.Journal kullanabilirsiniz.
Gezintilerde hatırlamanız gereken durum birden çok veri parçasına sahipse, tek bir sınıfta durumu kapsülleme ve arabirimini uygulamanın daha az kod yoğun olduğunu PageIProvideCustomContentState bulabilirsiniz.
Tek bir 'nin çeşitli durumları arasında gezinmeniz gerekirse, ve PagePageIProvideCustomContentStateNavigationService.AddBackEntry kullanabilirsiniz.
Tanımlama bilgileri
WPF uygulamalarının verileri depolamanın bir diğer yolu da ve yöntemleri kullanılarak oluşturulan, güncelleştirilen ve silinen tanımlama SetCookieGetCookie bilgileridir. WPF'de oluşturabilirsiniz tanımlama bilgileri, diğer Web uygulaması türlerinin kullanımıyla aynı tanımlama bilgileridir; tanımlama bilgileri, uygulama oturumları sırasında veya bunlar arasında istemci makinede bir uygulama tarafından depolanan rastgele veri parçalarıdır. Tanımlama bilgisi verileri genellikle aşağıdaki biçimde bir ad/değer çifti biçimini alır.
AdıDeğer
Veriler'e geçiriken, tanımlama bilgisinin ayarlandır olduğu konumun yanı sıra bellek içinde bir tanımlama bilgisi oluşturulur ve yalnızca geçerli uygulama oturumu SetCookieUri süresince kullanılabilir. Bu tanımlama bilgisi türü oturum tanımlama bilgisi olarak adlandırılır.
Bir tanımlama bilgisini uygulama oturumları arasında depolamak için, aşağıdaki biçim kullanılarak tanımlama bilgisi için bir sona erme tarihi eklenmiştir.
ADIDEĞER
Son kullanma tarihine sahip bir tanımlama bilgisi, tanımlama Windows süresi dolana kadar yüklemenin Geçici İnternet Dosyaları klasöründe depolanır. Bu tür bir tanımlama bilgisi, uygulama oturumlarında kalıcı olduğu için kalıcı tanımlama bilgisi olarak bilinir.
yöntemini çağırarak hem oturum hem de kalıcı tanımlama bilgilerini alırsınız ve tanımlama GetCookieUri bilgisinin yöntemiyle ayar bulunduğu SetCookie konumun geçirmesi gerekir.
WPF'de tanımlama bilgilerinin desteklene yollarından bazıları aşağıda ve ve aşağıda ve liste listelebildi:
WPF tek başına uygulamaları ve XBAP'ler tanımlama bilgileri oluşturabilir ve yönetebilir.
XBAP tarafından oluşturulan tanımlama bilgilerine tarayıcıdan erişilebilir.
Aynı etki alanındaki XBAP'ler tanımlama bilgilerini oluşturabilir ve paylaşabilir.
Aynı etki alanındaki XBAP'ler ve HTML sayfaları tanımlama bilgileri oluşturabilir ve paylaşabilir.
XBAP'ler ve gevşek XAML sayfaları Web istekleri göndererek tanımlama bilgileri gönderebilirsiniz.
IFRAMES'de barındırılan üst düzey XBAP'ler ve XBAP'ler tanımlama bilgilerine erişebilirsiniz.
WPF'de tanımlama bilgisi desteği, desteklenen tüm tarayıcılar için aynıdır.
Bu Internet Explorer tanımlama bilgileriyle ilgili P3P ilkesi, özellikle birinci taraf ve üçüncü taraf XBAP'ler için WPF tarafından kabul edildi.
Yapılandırılmış Gezinti
Bir veriden diğerine veri geçişi gerekirse, verileri bağımsız değişken olarak parametresiz Page olmayan bir oluşturucuya iletirsiniz. Page Bu tekniği kullanırsanız, canlı tutmanız gerektiğini unutmayın; canlı tutmanız gerekir; yoksa, bir sonraki gezintisinde, WPF parametresiz oluşturucu kullanarak yeniden örnek PagePagePage oluşturur.
Alternatif olarak, Page geçirilleri gereken verilerle ayarlanmış özellikleri de gerçekleştirebilirsiniz. Ancak, verilerin o veriye Page geri geçmesi gerektir olduğunda Page işler karmaşık hale geliyor. Sorun gezintinin, gezindikten sonra bir için döndürüleceklerini garanti etme mekanizmalarını Page yerel olarak desteklemez. Temelde gezinti çağrı/dönüş semantiği desteklemez. Bu sorunu çözmek için WPF, bir için tahmin edilebilir ve yapılandırılmış bir şekilde döndürüldüğüne emin olmak PageFunction<T>Page için kullanabileceğiniz sınıfını sağlar. Daha fazla bilgi için bkz. Yapılandırılmış Gezintiye Genel Bakış.
NavigationWindow Sınıfı
Bu noktaya kadar, gezinilebilir içeriğe sahip uygulamalar derlemek için büyük olasılıkla kullanabileceğiniz gezinti hizmetlerinin oyunlarını gördünüz. Bu hizmetler, XBAP'ler ile sınırlı değildir ancak XBAP'ler bağlamında ele alınmıştır. Modern işletim sistemleri ve Windows uygulamaları, tek başına uygulamalara tarayıcı stili gezintiyi dahil etmek için modern kullanıcıların tarayıcı deneyiminden faydalanmaktadır. Yaygın örnekler şunlardır:
Word Thesaurus:Sözcük seçimlerini gezinme.
Dosya Gezgini:Dosya ve klasörlere gidin.
Sihirbazlar:Karmaşık bir görevi, arasında gezinen birden çok sayfaya kırabilirsiniz. Örnek olarak, Windows ekleme ve kaldırmayı ele alan Windows Sihirbazı örnektir.
Tarayıcı stili gezintiyi tek başına uygulamalarınıza dahil etmek için sınıfını NavigationWindow kullanabilirsiniz. NavigationWindow , Window XBAP'ler tarafından aynı gezinti desteğiyle birlikte türetildi ve genişletildi. Tek başına NavigationWindow uygulamanın ana penceresi olarak veya iletişim kutusu gibi ikincil bir pencere olarak kullanabilirsiniz.
WPF ( , ve gibi) en üst düzey sınıflarında olduğu gibi bir uygulamak için işaretleme ve arka kod NavigationWindowWindowPage birleşimini kullanırnız. Bu, aşağıdaki örnekte gösterilir.
<NavigationWindow
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.MainWindow"
Source="HomePage.xaml"/>
using System.Windows.Navigation;
namespace SDKSample
{
public partial class MainWindow : NavigationWindow
{
public MainWindow()
{
InitializeComponent();
}
}
}
Namespace SDKSample
Partial Public Class MainWindow
Inherits NavigationWindow
Public Sub New()
InitializeComponent()
End Sub
End Class
End Namespace
Bu kod NavigationWindow , açıldığında otomatik olarak bir Page (Ana sayfa. xaml) öğesine giden bir oluşturur NavigationWindow . NavigationWindowAna uygulama penceresuyorsa, öğesini StartupUri başlatmak için özniteliğini kullanabilirsiniz. Bu, aşağıdaki biçimlendirmede gösterilmiştir.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
StartupUri="MainWindow.xaml" />
Aşağıdaki şekilde, NavigationWindow tek başına bir uygulamanın ana penceresi olarak gösterilir.

Bu şekilde, NavigationWindowNavigationWindow önceki örnekteki uygulama kodunda ayarlanmasa bile, ' ın bir başlığına sahip olduğunu görebilirsiniz. Bunun yerine, başlık WindowTitle aşağıdaki kodda gösterilen özelliğini kullanarak ayarlanır.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="Home Page"
WindowTitle="NavigationWindow">
</Page>
WindowWidthVe özelliklerinin ayarlanması WindowHeight de ' nı etkiler NavigationWindow .
Genellikle, NavigationWindow davranışını veya görünümünü özelleştirmeniz gerektiğinde kendi uygulamanızı uygulamanız gerekir. Aksi takdirde, bir kısayolu kullanabilirsiniz. Tek başına bir uygulamada olarak bir öğesinin paket URI 'sini belirtirseniz, PageStartupUriApplication otomatik olarak bir için bir oluşturur NavigationWindowPage . Aşağıdaki biçimlendirmede bunun nasıl etkinleştirileceği gösterilmektedir.
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
StartupUri="HomePage.xaml" />
İletişim kutusu gibi bir ikincil uygulama penceresinin olmasını istiyorsanız NavigationWindow , bu kodu açmak için aşağıdaki örnekteki kodu kullanabilirsiniz.
// Open a navigation window as a dialog box
NavigationWindowDialogBox dlg = new NavigationWindowDialogBox();
dlg.Source = new Uri("HomePage.xaml", UriKind.Relative);
dlg.Owner = this;
dlg.ShowDialog();
' Open a navigation window as a dialog box
Dim dlg As New NavigationWindowDialogBox()
dlg.Source = New Uri("HomePage.xaml", UriKind.Relative)
dlg.Owner = Me
dlg.ShowDialog()
Aşağıdaki şekilde sonuç gösterilmektedir.

Gördüğünüz gibi, NavigationWindow kullanıcıların günlükte gezinmesine izin veren Internet Explorer stili NavigationWindow ve İleri düğmelerini görüntüler. Bu düğmeler, aşağıdaki şekilde gösterildiği gibi aynı kullanıcı deneyimini sağlar.

Sayfalarınız kendi günlük gezintisi desteğini ve Kullanıcı arabirimini sağladıysanız, özelliğinin değerini olarak ayarlayarak, tarafından görünen geri ve İleri düğmelerini gizleyebilirsiniz false .
Alternatif olarak, kendi Kullanıcı arabirimini değiştirmek için WPF 'de özelleştirme desteğini de kullanabilirsiniz NavigationWindow .
Frame sınıfı
Hem tarayıcı hem de NavigationWindow gezinilebilir içerik barındıran Windows. Bazı durumlarda, uygulamalarda bir pencerenin tamamında barındırılması gerekmeyen içerikler vardır. Bunun yerine, bu içerik diğer içeriğin içinde barındırılır. Sınıfını kullanarak, gezinebilir içeriği diğer içeriklere ekleyebilirsiniz Frame . Frame , ve XBAP desteği sağlar NavigationWindow .
Aşağıdaki örnek Frame öğesi kullanılarak bildirimli olarak öğesine nasıl ekleneceğini gösterir PageFrame .
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
WindowTitle="Page that Hosts a Frame"
WindowWidth="250"
WindowHeight="250">
<Frame Source="FramePage1.xaml" />
</Page>
Bu biçimlendirme, ' Source ın başlangıçta gideceği Frame bir paket URI 'si olan öğesinin özniteliğini ayarlar PageFrame . Aşağıdaki şekilde, PageFrame birden çok sayfa arasında gezindiği olan bir XBAP gösterilmektedir.

Yalnızca Frame bir içeriğinin içinde kullanmak zorunda değilsiniz Page . Ayrıca, a içeriğinin içinde barındırmak için de ortaktır FrameWindow .
Varsayılan olarak, Frame yalnızca kendi günlüğünü başka bir günlük yokluğunda kullanır. , Frame Bir veya BIR XBAP içinde barındırılan içeriğin parçasıysa NavigationWindow , Frame veya XBAP 'ye ait olan günlüğü kullanır NavigationWindow . Bazen, ancak Frame kendi günlüğünden sorumlu olması gerekebilir. Bunun bir nedeni, tarafından barındırılan sayfalarda Journal gezintisine izin vermektedir Frame . Bu, aşağıdaki şekilde gösterilmiştir.

Bu durumda, Frame öğesinin özelliğini olarak ayarlayarak kendi günlüğünü kullanacak şekilde yapılandırabilirsiniz JournalOwnershipFrameOwnsJournal . Bu, aşağıdaki biçimlendirmede gösterilmiştir.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
WindowTitle="Page that Hosts a Frame"
WindowWidth="250"
WindowHeight="250">
<Frame Source="FramePage1.xaml" JournalOwnership="OwnsJournal" />
</Page>
Aşağıdaki şekilde kendi günlüğünü kullanan bir içinde gezinmenin etkisi gösterilmektedir Frame .

Günlük girişlerinin, Internet Explorer yerine, içindeki gezinti kullanıcı arabirimi tarafından gösterildiğine dikkat edin Frame .
Not
Frame, Bir içinde barındırılan içeriğin parçasıysa WindowFrame kendi günlüğünü kullanır ve sonuç olarak kendi gezinti kullanıcı arabirimini görüntüler.
Kullanıcı deneyiminizin, Frame Gezinti Kullanıcı arabirimini göstermeden kendi günlüğünü sağlaması gerekiyorsa, öğesini olarak ayarlayarak Gezinti Kullanıcı arabirimini gizleyebilirsiniz NavigationUIVisibilityHidden . Bu, aşağıdaki biçimlendirmede gösterilmiştir.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
WindowTitle="Page that Hosts a Frame"
WindowWidth="250"
WindowHeight="250">
<Frame
Source="FramePage1.xaml"
JournalOwnership="OwnsJournal"
NavigationUIVisibility="Hidden" />
</Page>
Gezinti konakları
Frame ve NavigationWindow , gezinti konakları olarak bilinen sınıflardır. Gezinti ana bilgisayarı , içeriğe gidebileceğiniz ve içeriği görüntüleyebilen bir sınıftır. Bunu gerçekleştirmek için, her bir gezinti ana bilgisayarı kendi NavigationService ve günlüğünü kullanır. Bir gezinti konağının temel yapımı aşağıdaki şekilde gösterilmiştir.

Temelde, bu, NavigationWindowFrame bir XBAP 'nin tarayıcıda barındırılırken sağladığı gezinti desteğinin aynısını sağlamasına izin verir.
NavigationServiceVe bir günlüğü kullanmanın yanı sıra, gezinti konakları, uygulayan aynı üyeleri uygular NavigationService . Bu, aşağıdaki şekilde gösterilmiştir.

Bu, gezinti desteğini doğrudan bunlara karşı programbırakmanıza olanak tanır. ' De barındırılan bir için özel bir gezinti kullanıcı arabirimi sağlamanız gerekiyorsa bunu göz önünde bulundurabilir FrameWindow . Ayrıca, her iki tür de (,) ve (,) dahil olmak üzere ek, gezintide ilgili Üyeler uygular, BackStackNavigationWindow.BackStack Bu da Frame.BackStackForwardStackNavigationWindow.ForwardStackFrame.ForwardStack arka yığında ve ileriye doğru yığındaki günlük girişlerini listeletmeniz sağlar.
Daha önce belirtildiği gibi, bir uygulama içinde birden çok günlük bulunabilir. Aşağıdaki şekilde, bunun gerçekleşene zaman gerçekleşebileceğinizi bir örnek verilmiştir.

XAML sayfaları dışındaki Içeriğe gitme
Bu konu başlığı altında, Page WPF 'nin çeşitli gezinti yeteneklerini göstermek için Pack XBAP 'ler kullanılmıştır. Ancak, bir Page uygulamaya derlenen tek içerik türü değildir ve Pack XBAP, içeriği belirlemenin tek yolu değildir.
Bu bölümde gösterildiği gibi, gevşek XAML dosyalarına, HTML dosyalarına ve nesnelerine de gidebilirsiniz.
Gevşek XAML dosyalarına gitme
Gevşek XAML dosyası, aşağıdaki özelliklere sahip bir dosyadır:
Yalnızca XAML içerir (kod yok).
Uygun bir ad alanı bildirimine sahiptir.
. Xaml dosya adı uzantısına sahiptir.
Örneğin, gevşek XAML dosyası olan Person. xaml olarak depolanan aşağıdaki içeriği göz önünde bulundurun.
<!-- Person.xaml -->
<TextBlock xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<TextBlock FontWeight="Bold">Name:</TextBlock>
<TextBlock>Nancy Davolio</TextBlock>
<LineBreak />
<TextBlock FontWeight="Bold">Favorite Color:</TextBlock>
<TextBlock>Yellow</TextBlock>
</TextBlock>
Dosyaya çift tıkladığınızda tarayıcı açılır ve ' a gider ve içeriği görüntüler. Bu, aşağıdaki şekilde gösterilmiştir.

Gevşek bir XAML dosyasını aşağıdakilerden bir şekilde görüntüleyebilirsiniz:
Yerel makinedeki, intranetteki veya Internet 'teki bir Web sitesi.
Evrensel adlandırma kuralı (UNC) dosya paylaşma.
Yerel disk.
Gevşek bir XAML dosyası tarayıcının sık kullanılanlarına eklenebilir veya tarayıcının giriş sayfası olabilir.
Not
Gevşek XAML sayfalarını yayımlama ve başlatma hakkında daha fazla bilgi için bkz. WPF uygulaması dağıtma.
Gevşek XAML ile ilgili bir sınırlama, yalnızca kısmi güvende çalıştırmak için güvenli olan içeriği barındırmanıza olanak sağlar. Örneğin, Window gevşek BIR xaml dosyasının kök öğesi olamaz. Daha fazla bilgi için bkz. WPF Kısmi güven güvenliği.
Çerçeve kullanarak HTML dosyalarına gitme
Tahmin edebileceğiniz gibi, HTML 'ye de gidebilirsiniz. Yalnızca http düzenini kullanan bir URI sağlamanız gerekir. Örneğin, aşağıdaki XAML bir Frame HTML sayfasına giden bir gösterir.
<Frame Source="http://www.microsoft.com/default.aspx" />
HTML 'ye gitmek için özel izinler gerekir. Örneğin, Internet bölgesi kısmi güven güvenlik korumalı alanı ' nda çalışan bir XBAP 'den geziniyorsunuz. Daha fazla bilgi için bkz. WPF Kısmi güven güvenliği.
WebBrowser denetimini kullanarak HTML dosyalarına gitme
WebBrowserDENETIM HTML belgesi barındırma, gezinti ve betik/yönetilen kod birlikte çalışabilirliği destekler. Denetimle ilgili ayrıntılı bilgi için WebBrowser bkz WebBrowser ..
Benzer Frame şekilde, HTML 'ye gidildiğinde WebBrowser özel izinler gerekir. Örneğin, kısmi güven uygulamasından yalnızca kaynak sitesinde bulunan HTML 'ye gidebilirsiniz. Daha fazla bilgi için bkz. WPF Kısmi güven güvenliği.
Özel nesnelere gitme
Özel nesneler olarak depolanan verileriniz varsa, bu verileri görüntülemenin bir yolu, Page Bu nesnelere bağlanan içeriğe sahip bir oluşturmak (bkz. Page). Yalnızca nesneleri görüntüleyen bir sayfanın tamamını oluşturmak için ek yüke gerek yoksa, bunun yerine doğrudan bunlara gidebilirsiniz.
PersonAşağıdaki kodda uygulanan sınıfı göz önünde bulundurun.
using System.Windows.Media;
namespace SDKSample
{
public class Person
{
string name;
Color favoriteColor;
public Person() { }
public Person(string name, Color favoriteColor)
{
this.name = name;
this.favoriteColor = favoriteColor;
}
public string Name
{
get { return this.name; }
set { this.name = value; }
}
public Color FavoriteColor
{
get { return this.favoriteColor; }
set { this.favoriteColor = value; }
}
}
}
Namespace SDKSample
Public Class Person
Private _name As String
Private _favoriteColor As Color
Public Sub New()
End Sub
Public Sub New(ByVal name As String, ByVal favoriteColor As Color)
Me._name = name
Me._favoriteColor = favoriteColor
End Sub
Public Property Name() As String
Get
Return Me._name
End Get
Set(ByVal value As String)
Me._name = value
End Set
End Property
Public Property FavoriteColor() As Color
Get
Return Me._favoriteColor
End Get
Set(ByVal value As Color)
Me._favoriteColor = value
End Set
End Property
End Class
End Namespace
Bu sayfaya gitmek için NavigationWindow.Navigate aşağıdaki kodda gösterildiği gibi yöntemini çağırın.
<Page
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="SDKSample.HomePage"
WindowTitle="Page that Navigates to an Object">
<Hyperlink Name="hyperlink" Click="hyperlink_Click">
Navigate to Nancy Davolio
</Hyperlink>
</Page>
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace SDKSample
{
public partial class HomePage : Page
{
public HomePage()
{
InitializeComponent();
}
void hyperlink_Click(object sender, RoutedEventArgs e)
{
Person person = new Person("Nancy Davolio", Colors.Yellow);
this.NavigationService.Navigate(person);
}
}
}
Namespace SDKSample
Partial Public Class HomePage
Inherits Page
Public Sub New()
InitializeComponent()
End Sub
Private Sub hyperlink_Click(ByVal sender As Object, ByVal e As RoutedEventArgs)
Dim person As New Person("Nancy Davolio", Colors.Yellow)
Me.NavigationService.Navigate(person)
End Sub
End Class
End Namespace
Aşağıdaki şekilde sonuç gösterilmektedir.

Bu şekilde, hiçbir şeyin yararlı görüntülendiğini görebilirsiniz. Aslında, görüntülenen değer ToStringToString nesnesi için yöntemin dönüş değeridir; varsayılan olarak, WPF 'in nesneyi temsil etmek için kullanabileceği tek değerdir. ToStringDaha anlamlı bilgiler döndürmek için yöntemi geçersiz kılabilir, ancak yalnızca bir dize değeri olmaya devam eder. WPF 'in sunum özelliğinden yararlanan kullanabileceğiniz bir teknik, veri şablonu kullanmaktır. WPF'nin belirli bir türe sahip bir nesneyle ilişkilendirilen bir veri şablonu gerçekleştirebilirsiniz. Aşağıdaki kod, nesnesi için bir veri şablonu Person gösterir.
<Application
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.App"
StartupUri="HomePage.xaml">
<Application.Resources>
<!-- Data Template for the Person Class -->
<DataTemplate DataType="{x:Type local:Person}">
<TextBlock xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
<TextBlock FontWeight="Bold">Name:</TextBlock>
<TextBlock Text="{Binding Path=Name}" />
<LineBreak />
<TextBlock FontWeight="Bold">Favorite Color:</TextBlock>
<TextBlock Text="{Binding Path=FavoriteColor}" />
</TextBlock>
</DataTemplate>
</Application.Resources>
</Application>
Burada veri şablonu, özniteliğinde Person işaretleme uzantısı kullanılarak x:Type türle DataType ilişkilendirildi. Veri şablonu daha sonra TextBlock öğeleri (bkz. TextBlock ) sınıfının özelliklerine Person bağlar. Aşağıdaki şekilde nesnenin güncelleştirilmiş görünümü Person gösterir.

Bu tekniğin bir avantajı, uygulamanın herhangi bir yerinde nesnelerinizi tutarlı bir şekilde görüntülemek için veri şablonunu yeniden kullanamakla elde edilen tutarlılıktır.
Veri şablonları hakkında daha fazla bilgi için bkz. Veri Şablonu Oluşturmaya Genel Bakış.
Güvenlik
WPF gezinti desteği, XBAP'ların İnternet üzerinden gezinmelerini sağlar ve uygulamaların üçüncü taraf içeriği barındırmalarını sağlar. Hem uygulamaları hem de kullanıcıları zararlı davranışlardan korumak için WPF, Güvenlik ve WPF Kısmi Güven Güvenliği konularına yer alan çeşitli güvenlik özellikleri sağlar.