有的时候,我们需要一个支持页面跳转的ui,例如文件浏览器,开始向导等。对于这样的界面,简单的可以使用contentcontrol + contenttemplateselector的方式来实现,但是有的时候我们会需要一些更加高级的跳转功能,如前进,回退等。这个时候,用这个方式就稍微有点力不从心了,此时,我们可以使用wpf的导航框架帮助我们快速实现这一功能。

wpf 的page框架主要包括两个部分,容器和页面,

下面就以一个简单的例子来介绍wpf的page框架,首先我们创建第一个页面:

<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>

然后再创建第二个页面,

<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>

最后我们在容器中承载它们,在wpf中,page的容器可以是 window、navigationwindow、frame或浏览器等,大多数的时候用的是frame和navigationwindow,因为它提供了一系列导航相关的函数,其中frame更为灵活,这里就以frame为例来介绍它的用法:

<grid>
    <frame x:name="frame" source="page1.xaml"  navigationuivisibility="visible" />
</grid>

运行上述代码后,会得到在如下两个页面间跳转的导航窗口。点击page1的链接可以跳转到page2, 点击page2的链接可以回退到page1

页面地址:

在wpf的导航框架中,页面地址都是用uri来表示的,并不需要手动创建page对象(也是可以手动创建的),例如frame中设置的source=”page1.xaml”,它将起始页面的uri设置为page.xaml,系统会自动创建page1对象。

页面跳转:

页面跳转是通过navigationservice来控制的,在frame和page中都有该名为navigationservice的对象,可以通过它的navigate函数来实现页面跳转。例如前面在frame中设置source=”page1.xaml”实际上就是通过如下函数实现的跳转:

frame.navigationservice.navigate(new uri("page1.xaml", urikind.relative));

这个函数并不仅仅局限于uri,跳转对象也不仅仅局限于uri,如下方式也都是可以的。

    frame.navigationservice.navigate(new page1());

    frame.navigationservice.navigate(new button());

    frame.navigationservice.navigate("hello world");

另外,我们也可以像page1.xaml种那样通过hyperlink的navigateuri属性来在page的xaml中实现页面跳转,当然,其本质也是调用navigationservice.navigate来实现的。

导航命令:

除了页面跳转外,navigationservice还提供了一些基本的导航命令,如前进,回退,刷新。可以通过

    frame.navigationservice.goforward();

    frame.navigationservice.goback();

    frame.navigationservice.refresh();

另外,wpf本身提供了一个标准的导航命令的集合navigationcommands(比navigationservice),page和frame也支持这几个命令的绑定(navigationcommands的命令是比navigationservice能支持的要多的),因此我们可以使用命令行绑定非常方便的调用这些功能。如page2种所使用的回退命令:

<hyperlink command="browseback" >page1</hyperlink>

 最后,简单的介绍一个没有什么技术含量,但很常用的功能,那就是frame对象的导航工具条的重绘。 frame对象本身是带着一个导航工具条的,提供了一个类似ie的前进后退功能。将navigationuivisibility设置为visible或auto的时候可见。

但这个工具条过于简陋,调试一下还可以,在最终交付的时候要么隐藏它,要么重写它,重写的方式一般就是改写其template,如下就是一个简单的例子:

<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>

但这个常常用到,以便后续参考。

小结:

本文主要介绍了wpf的导航框架的基本用法,更多的功能后面再写文章陆续介绍。或者参看微软官方的msdn:导航概述

到此这篇关于wpf导航框架的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持。