C#:wpf ui 4.0 是如何实现页面导航的?

wpf ui 介绍

wpf ui 是一款我比较喜欢的wpf ui界面开源库,目前已经获得了8.5颗stars,还是很受欢迎的:

wpf ui在vs中也提供了快速开发模板:

让wpf开发者可以快速进行应用开发,已经设置好了模板。

但是我发现最新的模板的页面导航方式跟之前不一样了。

先看下wpf ui的迁移文档:

先简单翻译一下:

迁移计划

本页概述了迁移时需要考虑的关键变更和重要细节。它突出了新功能、已更改的内容以及确保顺利过渡所需的步骤。这不是一份完整的逐步指南,而是一个快速参考,帮助您导航迁移过程中最关键的部分。

抽象包

一些 WPF UI 接口已被移动到独立包 WPF-UI.Abstractions。您无需引用它,它将始终随 WPF-UI NuGet 包自动添加。

导航接口

导航接口已移至独立的 WPF-UI.Abstractions 包中。这样,如果你有与其他项目相关的模型、视图或其他业务服务,这些项目不涉及 WPF,你可以在多个应用程序中共同开发它们。

新命名空间

INavigationAware 和 INavigableView 已移动到 Wpf.Ui.Abstractions.Controls 命名空间。

基于依赖注入的页面创建

IPageService 已更名为 INavigationViewPageProvider。

其默认实现位于新的 Wpf.Ui.DependencyInjection 包中。您只需使用 services.AddNavigationViewPageProvider() 扩展方法,然后在导航中指定要使用此接口。然后 NavigationView 将使用 DI 容器进行页面创建。

导航服务

在主包(WPF-UI)中定义的INavigationService使得导航管理变得简单。您可以用它来方便地在视图模型之间进行注入。我们强烈建议将其设置为单例。

它是如何实现页面导航的?

来到App.xaml.cs:

与实现导航有关的三个地方。

运行程序,来到ApplicationHostService.cs:

首先从依赖注入容器中获取INavigationWindow实例。

转到INavigationWindow接口的定义:

定义了几个和导航有关的函数。

下一步在获取INavigationWindow的时候,会先实例化主窗体的ViewModel。

在这里会为NavigationView这个控件设置SetNavigationControl。

请注意这里的RootNavigation就是指在xaml中使用的那个NavigationView控件:

设置了NavigationView控件中的_pageService:

现在来到导航到主页:

再到:

中由于现在_pageService已经设置了,会调用它的GetPage方法:

来到:

来到:

进行内容控件的更新。

现在就来到了首页:

现在我点击Data就会触发NavigationViewItemClick事件:

又是刚刚那样来到NavigateInternal实现页面导航:

还是通过_pageService找到对应页面,然后进行控件内容更新。

然后就会跳转到新的页面:

相关推荐
何以解忧唯有撸码29 分钟前
玩转控件:封装个带图片的Label控件
c#·winform·自定义控件·封装控件·控件扩展
xiaoshuaishuai837 分钟前
C# 实现百度搜索算法逆向
开发语言·windows·c#·dubbo
深兰科技1 小时前
深兰科技与淡水河谷合作推进:矿区示范加速落地
java·人工智能·python·c#·scala·symfony·深兰科技
我是唐青枫4 小时前
C#.NET ObjectPool 深入解析:对象复用、池化策略与使用边界
c#·.net
aq55356005 小时前
Laravel2.x:被遗忘的PHP框架遗珠
开发语言·汇编·c#
光泽雨5 小时前
c#对object sender ,EventArgs e 的解释
开发语言·c#
Eiceblue5 小时前
C# 删除 PDF 页面:单页 / 多页批量删除技巧
前端·pdf·c#
1314lay_10077 小时前
Vue+C#根据配置文件实现动态构建查询条件和动态表格
javascript·vue.js·elementui·c#
叫我黎大侠7 小时前
.NET 实战:调用千问视觉模型实现 OCR(车票识别完整教程)
阿里云·ai·c#·ocr·asp.net·.net·.netcore
唐青枫8 小时前
C#.NET ValueTaskSource 深入解析:零分配异步、ManualResetValueTaskSourceCore 与使用边界
c#·.net