当前位置:首页 > 谈天说地

WPF中的导航框架概述

34资源网2022-06-25582

有的时候,我们需要一个支持页面跳转的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导航框架的文章就介绍到这了。希望对大家的学习有所帮助,也希望大家多多支持萬仟网。

版权声明:34楼发布

本文链接:https://www.34l.com/post/18000.html

分享给朋友:

相关文章

苏格拉底的经典语录有哪些?分享52句苏格拉底经典语录

苏格拉底的经典语录有哪些?分享52句苏格拉底经典语录

很多人问苏格拉底的经典语录有哪些?今天小编就针对大家的疑问,给大家分享52句苏格拉底经典语录,希望对大家有所帮助。…

抖音长视频怎么开通?抖音开通长视频的权限分享

抖音长视频怎么开通?抖音开通长视频的权限分享

经常玩抖音的朋友来说开通抖音1分钟长视频已经不是一件难事了。大家都知道抖音默认视频长度为15秒。只有达到一定要求才可以获得长视频权限。但是现在我们发现能发抖音长视频的朋友越来越多了。他们是怎么做到的呢?抖音怎么发长1分钟视频呢?抖音长视频是…

视频号入口在哪里(视频号直播入口新手手册)

视频号入口在哪里(视频号直播入口新手手册)

视频号助手在哪里?视频号助手什么时候上线?微信视频号助手正式上线目前微信视频号助手已经开始内测使用了,大家可以直接在PC端扫码登录,管理自己的视频号,可以看到自己的各项动态数据,非常方便管理。 视频号助手在哪里 视频号助手在哪里? 手机微…

联想新手机什么时候上市(联想2021即将上市新款笔记本)

联想新手机什么时候上市(联想2021即将上市新款笔记本)

11月8日,联想中国区手机业务部总经理发布了一则新机预告:摩托罗拉edge X的发布已进入倒计时阶段,在骁龙898处理器即将发布之际预告新机,很大可能预示着首发权已到手。…

网易云:生而破发,我很抱歉

网易云:生而破发,我很抱歉

图源:摄图网 编者按:本文来自微信公众号财经新知(ID:caijingxinzhi),创业邦经授权转载 云村村长磊磊昨天好忙哦,搞了一个元宇宙的敲钟仪式,但还是阻挡不了破发的命运。 村长昨天敲钟分享的四首歌还记得吗:四次敲锣,四种心境。如…

电竞酒店,是“躺赢”的好生意吗?

电竞酒店,是“躺赢”的好生意吗?

图源:摄图网 编者按:本文来自微信进击波财经(ID:jinbubo),作者:进击波大商业组,编辑:mark,总编:沈帅波,创业邦经授权转载 电竞酒店,网吧的终场? “开黑,搞起!” 国庆期间,我和两位同行的朋友,在成都的春熙路商圈,体验了一…