WPF中的導(dǎo)航框架概述
有的時(shí)候,我們需要一個(gè)支持頁(yè)面跳轉(zhuǎn)的UI,例如文件瀏覽器,開(kāi)始向?qū)У?。?duì)于這樣的界面,簡(jiǎn)單的可以使用ContentControl + ContentTemplateSelector的方式來(lái)實(shí)現(xiàn),但是有的時(shí)候我們會(huì)需要一些更加高級(jí)的跳轉(zhuǎn)功能,如前進(jìn),回退等。這個(gè)時(shí)候,用這個(gè)方式就稍微有點(diǎn)力不從心了,此時(shí),我們可以使用WPF的導(dǎo)航框架幫助我們快速實(shí)現(xiàn)這一功能。

WPF 的Page框架主要包括兩個(gè)部分,容器和頁(yè)面,
下面就以一個(gè)簡(jiǎn)單的例子來(lái)介紹WPF的Page框架,首先我們創(chuàng)建第一個(gè)頁(yè)面:
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="Page1">
<TextBlock>
<Run>### This is Page 1, Let's go to</Run>
<Hyperlink NavigateUri="Page2.xaml" >Page2</Hyperlink>
</TextBlock>
</Page>然后再創(chuàng)建第二個(gè)頁(yè)面,
<Page xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
Title="Page2">
<TextBlock>
<Run>~~~ This is Page 2, Let's go to</Run>
<Hyperlink Command="BrowseBack" >Page1</Hyperlink>
</TextBlock>
</Page>最后我們?cè)谌萜髦谐休d它們,在WPF中,Page的容器可以是 Window、NavigationWindow、Frame或?yàn)g覽器等,大多數(shù)的時(shí)候用的是Frame和NavigationWindow,因?yàn)樗峁┝艘幌盗袑?dǎo)航相關(guān)的函數(shù),其中Frame更為靈活,這里就以Frame為例來(lái)介紹它的用法:
<Grid>
<Frame x:Name="frame" Source="Page1.xaml" NavigationUIVisibility="Visible" />
</Grid>運(yùn)行上述代碼后,會(huì)得到在如下兩個(gè)頁(yè)面間跳轉(zhuǎn)的導(dǎo)航窗口。點(diǎn)擊Page1的鏈接可以跳轉(zhuǎn)到Page2, 點(diǎn)擊Page2的鏈接可以回退到Page1


頁(yè)面地址:
在WPF的導(dǎo)航框架中,頁(yè)面地址都是用URI來(lái)表示的,并不需要手動(dòng)創(chuàng)建Page對(duì)象(也是可以手動(dòng)創(chuàng)建的),例如Frame中設(shè)置的Source="Page1.xaml",它將起始頁(yè)面的URI設(shè)置為Page.xaml,系統(tǒng)會(huì)自動(dòng)創(chuàng)建Page1對(duì)象。
頁(yè)面跳轉(zhuǎn):
頁(yè)面跳轉(zhuǎn)是通過(guò)NavigationService來(lái)控制的,在Frame和Page中都有該名為NavigationService的對(duì)象,可以通過(guò)它的Navigate函數(shù)來(lái)實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn)。例如前面在Frame中設(shè)置Source="Page1.xaml"實(shí)際上就是通過(guò)如下函數(shù)實(shí)現(xiàn)的跳轉(zhuǎn):
frame.NavigationService.Navigate(new Uri("Page1.xaml", UriKind.Relative));這個(gè)函數(shù)并不僅僅局限于URI,跳轉(zhuǎn)對(duì)象也不僅僅局限于URI,如下方式也都是可以的。
frame.NavigationService.Navigate(new Page1());
frame.NavigationService.Navigate(new Button());
frame.NavigationService.Navigate("Hello world");另外,我們也可以像Page1.xaml種那樣通過(guò)Hyperlink的NavigateUri屬性來(lái)在Page的Xaml中實(shí)現(xiàn)頁(yè)面跳轉(zhuǎn),當(dāng)然,其本質(zhì)也是調(diào)用NavigationService.Navigate來(lái)實(shí)現(xiàn)的。
導(dǎo)航命令:
除了頁(yè)面跳轉(zhuǎn)外,NavigationService還提供了一些基本的導(dǎo)航命令,如前進(jìn),回退,刷新??梢酝ㄟ^(guò)
frame.NavigationService.GoForward();
frame.NavigationService.GoBack();
frame.NavigationService.Refresh();另外,WPF本身提供了一個(gè)標(biāo)準(zhǔn)的導(dǎo)航命令的集合NavigationCommands(比NavigationService),Page和Frame也支持這幾個(gè)命令的綁定(NavigationCommands的命令是比NavigationService能支持的要多的),因此我們可以使用命令行綁定非常方便的調(diào)用這些功能。如Page2種所使用的回退命令:
<Hyperlink Command="BrowseBack" >Page1</Hyperlink>
最后,簡(jiǎn)單的介紹一個(gè)沒(méi)有什么技術(shù)含量,但很常用的功能,那就是Frame對(duì)象的導(dǎo)航工具條的重繪。 Frame對(duì)象本身是帶著一個(gè)導(dǎo)航工具條的,提供了一個(gè)類似IE的前進(jìn)后退功能。將NavigationUIVisibility設(shè)置為Visible或Auto的時(shí)候可見(jiàn)。

但這個(gè)工具條過(guò)于簡(jiǎn)陋,調(diào)試一下還可以,在最終交付的時(shí)候要么隱藏它,要么重寫(xiě)它,重寫(xiě)的方式一般就是改寫(xiě)其Template,如下就是一個(gè)簡(jiǎn)單的例子:
<ControlTemplate TargetType="Frame">
<DockPanel Margin="8">
<StackPanel Margin="4" DockPanel.Dock="Top" Orientation="Horizontal">
<Button Content="Go back" Margin="4" Command="{x:Static NavigationCommands.BrowseBack}" />
<Button Content="Go Forward" Margin="4" Command="{x:Static NavigationCommands.BrowseForward}" />
</StackPanel>
<Border BorderBrush="Orange" Margin="7" BorderThickness="4" Padding="7"
CornerRadius="7" Background="White">
<ContentPresenter />
</Border>
</DockPanel>
</ControlTemplate>但這個(gè)常常用到,以便后續(xù)參考。
小結(jié):
本文主要介紹了WPF的導(dǎo)航框架的基本用法,更多的功能后面再寫(xiě)文章陸續(xù)介紹?;蛘邊⒖次④浌俜降腗SDN:導(dǎo)航概述
到此這篇關(guān)于WPF導(dǎo)航框架的文章就介紹到這了。希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
gridview的buttonfield獲取該行的索引值(實(shí)例講解)
本篇文章主要介紹了gridview的buttonfield獲取該行的索引值(實(shí)例講解)需要的朋友可以過(guò)來(lái)參考下,希望對(duì)大家有所幫助2014-01-01
Unity Shader實(shí)現(xiàn)徑向模糊效果
這篇文章主要為大家詳細(xì)介紹了Unity Shader實(shí)現(xiàn)徑向模糊效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08
C#中一個(gè)高性能異步socket封裝庫(kù)的實(shí)現(xiàn)思路分享
下面小編就為大家分享一篇C#中一個(gè)高性能異步socket封裝庫(kù)的實(shí)現(xiàn)思路,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-11-11
C#實(shí)現(xiàn)路由器斷開(kāi)連接,更改公網(wǎng)ip的實(shí)例代碼
C#實(shí)現(xiàn)路由器斷開(kāi)連接,更改公網(wǎng)ip的實(shí)例代碼,需要的朋友可以參考一下2013-05-05

