使用导航的目的是从一个页面进入到另一个页面。无论是预先决定的线性顺序(向导)还是基于层次的用户驱动程序(大部分网站的形式),或者动态生成的路径,主要有3种方法实现:调用Navigate方法,使用Hyperlinks,使用导航日志。

  Navigate方法

导航容器支持Navigate方法,它允许改变当前页,可以用目标页的示例:

1 NavigateDemoPage  nd=new NavigateDemoPage();
2 this.NavigationService.Navigate(nd);
1 NavigateDemoPage  nd=new NavigateDemoPage();
2 this.NavigationService.Navigate(nd);

或者一个指向目标页的URI来调用Navigate:

this.NavigationService.Navigate(new Uri("NavigateDemoPage.xaml",UriKind.Relative));
this.NavigationService.Navigate(new Uri("NavigateDemoPage.xaml",UriKind.Relative));

由URI指定的Page可以是松散的xaml文件,也可以是编译后的资源,但xaml文件的根元素必须是page。如果想导航到一张html页,则必须使用能够接受一个URI参数的Navigate重载,例如:

this.NavigationService.Navigate(new Uri("http://www.microsoft.com"));

this.NavigationService.Navigate(new Uri("http://www.microsoft.com"));

导航容器同样有两个属性,它们与Navigate的两个重载方法相同,能够通过设置Content属性导航至一个Page实例:

this.NavigationService.Content=NavigateDemoPage;
this.NavigationService.Content=NavigateDemoPage;

也能设置Source属性为一个URI来进行导航:

this.NavigationService.Source=new Uri("NavigateDemoPage",UriKind.Relative);
this.NavigationService.Source=new Uri("NavigateDemoPage",UriKind.Relative);

除了能以声明的方式设置这两个属性外,没有其他理由来用这两个属性替代Navigate方法了!

使用Hyperlink(超链接):

这种行为类似于html中的超链接,它使你能够在TextBlock内嵌入Hyperlink元素,内容将会自动呈现为可被点击的超链接形式,目标页通过Hyperlink中的NavigateUri属性指定,类似于html中的href:

<TextBlock>
Click <Hyperlink NavigateUri="NavigateDemoPage.xaml">here</Hyperlink>here to view more information.
</TextBlock>
<TextBlock>
Click <Hyperlink NavigateUri="NavigateDemoPage.xaml">here</Hyperlink>here to view more information.
</TextBlock>

这么做的目的仅仅是为了提供更为简单的html风格的链接,当然,链接的目标页已经预先知晓。

Hyperlink可以支持更为复杂的功能,与html中的超链接相似,例如,在多个frame的情况下导航至某个frame,可以把Hyperlink的TargetName属性设置为目标frame的名字。为了能够导航到Page的某个小节,可以在URI后面添加一个#号以及一个名字,这个名字表示目标页上任何元素的名字。

使用导航日志

每一个导航容器包含了记录导航历史信息的导航日志,这和web浏览器很像。导航日志提供了后退与前进的逻辑,它在内部维护了两个栈,后退栈和前进栈,用户可以自己初始化后退与前进的动作,也可以通过编程的方法调用导航容器的GoBack和GoForward方法。
     NavigationWindow总有一个导航日志,但是Frame可能没有自己的导航日志,这需要取决于JournalOwnership的属性值。

 类似web浏览器风格的后退和前进动作是由导航日志控制的,但是怎么实现停止与刷新按钮呢?

在任何时候如果想停止一个正在处理的导航操作,可以调用导航容器的StopLoading方法,如果想刷新页面,可以调用导航容器中的Refresh方法,它是没有参数的。

通过设置Page的RemoveFromJournal属性为true可以去除导航日志。

  导航事件

无论导航是否使用Navigate、Hyperlinks或导航日志,它总是以异步方式执行的。许多事件在导航过程中被触发,它们允许你显示富UI,甚至允许你取消导航。

在Navigated被触发之前,NavigationProgress会被周期性触发,这里没有呈现的一个事件为NavigationStopped,如果导航被取消或者有错误发生时,这个事件会被触发,而不是LoadCompleted事件。

注意:当从一页HTML导航至另一页HTML时,导航事件不会被触发

WPF导航总结的更多相关文章

  1. 笔记08 WPF导航

    如何在winform中做导航,如何重定向界面,就产生了争执. 是用window还是Page还是UserControl? 先不管用啥.我们先比较一下各自的优缺点. 在WPF中使用导航,内容被组织在Pag ...

  2. WPF Navigation导航

    WPF导航这个话题,网上的解决方法有很多种,有点吃猪脚的感觉,弃之可惜,食之乏味. 不过还是简单聊聊吧. 常见的导航: 利用HyperLink导航,可以到某一个Page页面,也可以是外部链接,当然也可 ...

  3. WPF学习之路(八)页面

    传统的应用程序中有两类应用程序模式:桌面应用,Web应用.WPF的导航应用程序模糊了这两类应用程序的界限的第三类应用程序 WPF导航表现为两种形式,一是将导航内容寄宿于窗口,二是XAML浏览器应用程序 ...

  4. WPF Navigation

    在开始学习WPF时,一开始对WPF的Window, Page, UserControl感到很迷惑.不知道什么时候该使用哪一个.下面简单介绍一下这三者的区别. Window:故名思意,桌面程序的窗体.在 ...

  5. Prism 4 文档 ---第8章 导航

        作为同用户具有丰富的交互的客户端应用程序,它的用户界面(UI)将会持续不断的更新来反映用户工作的当前的任务和数据.用户界面可以进行一段时间相当大的变化作为用户交互的应用程序中完成各种任务.通过 ...

  6. 22 WPF列表,树,网格

    ListView ListView从ListBox派生,只增加了View属性.如果你没有设置View属性,ListView行为正如ListBox. 从技术上,View属性指向任何ViewBase派生类 ...

  7. .NET Core 3 WPF MVVM框架 Prism系列之导航系统

    本文将介绍如何在.NET Core3环境下使用MVVM框架Prism基于区域Region的导航系统 在讲解Prism导航系统之前,我们先来看看一个例子,我在之前的demo项目创建一个登录界面: 我们看 ...

  8. WPF简单导航框架(Window与Page互相调用)

    相当多的WPF程序都有着丰富的页面和功能,如何使程序在不同页面间转换并降低资源占用,选择适合自己的导航框架就很重要了.最近花了一点时间做了一个简单的导航框架,并在这个过程中对Window.Page.U ...

  9. WPF如何实现一个漂亮的页签导航UI

    最近看到一个比较漂亮的UI主界面,该UI是用左边的页签进行导航,比较有特色,就想着尝试用WPF来实现一下.经过一番尝试,基本上将UI设计图的效果用WPF程序进行了实现.下面介绍一下主要的思路: 1 U ...

随机推荐

  1. ffmpeg 将jpg转为yuv

    ffmpeg -i temp.jpg -s 1024x680 -pix_fmt yuvj420p 9.yuv   此前网上有条盛传的命令 -y -s出来uv是错的

  2. eclipse配置google代码风格

    1.下载google code style的xml文件 地址:https://github.com/google/styleguide 导入xml文件 可能会遇到警告: 版本的问题,忽略即可. < ...

  3. [impala] impala 简介

    [简介] Impala是Cloudera公司主导开发的新型查询系统,它提供SQL语义,能查询存储在Hadoop的HDFS和HBase中的PB级大数据.已有的Hive系统虽然也提供了SQL语义,但由于H ...

  4. C# .NET - Sql Bulk Insert from multiple delimited Textfile using c#.net

    SqlBulkCopy.WriteToServer has 4 overloads:SqlBulkCopy.WriteToServer (DataRow[])    Copies all rows f ...

  5. Axiom3D:Ogre公告板集与合并批次

    在上文中,我们把Ogre里的网格分解成点线面后,我们要完成一个新的功能,在点上突出显示. 得到顶点位置后,这个功能也就是一个很简单的事,最开始是每个顶点添加一个子节点,节点上添加一个圆点. forea ...

  6. 第三百四十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—通过自定义中间件全局随机更换代理IP

    第三百四十八节,Python分布式爬虫打造搜索引擎Scrapy精讲—通过自定义中间件全局随机更换代理IP 设置代理ip只需要,自定义一个中间件,重写process_request方法, request ...

  7. Spring JDBC处理BLOB类型字段

    以下示例将演示使用spring jdbc更新BLOB类型的字段值,即更新student表中的可用记录. student表的结构如下 - CREATE TABLE student( ID INT NOT ...

  8. 架构 : 三层架构、MVC、MVP、MVVM

    1. 三层架构   将整个业务应用划分为:界面层(User Interface layer, UIL).业务逻辑层(Business Logic Layer, BLL).数据访问层(Data acce ...

  9. Python——with语句、context manager类型和contextlib库

    目录 一.with语句 二.上下文管理器 三.contextlib模块 基本概念 上下文管理协议(Context Management Protocol) 包含方法 __enter__() 和 __e ...

  10. 我的openwrt开发相关文章

    openwrt学习笔记: 在openwrt的学习过程中,走了非常多的弯路.一直以来有个期盼.希望能够出个简易教程,希望openwrt的同仁们能够更加高速的入手. . openwrt学习笔记(三十二): ...