Avalonia中使用Prism实现区域导航功能

前言

上一篇文章我们讲了在Avalonia开发中,引入Prism框架来完成项目的MVVM迁移。本章内容将带领大家学习如何在Avalonia中使用Prism框架实现区域导航功能。如果你还不知道Avalonia中如何引入Prism框架,请看我上一篇文章:Avalonia框架下面使用Prism框架实现MVVM模式

新建导航页

我们首先在相应的文件夹下面创建ViewA、ViewB以及他们所对应的ViewModel,创建好的目录结构如下:
在这里插入图片描述
创建View和WPF里面差不多,但是Avalonia需要手动的指定绑定的VM的DataType类型。其实通过后面的验证,其实指定不指定其实在Prism框架下面没有影响,项目依然能够正常运行。但是有一个问题就是如果你设置了DataType类型,你在后期界面绑定数据的时候会有智能提示出来方便开发。
在这里插入图片描述
这里有个小细节需要 特别注意,这里面有个小bug,我们创建的ViewModel或者新引入nuget动态库文件以后,如果我们想在view里面进行引用,应该先全局生成一下解决方案,这样在编码的时候才能出现智能提示,希望官方后期能够修复这个bug.

创建ViewModel

创建ViewModel,这里面其实和WPF里面是一样的,这里就不在赘述,代码如下:

using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace AvaloniaTest.ViewModels
{public class ViewAViewModel : ViewModelBase, INavigationAware{private string _title="ViewA";public string Title{get => _title; set{SetProperty(ref _title, value);}}public bool IsNavigationTarget(NavigationContext navigationContext){return true;}public void OnNavigatedFrom(NavigationContext navigationContext){}public void OnNavigatedTo(NavigationContext navigationContext){}}
}

容器里面注册导航资源

我们在App.xaml里面注册导航用到的ViewA和ViewB,代码如下:

    protected override void RegisterTypes(IContainerRegistry containerRegistry){containerRegistry.Register<MainView>();containerRegistry.RegisterForNavigation<ViewA,ViewAViewModel>(nameof(ViewA));containerRegistry.RegisterForNavigation<ViewB,ViewBViewModel>(nameof(ViewB));}

在这里插入图片描述

创建显示区域

在MainView里面创建显示区域,其实和WPF里面是一模一样的。
在这里插入图片描述

ViewModel里面的导航实现

这里面主要通过构造函数传过来一个IRegionManager参数,然后通过这个区域管理对象对我们的区域实现导航功能,其实实现也都和WPF里面一样。
在这里插入图片描述

完整的代码实现

MainView.axaml

<UserControl xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:vm="clr-namespace:AvaloniaTest.ViewModels"xmlns:prism="http://prismlibrary.com/"mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"x:Class="AvaloniaTest.Views.MainView"prism:ViewModelLocator.AutoWireViewModel="True"x:DataType="vm:MainViewModel"><Design.DataContext><!-- This only sets the DataContext for the previewer in an IDE,to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) --></Design.DataContext><Grid RowDefinitions="50,*"><Grid ColumnDefinitions="*,*,*"><TextBlock Text="{Binding Greeting}" HorizontalAlignment="Center" VerticalAlignment="Center"/><Button Content="ViewA" Grid.Column="1" Command="{Binding ViewACommand}"></Button><Button Content="ViewB" Grid.Column="2" Command="{Binding ViewBCommand}"></Button></Grid><ContentControl Grid.Row="1" prism:RegionManager.RegionName="mainContent"></ContentControl></Grid></UserControl>

MainViewModel.cs

using AvaloniaTest.Views;
using Prism.Commands;
using Prism.Regions;namespace AvaloniaTest.ViewModels;public class MainViewModel : ViewModelBase
{private readonly IRegionManager _regionManager;public MainViewModel(IRegionManager regionManager) {_regionManager = regionManager;_regionManager.RegisterViewWithRegion("mainContent", nameof(ViewB));ViewACommand = new DelegateCommand(() => {_regionManager.RequestNavigate("mainContent", nameof(ViewA));});ViewBCommand = new DelegateCommand(() => {_regionManager.RequestNavigate("mainContent", nameof(ViewB));});}public DelegateCommand ViewACommand { get; set; }public DelegateCommand ViewBCommand { get; set; }public string Greeting => "Welcome to Avalonia!";}

ViewA.axaml

<UserControl xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:vm="using:AvaloniaTest.ViewModels"mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"x:DataType="vm:ViewAViewModel"x:Class="AvaloniaTest.Views.ViewA" Background="Red"><TextBlock Text="{Binding Title}"></TextBlock>
</UserControl>

ViewAViewModel.cs

using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace AvaloniaTest.ViewModels
{public class ViewAViewModel : ViewModelBase, INavigationAware{private string _title="ViewA";public string Title{get => _title; set{SetProperty(ref _title, value);}}public bool IsNavigationTarget(NavigationContext navigationContext){return true;}public void OnNavigatedFrom(NavigationContext navigationContext){}public void OnNavigatedTo(NavigationContext navigationContext){}}
}

ViewB.axaml

<UserControl xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft.com/expression/blend/2008"xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"xmlns:prism="http://prismlibrary.com/"prism:ViewModelLocator.AutoWireViewModel="True"mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"x:Class="AvaloniaTest.Views.ViewB" Background="Green"><TextBlock Text="{Binding Title}"></TextBlock>
</UserControl>

ViewBViewModel.cs

using Prism.Regions;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;namespace AvaloniaTest.ViewModels
{public class ViewBViewModel : ViewModelBase, INavigationAware{private string _title = "ViewB";public string Title{get => _title;set{SetProperty(ref _title, value);}}public bool IsNavigationTarget(NavigationContext navigationContext){return true;}public void OnNavigatedFrom(NavigationContext navigationContext){}public void OnNavigatedTo(NavigationContext navigationContext){}}
}

App.axaml

<prism:PrismApplication xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:prism="http://prismlibrary.com/"x:Class="AvaloniaTest.App"RequestedThemeVariant="Default"><!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. --><Application.Styles><FluentTheme /></Application.Styles>
</prism:PrismApplication>

App.axaml.cs

using Avalonia;
using Avalonia.Controls.ApplicationLifetimes;
using Avalonia.Markup.Xaml;
using AvaloniaTest.ViewModels;
using AvaloniaTest.Views;
using Prism.DryIoc;
using Prism.Ioc;namespace AvaloniaTest;public partial class App : PrismApplication
{public override void Initialize(){AvaloniaXamlLoader.Load(this);base.Initialize();}public override void OnFrameworkInitializationCompleted(){//if (ApplicationLifetime is IClassicDesktopStyleApplicationLifetime desktop)//{//    desktop.MainWindow = new MainWindow//    {//        DataContext = new MainViewModel()//    };//}//else if (ApplicationLifetime is ISingleViewApplicationLifetime singleViewPlatform)//{//    singleViewPlatform.MainView = new MainView//    {//        DataContext = new MainViewModel()//    };//}base.OnFrameworkInitializationCompleted();}protected override AvaloniaObject CreateShell(){return Container.Resolve<MainWindow>();}protected override void RegisterTypes(IContainerRegistry containerRegistry){containerRegistry.Register<MainView>();containerRegistry.RegisterForNavigation<ViewA,ViewAViewModel>(nameof(ViewA));containerRegistry.RegisterForNavigation<ViewB,ViewBViewModel>(nameof(ViewB));}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/201819.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

跨文化合作指南:与海外网红沟通的不可忽视的文化差异

随着社交媒体的飞速发展&#xff0c;海外网红在全球范围内崭露头角&#xff0c;成为品牌推广和文化传播的重要力量。然而&#xff0c;由于不同国家和地区存在着独特的文化差异&#xff0c;与海外网红进行沟通合作时&#xff0c;我们必须认真对待文化差异&#xff0c;以确保合作…

Python-赋值运算符(详解)

表示赋值 左侧为变量&#xff0c;右边为值 a b 10#先把10赋值给b&#xff0c;再把b赋值给a 相当于a 10 b 10 链式赋值&#xff0c;但是不推荐&#xff0c;一般一行一个语句&#xff0c;提高可读性&#xff0c;良好的代码风格 多元赋值&#xff1a; a , b 10,20 #python语…

Word使用相关——(待完善)

1.word 怎样删除分节符 2.word 怎样删除目录中的分节符 欢迎使用Markdown编辑器 你好&#xff01; 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Markdown编辑器, 可以仔细阅读这篇文章&#xff0c;了解一下Markdown的基本语法知识。 新的改变 我…

时序数据库TDengine安装及c#连接读写数据

物联网数据采集&#xff0c;需写入大量数据&#xff0c;这时就用到时序数据库来存储和快速读取 我个人使用感觉国产的开源项目TDengine&#xff0c;比InfluxDB操作方便很多&#xff0c;容易上手&#xff0c;支持使用SqlSugar进行数据操作&#xff0c;跟操作mysql数据库一样的体…

使用Selenium模拟人工操作及获取网页内容

使用Selenium抓取网页动态内容 根据权威机构发布的全球互联网可访问性审计报告&#xff0c;全球约有四分之三的网站其内容或部分内容是通过JavaScript动态生成的&#xff0c;这就意味着在浏览器窗口中“查看网页源代码”时无法在HTML代码中找到这些内容&#xff0c;也就是说我们…

Ps:文字操作常用快捷键

对文字的设置操作&#xff0c;可在工具选项栏或“字符”面板上进行。但是&#xff0c;如果能记住并使用快捷键&#xff0c;可大大提高工作效率。 设置文字颜色 Color 1、选中几个或全部文字后&#xff0c;除了使用工具选项栏上的“颜色”按钮&#xff0c;还可以使用快捷键 Alt…

Java IO流:基本概念

一、IO 概念 ・I/O 即输入 Input/ 输出 Output 的缩写&#xff0c;其实就是计算机调度把各个存储中&#xff08;包括内存和外部存储&#xff09;的数据写入写出的过程&#xff1b; ・java 中用 “流&#xff08;stream&#xff09;” 来抽象表示这么一个写入写出的功能&#…

吴恩达《机器学习》11-3-11-5:类偏斜的误差度量、查准率和查全率之间的权衡、机器学习的数据

一、类偏斜的误差度量 误差度量的关键性 之前的课程中已经提到了误差分析和设定误差度量值的重要性。评估学习算法并衡量其表现需要使用一个实数&#xff0c;这就是误差度量值。然而&#xff0c;在某些情况下&#xff0c;特别是当处理偏斜类时&#xff0c;选择正确的误差度量…

如何使用Python核对文件夹内的文件

说明&#xff1a;日常工作中&#xff0c;我们经常会遇到这样的场景&#xff1a;核对A、B文件夹中文件的差异&#xff0c;找出A、B文件夹中不同部分的文件&#xff1b; 本文介绍如何使用Python来实现&#xff1b; 第一步&#xff1a;获取文件清单 首先&#xff0c;我们要获取…

Navicat 与 华为云 GaussDB 合作再升级,赋能 GaussDB 分布式数据库

2023 年第三季度&#xff0c;Navicat 首次支持了华为云 GaussDB 主备版数据库。经过双方团队进一步的深化合作&#xff0c;Navicat 完成了 GaussDB 分布式的研发适配工作&#xff0c;赋能 GaussDB 全域数据库产品。 GaussDB 数据库分为主备版和分布式版两种模式。主备版适用于…

Spingboot 之spring-boot-starter-parent与spring-boot-dependencies区分

在创建spring boot工程时&#xff0c;spring-boot-starter-parent 和 spring-boot-dependencies是二选一的关系&#xff0c;在pom中引入其中一个就可以了。 那么什么时候用spring-boot-starter-parent 和 spring-boot-dependencies呢&#xff1f;从字面名称上看&#xff0c;如…

履带吊,笔记

0.前言 履带吊使用了与传统的门桥式起重机不同的技术路线。因为它是移动式设备&#xff0c;所以它的动力是燃油发动机。为了精确调控升降。它的整套动力系统似乎采用了某种液压传动系统。履带吊国内也有生产商。但是下文中&#xff0c;还是从国外的一款产品说起。这款产品的pd…

java面试题-Dubbo和openFeign怎么选择,优劣

远离八股文&#xff0c;面试大白话&#xff0c;通俗且易懂 看完后试着用自己的话复述出来。有问题请指出&#xff0c;有需要帮助理解的或者遇到的真实面试题不知道怎么总结的也请评论中写出来&#xff0c;大家一起解决。 java面试题汇总-目录-持续更新中 面试官&#xff1a;你在…

台灯护眼灯怎么挑选?考公必备护眼台灯推荐

台灯作为日常生活中比较常用的桌面照明工具&#xff0c;不管是上班族熬夜加班&#xff0c;还是学生党用于学习、备考都离不开它的身影。但是如何挑选一盏光源舒适的台灯&#xff0c;相信是很多小伙伴最为烦恼的一个问题&#xff01;如果使用了一款质量不好&#xff0c;光源不达…

排序:直接插入排序希尔排序

目录 排序&#xff1a; 概念&#xff1a; 直接插入排序&#xff1a; 代码的实现&#xff1a; 代码解析&#xff1a; 总结&#xff1a; 希尔排序&#xff1a; 代码实现&#xff1a; 预排序&#xff1a; 代码优化&#xff1a; gap 的 本质 &#xff1a; 直接…

【每日一题】最小化旅行的价格总和

文章目录 Tag题目来源题目解读解题思路方法一&#xff1a;深搜动态规划 写在最后 Tag 【深搜动态规划】【树】【2023-12-06】 题目来源 2646. 最小化旅行的价格总和 题目解读 有一棵无向、无根的树&#xff0c;树中的节点从 0 到 n-1&#xff0c;每个节点有一个关联的价格&a…

这款IDEA插件真的爱了

前言 Idea 是一款功能强大的集成开发环境&#xff08;IDE&#xff09;&#xff0c;它可以帮助开发人员更加高效地编写、调试和部署软件应用程序,Idea 还具有许多插件和扩展&#xff0c;可以根据开发人员的需要进行定制和扩展&#xff0c;从而提高开发效率,今天我们就来介绍一款…

基于c++版本的数据结构改-python栈和队列思维总结

##栈部分-&#xff08;叠猫猫&#xff09; ##抽象数据类型栈的定义&#xff1a;是一种遵循先入后出的逻辑的线性数据结构。 换种方式去理解这种数据结构如果我们在一摞盘子中取到下面的盘子&#xff0c;我们首先要把最上面的盘子依次拿走&#xff0c;才可以继续拿下面的盘子&…

Postman可以卸载了!这款IDEA插件太好用了!

Postman是大家最常用的API调试工具&#xff0c;那么有没有一种方法可以不用手动写入接口到Postman&#xff0c;即可进行接口调试操作&#xff1f;今天给大家推荐一款IDEA插件&#xff1a;Apipost Helper&#xff0c;写完代码就可以调试接口并一键生成接口文档&#xff01;而且还…

JIRA 禁用用户自动登录

概述 当用户登录 JIRA 时&#xff0c;他们可以通过在单击“Log In”按钮之前选中“Remember my login”复选框&#xff0c;让 JIRA 记住他们的登录信息。这样做之后&#xff0c;“Remember my login”令牌将由 JIRA 服务器存储&#xff0c;并且系统会在用户的浏览器中设置包含…