WPF导航总结
使用导航的目的是从一个页面进入到另一个页面。无论是预先决定的线性顺序(向导)还是基于层次的用户驱动程序(大部分网站的形式),或者动态生成的路径,主要有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时,导航事件不会被触发!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· 开发者必知的日志记录最佳实践
· SQL Server 2025 AI相关能力初探
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理