WPF MaterialDesign 初学项目实战(4)侧边栏路由管理

news2024/11/24 11:43:54

原视频内容

WPF项目实战合集(2022终结版) 24P

其他内容

WPF MaterialDesign 初学项目实战(0):github 项目Demo运行
WPF MaterialDesign 初学项目实战(1)首页搭建

WPF MaterialDesign 初学项目实战(2)首页导航栏样式
WPF MaterialDesign 初学项目实战(3)动态侧边栏

本期内容:

  • 添加侧边栏路由
  • 路由管理

创建侧边栏页面

注意:这里添加的控件是用户控件:
在这里插入图片描述

名称作用
窗口WPF主窗口,窗口WPF上面不能叠加窗口WPF
页WPF没用过,好像是用来写网页的
用户控件WPF相当于组件,用于在窗口WPF上面叠加的子窗口
资源词典WPF相当于css样式

添加页面:

  • MyToDo(项目根路径)
    • Views
      • IndexView:主页
      • MenuVIew:记事本
      • ToDOView: 备忘录
      • SettingView:设置

在这里插入图片描述
注意是用户控件WPF,打开背景是透明的,效果如下
在这里插入图片描述
然后每个文件添加文本,用于区分

<TextBlock Text="Index" FontSize="80"/>//TexT有差异,用于区分页面

添加对应的ViewModel

在这里插入图片描述
我们在WPF MaterialDesign 初学项目实战(3)动态侧边栏,里面使用的是prism自动绑定,这里我们使用App.xmal里面的强制绑定

App.xmal

namespace MyToDo
{
    /// <summary>
    /// Interaction logic for App.xaml
    /// </summary>
    public partial class App : PrismApplication
    {
        /// <summary>
        /// 重写运行主窗口
        /// </summary>
        /// <returns></returns>
        /// <exception cref="NotImplementedException"></exception>
        protected override Window CreateShell()
        {
            //重定向主窗口
            return Container.Resolve<MainView>();
            
        }

        /// <summary>
        /// 依赖注入
        /// </summary>
        /// <param name="containerRegistry"></param>
        protected override void RegisterTypes(IContainerRegistry containerRegistry)
        {
        	+ containerRegistry.RegisterForNavigation<MainView, MainViewModel>();
           + containerRegistry.RegisterForNavigation<IndexView, IndexViewModel>();
           + containerRegistry.RegisterForNavigation<ToDoView, ToDoViewModel>();
           + containerRegistry.RegisterForNavigation<MenuView, MenuViewModel>();
           + containerRegistry.RegisterForNavigation<SettingView, SettingViewModel>();
        }
    }
}

最难的一步:绑定按钮事件,跳转路由

在基本页面设置好了之后,我们就要开始尝试跳转路由了

第一步,引入NuGet包

Microsoft.Xaml.Behaviors.Wpf,这个包用于添加按钮事件
在这里插入图片描述
引入命名空间:

xmlns:behaviors="http://schemas.microsoft.com/xaml/behaviors"

在ManiView里面添加按钮事件

namespace MyToDo.ViewModels
{
    public class MainViewModel : BindableBase//继承BindableBase可以动态更新
    {

        public MainViewModel(IRegionManager regionManager)//引入regionManager路由管理
        {
            menuBars = new ObservableCollection<MenuBar>();
            CreateMenuBar();
            NavigateCommand = new DelegateCommand<MenuBar>(Navigate);
            this.regionManager = regionManager;
            //添加前进后退按钮事件
            GoBackBtn = new DelegateCommand(() =>
            {
                if (journal!=null && journal.CanGoBack)
                {
                    journal.GoBack();
                }
            });
            GoForwardBtn = new DelegateCommand(() =>
            {
                if (journal != null && journal.CanGoForward)
                {
                    journal.GoForward();
                }
            });
        }

        /// <summary>
        /// 导航函数
        /// </summary>
        /// <param name="obj"></param>
        private void Navigate(MenuBar obj)
        {
            //加入判断,如果是空对象或者命名空间为空则跳出
            if (obj == null || string.IsNullOrEmpty(obj.NameSpace))
            {
                return;
            }
            regionManager.Regions[PrismManager.MainViewRegionName].RequestNavigate(obj.NameSpace, back =>
            {
                //使用回调函数,添加路由日志
                journal = back.Context.NavigationService.Journal;
            });
           

        }
        /// <summary>
        /// 用于导航
        /// </summary>
        public DelegateCommand<MenuBar> NavigateCommand { get; set; }
        /// <summary>
        /// 返回按钮
        /// </summary>
        public DelegateCommand GoBackBtn { get; set; }
        /// <summary>
        /// 前进按钮
        /// </summary>
        public DelegateCommand GoForwardBtn { get; set; }

        /// <summary>
        /// 引入Prism路由管理
        /// </summary>
        private readonly IRegionManager regionManager;
        /// <summary>
        /// Prism导航日志,路由前进或者后退
        /// </summary>
        private IRegionNavigationJournal journal;

        private ObservableCollection<MenuBar> menuBars;

        public ObservableCollection<MenuBar> MenuBars
        {
            get { return menuBars; }
            set { menuBars = value; RaisePropertyChanged(); }
        } //动态更新列表

        void CreateMenuBar()
        {
            MenuBars.Add(new MenuBar { Icon = "Home", Title = "首页", NameSpace = "IndexView" });
            MenuBars.Add(new MenuBar { Icon = "Notebook", Title = "代办事项", NameSpace = "ToDoView" });
            MenuBars.Add(new MenuBar { Icon = "NotebookEdit", Title = "备忘录", NameSpace = "MenuView" });
            MenuBars.Add(new MenuBar { Icon = "CogOutline", Title = "设置", NameSpace = "SettingView" });
        }
    }
}

知识补充

  • DelegateCommand 是委托事件,相当于定义函数,要在别的地方实例化
  • IRegionManager regionManager 是用于路由跳转
  • IRegionNavigationJournal journal 用于记录

新建路由管理实体类

虽然我们这里只有一个路由类,但是我们为了以后路由管理的方便,我们这里添加一个新的路由类

  • 根目录
    • Common
      • Prism
        • PrismManager
          在这里插入图片描述
namespace MyToDo.Common.Prism
{
    public static class PrismManager
    {
        public static readonly string MainViewRegionName = "MainViewRegion";
    }
}

添加点击事件

<ListBox ItemsSource="{Binding MenuBars}"
        ItemContainerStyle="{StaticResource MyListBoxItemStyle}"
         x:Name="menuBar"
         >
    <!--添加行为-->
    <behaviors:Interaction.Triggers>
        <!--按钮选择行为-->
        <behaviors:EventTrigger  EventName="SelectionChanged">
            <!--绑定按钮选择功能-->
            <behaviors:InvokeCommandAction Command="{Binding NavigateCommand}" CommandParameter="{Binding ElementName=menuBar,Path=SelectedItem}"/>
        </behaviors:EventTrigger>
    </behaviors:Interaction.Triggers>
    <ListBox.ItemTemplate>
        <DataTemplate>
            <StackPanel Orientation="Horizontal"
                        VerticalAlignment="Center"
                        Background="Transparent">
                <materialDesign:PackIcon Kind="{Binding Icon}"
                                         Margin="15,0" />
                <TextBlock Text="{Binding Title}"
                           Margin="10,0" />
            </StackPanel>
        </DataTemplate>
    </ListBox.ItemTemplate>
</ListBox>

这里没看懂的多看看原视频教程

实现效果:
在这里插入图片描述

点击侧边栏收起侧边栏

添加名称
在MainView里面

<materialDesign:DrawerHost IsLeftDrawerOpen="{Binding ElementName=MenuToggleButton, Path=IsChecked}" 
+ x:Name="drawerHost"
>

在MainView.cs里面添加事件

public MainView()
{
     InitializeComponent();

     ......
     //点击侧边栏收起事件
     menuBar.SelectionChanged += (s, e) =>
     {
         drawerHost.IsLeftDrawerOpen = false;
     };
 }

最终效果:
在这里插入图片描述

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

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

相关文章

ESLint配置详解

ESLint配置详解 ESLint 是一个代码检查工具&#xff0c;用来检查代码是否符合指定的规范&#xff0c;防止在多人协作开发时代码格式不统一。 安装 全局安装 npm install eslint -g当前项目安装 npm install eslint -D安装之后运行eslint --init进行初始化&#xff0c;使用…

你真的理解分布式数据的分区吗?

分布式数据存储是指将数据分散存储在多个节点或服务器上的技术。而分区是将数据划分为逻辑上的片段或部分&#xff0c;每个分区可以在分布式系统中的不同节点上存储。分区主要是为了可扩展性。不同的分区可以放在不共享集群中的不同节点上&#xff0c;可以帮助实现负载均衡、高…

玩转Google开源C++单元测试框架Google Test系列(gtest)之四 - 参数化

一、前言 在设计测试案例时&#xff0c;经常需要考虑给被测函数传入不同的值的情况。我们之前的做法通常是写一个通用方法&#xff0c;然后编写在测试案例调用它。即使使用了通用方法&#xff0c;这样的工作也是有很多重复性的&#xff0c;程序员都懒&#xff0c;都希望能够少…

Liunx基础命令 - cd命令

cd命令 – 切换目录 cd命令来自英文词组“change directory”的缩写&#xff0c;其功能是用于更改当前所处的工作目录&#xff0c;路径可以是绝对路径&#xff0c;也可以是相对路径&#xff0c;若省略不写则会跳转至当前使用者的家目录。 **语法格式&#xff1a;**cd [参数] …

VMware Workstation 17 Pro安装配置CentOS 7与ssh工具链接配置

VMware Workstation 17 Pro安装配置CentOS 7与ssh工具链接配置 下载安装虚拟机VMware Workstation 17 Pro 虚拟机官网&#xff1a;点击直达 下载Cent os 7 镜像文件 123网盘地址&#xff1a;点击直达 提取码1213 在虚拟机中安装Cent os 7 第一步 点击 创建新的虚拟机 第二步 默…

解释什么是蓝绿发布?

蓝绿发布(Blue-green release)是一种软件部署策略&#xff0c;主要用于应对新版本软件在生产环境中的测试和部署。这种策略将新版本软件分为两个阶段&#xff1a;蓝色阶段和绿色阶段。蓝色阶段通常在开发和测试环境中进行&#xff0c;而绿色阶段则在生产环境中进行。 蓝色阶段…

C语言运算符:赋值与计算

目录 赋值运算符 算术运算符 赋值运算符 下表列出了 C 语言支持的赋值运算符&#xff1a; 运算符描述实例简单的赋值运算符&#xff0c;把右边操作数的值赋给左边操作数C A B 将把 A B 的值赋给 C加且赋值运算符&#xff0c;把右边操作数加上左边操作数的结果赋值给左边操…

C语言基础知识:关系运算符与逻辑运算符

目录 1、关系运算符介绍 2、应用示例 3、逻辑运算符介绍 4、逻辑表达式的书写 5、不得不说的逻辑非 1、关系运算符介绍 关系运算&#xff08;Relational Operators&#xff09;&#xff0c;用于判断条件&#xff0c;决定程序的流程。 关系数学中的表示C语言的表示小于&l…

GPT神奇应用:生成菜谱

正文共 662 字&#xff0c;阅读大约需要 2 分钟 料理新手/爱好者必备技巧&#xff0c;您将在2分钟后获得以下超能力&#xff1a; 快速生成菜谱 Beezy评级 &#xff1a;B级 *经过简单的寻找&#xff0c; 大部分人能立刻掌握。主要节省时间。 推荐人 | Kim 编辑者 | Linda ●图…

VMWare 虚拟机创建 + 初始化

目录 概述 1. VMware创建虚拟机 2. IP 配置 nmtui nmcli 3. Yum 源配置 光盘的Packages作为Yum源 配置开机自动挂载(光盘) 配置私有Yum仓库 跟新私有yum仓库 报错和修复 4. 文件共享系统配置 跟新配置文件/etc/hosts /etc/yum.repo.d/ftp.repo 同步配置文件 测试…

HLS入门实现一个led灯的闪烁

文章目录 前言一、HLS是什么&#xff1f;与VHDL/Verilog编程技术有什么关系?1、HLS简介2、开发流程3、HLS与VHDL/Verilog编程技术有什么关系? 二、2. HLS有哪些关键技术问题&#xff1f;目前存在什么技术局限性&#xff1f;1.关键技术问题2、技术局限性 三、使用 HLS 完成 le…

第十二章创建模式—享元模式

文章目录 享元模式概述结构 实例优缺点和使用场景使用场景JDK源码解析 结构型模式描述如何将类或对象按某种布局组成更大的结构&#xff0c;有以下两种&#xff1a; 类结构型模式&#xff1a;采用继承机制来组织接口和类。 对象结构型模式&#xff1a;釆用组合或聚合来组合对象…

渗透测试--2.漏洞探测和利用

目录 一.漏洞分类 二.漏洞探测 三.漏洞利用 四.漏洞扫描 1.Nessus 2.Web应用漏洞扫描器——DVWA 五.Metasploit漏洞利用 一.漏洞分类 网络漏洞 系统漏洞 应用漏洞 人为不当配置 二.漏洞探测 渗透测试是一种测试网络、应用程序和系统安全性的方法&#xff0c;旨在发现…

Xilinx FPGA DDR3设计(三)DDR3 IP核详解及读写测试

引言&#xff1a;本文我们介绍下Xilinx DDR3 IP核的重要架构、IP核信号管脚定义、读写操作时序、IP核详细配置以及简单的读写测试。 01.DDR3 IP核概述 7系列FPGA DDR接口解决方案如图1所示。 图1、7系列FPGA DDR3解决方案 1.1 用户FPGA逻辑&#xff08;User FPGA Logic&#…

玩转Google开源C++单元测试框架Google Test系列(gtest)之七 - 深入解析gtest

一、前言 “深入解析”对我来说的确有些难度&#xff0c;所以我尽量将我学习到和观察到的gtest内部实现介绍给大家。本文算是抛砖引玉吧&#xff0c;只能是对gtest的整体结构的一些介绍&#xff0c;想要了解更多细节最好的办法还是看gtest源码&#xff0c;如果你看过gtest源码…

麒麟操作系统软件更新灾难连篇之一:中文输入法消失

今天在麒麟操作系统开QQ总是过一会儿就闪退&#xff0c;于是进软件商店看看是否有更新。 真是不看不知道&#xff0c;一看吓一跳&#xff0c;居然有几十个软件更新&#xff0c;照常理&#xff0c;软件升级后应该是更加好用&#xff0c;于是先把QQ、五笔字型、搜狗输入法等几个常…

centos7.9搭建redis6.0.6哨兵模式

redis6.0.6哨兵模式搭建文档 1.准备工作1.1 ip规划安装依赖&#xff08;三台机器都操作&#xff09;1.3 gcc升级&#xff08;三台机器都操作&#xff09; 2.安装redis&#xff08;三台机器都操作&#xff09;2.1 获取安装包2.2 解压2.3 编译2.4 验证上一步是否正确2.5 安装2.6…

Windows10安装二进制Mysql-5.7.41和汉化

1.创建my.ini [mysqld] ##skip-grant-tables1 port 3306 basedirD:/webStudy/mysql-5.7.41 datadirE:/adata/mysqlData max_connections200 character-set-serverutf8 default-storage-engineINNODB sql_modeNO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES [mysql] default-char…

Liunx基础命令 - which命令

which命令 – 查找命令文件 ​ which命令的功能是用于查找命令文件&#xff0c;能够快速搜索二进制程序所对应的位置。如果我们既不关心同名文件&#xff08;find与locate&#xff09;&#xff0c;也不关心命令所对应的源代码和帮助文件&#xff08;whereis&#xff09;&#…

C++中类的静态成员变量与静态成员函数

static声明为静态的&#xff0c;称为静态成员。 不管这个类创建了多少个对象&#xff0c;静态成员只有一个拷贝&#xff0c;这个拷贝被所有属于这个类的对象共享。 静态成员 属于类 而不是对象。 静态变量&#xff0c;是在编译阶段就分配空间&#xff0c;对象还没有创建时&…