WPF中如何实现页面的切换

news2025/1/31 18:53:32

总目录


文章目录

  • 总目录
  • 前言
  • 一、准备工作
    • 1.搭建一个简单的mvvm项目结构
  • 二、实现
    • 1.使用Frame控件的方式实现
    • 2.使用反射的方式实现
    • 3.实现效果
  • 总结


前言

本文主要讲述如何在同一个窗体内,实现不同功能模块的页面切换。


一、准备工作

1.搭建一个简单的mvvm项目结构

在这里插入图片描述
首先搭建一个简单的项目框架,然后有红和绿两个页面,ViewModels中的Base 中简单实现了ICommand 和 INotifyPropertyChanged接口

二、实现

1.使用Frame控件的方式实现

利用Frame的Source 属性加载内部的控件,使用Frame的时候,用于切换的页面可以是UserControl 或者Page,如案例中使用的就是Page

实现代码如下:

<Window x:Class="WpfApp2.Views.MainView"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        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:local="clr-namespace:WpfApp2.Views"
        xmlns:vm="clr-namespace:WpfApp2.ViewModels"
        mc:Ignorable="d"
        Title="MainView" Height="450" Width="800">
    <Window.DataContext>
        <vm:MainViewModel></vm:MainViewModel>
    </Window.DataContext>
    <DockPanel Grid.Column="0">
        <StackPanel Background="LightBlue">
            <RadioButton Command="{Binding ChangePageCommand}" CommandParameter="PageRedView.xaml" Content="红色" Margin="10"></RadioButton>
            <RadioButton Command="{Binding ChangePageCommand}" CommandParameter="PageGreenView.xaml" Content="绿色" Margin="10"></RadioButton>
        </StackPanel>
        <Frame NavigationUIVisibility="Hidden" Source="{Binding PageName}"/>
    </DockPanel>
</Window>


注意:这里的CommandParameter传入的是PageRedView.xaml文件

    public class MainViewModel:ViewModelBase
    {
        private string _pageName;

        public string PageName
        {
            get { return _pageName; }
            set { _pageName = value; OnPropertyChanged(); }
        }

        public ICommand ChangePageCommand { get; set; }

        public MainViewModel()
        {
            ChangePageCommand = new CommandBase(ChangePage);
        }

        private void ChangePage(object obj)
        {
            PageName = obj.ToString();
        }
    }

2.使用反射的方式实现

使用反射+ContentControl 的方式也可使用页面切换,不过该方式下ContentControl 的Content不可以承接Page,Page只有Frame 和Window可以承接,但是可以承接UserControl。
首先将红色和绿色两个界面修改为UserControl并命名为UserControlRed和UserControlGreen ,然后修改代码如下:

    <DockPanel Grid.Column="0">
        <StackPanel Background="LightBlue">
            <RadioButton Command="{Binding ChangePageCommand}" CommandParameter="UserControlRed" Content="红色" Margin="10"></RadioButton>
            <RadioButton Command="{Binding ChangePageCommand}" CommandParameter="UserControlGreen" Content="绿色" Margin="10"></RadioButton>
        </StackPanel>
        <ContentControl Content="{Binding MainContent}"/>
    </DockPanel>
  public class MainViewModel:ViewModelBase
    {
        private FrameworkElement mainContent;

        public FrameworkElement MainContent
        {
            get { return mainContent; }
            set { mainContent = value; OnPropertyChanged(); }
        }


        public ICommand ChangePageCommand { get; set; }

        public MainViewModel()
        {
            ChangePageCommand = new CommandBase(ChangePage);
        }

        private void ChangePage(object obj)
        {
        	//【 * 】这里需要拼接路径
            Type type = Type.GetType("WpfApp2.Views." + obj.ToString());
            MainContent = (FrameworkElement)System.Activator.CreateInstance(type);
        }
    }

3.实现效果

在这里插入图片描述


总结

以上就是今天要介绍的内容,希望以上内容可以帮助到你,如文中有不对之处,还请批评指正。

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

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

相关文章

『纯canvas实现』你可能想象不到,粒子效果配合时钟还能这么玩?

前言 大家好&#xff0c;我们知道一般学习 canvas 时&#xff0c;做的最多的莫过于各种时钟&#xff0c;像下面这样的&#xff1a; 亦或是这样的&#xff1a; 或是这样的&#xff1a; 上面给大家展示了三种风格各异的时钟效果&#xff0c;但都没有让人眼前一亮的感觉&#xff…

一颗红心,三手准备,分别基于图片(img)/SCSS(样式)/SVG动画实现动态拉轰的点赞按钮特效

华丽炫酷的动画特效总能够让人心旷神怡&#xff0c;不能自已。艳羡之余&#xff0c;如果还能够探究其华丽外表下的实现逻辑&#xff0c;那就是百尺竿头&#xff0c;更上一步了。本次我们使用图片、SCSS样式以及SVG图片动画来实现“点赞”按钮的动画特效&#xff0c;并比较不同之…

CLM陆面过程模式

NCAR陆面模式CLM (Community Land Model)是地球系统模式CESM (Community Earth System Model)中的陆面过程模式分量&#xff0c;是在结合了BATS、LSM和IAP94等众多陆面模式的优点后&#xff0c;加入水文过程而开发出的综合性陆面模式&#xff0c;是目前国际上发展最为完善且得到…

java实现每日给女友微信发送早安等微信信息

大家好&#xff0c;我是雄雄。 前言 据说这个功能最近在抖音上很火&#xff0c;我没有抖音&#xff0c;没有看到。 但是我在掘金和CSDN上看了&#xff0c;相关案例确实很多&#xff0c;但是大家都是借助于了微信服务号&#xff0c;在我看来&#xff0c;效果很不佳。 其实我原…

如何在 Ubuntu 上将 ONLYOFFICE 文档集成至 Redmine

ONLYOFFICE 文档是一款符合 GNU AGPL v3.0 的开源办公套件。其中包含基于 Web 的查看器和协作编辑器&#xff0c;可用于处理文本文档、电子表格以及与 OOXML 格式高度兼容的演示文稿。 ONLYOFFICE 文档可与 Nextcloud、ownCloud、Seafile、Alfresco、Plone 等多种云服务进行集…

RabbitMQ(消息中间件)入门

目录 一. 什么是MQ&#xff1f; 二. 应用场景 三. 主流MQ框架 四. Docker安装部署RabbitMQ 1.查询镜像 2.获取镜像 3.运行镜像 四.进入RabbitMQ管理平台进行相关操作 五. RabbitMQ管理平台 1.Virtual Hosts 2.RabbitMQ关键名词 六. MQ的核心概念 七. springboot整合ra…

BiliBili 100+国际名校免费公开课整理分享

本资源这是一份公开课的目录&#xff0c;这里的视频大多来自 YouTube 等国内无法访问的网站&#xff0c;为了方便国内的朋友观看&#xff0c;作者将这些视频搬运到了BiliBili。 资源整理自网络&#xff0c;源地址&#xff1a;https://github.com/wenhan-wu/OpenCourseCatalog 所…

我今年大一,自学编程可行吗?

自学编程是可行的&#xff0c;但是你行不行就不好说了。 可能&#xff0c;这就是人生吧~ 建议你在自学编程之前&#xff0c;先看一下这几个问题&#xff1a; 1、我是一个意志坚定&#xff0c;抗压能力强&#xff0c;能耐得住寂寞的人吗&#xff1f;2、我对学编程是有规划还是只…

君子不玩物丧志,亦常以借物调心,网站集成二次元网页小组件(widget)石蒜模拟器,聊以赏玩

传世经典《菜根谭》中有言曰&#xff1a;“徜徉于山林泉石之间&#xff0c;而尘心渐息&#xff1b;夷犹于诗书图画之内&#xff0c;而俗气潜消。故君子虽不玩物丧志&#xff0c;亦常借物调心。”意思是&#xff0c;徜徉在林泉山石之间&#xff0c;能够摒弃杂念&#xff0c;留意…

C++程序设计——运算符重载(运算符重载的概念;运算符成员函数与友元函数;单目运算符重载;重载流运算符;双目运算符重载;赋值运算符重载)

目录 前言 一、运算符重的概念与意义 1.运算符重载 &#xff08;1&#xff09;函数重载 &#xff08;2&#xff09;运算符重载 2.运算符重载的意义 &#xff08;1&#xff09;例子引入 &#xff08;2&#xff09;意义 &#xff08;3&#xff09;运算符重载的限制 …

有人问,普通人学python有意义吗?看看这位大佬怎么说

普通人学python有意义吗&#xff1f; 现在随着python越来越火&#xff0c;尤其是它成为了人工智能的第一编程语言&#xff0c;还被纳入了中小学的教育中。并且python的应用范围很广泛&#xff0c;可以解决很多专业或非专业的问题。 但python真的适合普通人学习吗&#xff1f;…

STAMP算法实战

1.案例知识点 推荐系统任务描述:通过用户的历史行为(比如浏览记录、购买记录等等)准确的预测出用户未来的行为;好的推荐系统不仅如此,而且能够拓展用户的视野,帮助他们发现可能感兴趣的却不容易发现的item;同时将埋没在长尾中的好商品推荐给可能感兴趣的用户。STAMP推荐…

普通二本,去过阿里外包,到现在年薪40W+的高级测试工程师,我的两年转行心酸经历...

我是一个普通二本大学机械专业毕业&#xff0c;17年毕业&#xff0c;19年转行&#xff0c;目前做IT行业的软件测试已经有3年多&#xff0c;职位是高级软件测试工程师&#xff0c;坐标上海… 我想现在我也有一点资格谈论关于转行这个话题&#xff1b;希望你在决定转行之前&…

【网络工程】如何本地调试微信公众号开发教程(Nginx代理方法)

目录 前言 目的 通过Nginx代理实现本地调试微信公众号 实现工具 实现步骤 1.启动本地前端项目 2.首先配置Nginx 3.填写app.conf内容&#xff0c;把本地前端项目与域名形成映射。 4.把app.conf加入到Nginx配置中 5.打开我们安装好的SwitchHosts工具 6.右键管理员权限…

全球电子烟行业快速发展,我国监管政策趋严行业面临重构

一、电子烟在全球范围广泛流行 根据观研报告网发布的《2022年中国电子烟行业分析报告-行业现状与发展趋势分析》显示&#xff0c;电子烟是在最近几年出现的一种电子产品&#xff0c;电子烟宣传的健康无害、有一定满足感对消费者有绝佳的吸引力;电子烟的品味、档次、个性化是吸…

零基础编程学习指南!让你不再迷茫~

一篇初学者干货&#xff0c;请耐心看完&#xff0c;希望对你有帮助。 作为初学者的你&#xff0c;命中了以下问题吗&#xff1f; #张三丰&#xff1a;编程是什么&#xff0c;怎么编程&#xff1f; #张无忌&#xff1a;what&#xff0c;比土木工程好&#xff1f; #成昆&…

Linux限制磁盘与内存配额【超详细】

大家好&#xff0c;我是早九晚十二&#xff0c;目前是做运维相关的工作。写博客是为了积累&#xff0c;希望大家一起进步&#xff01; 我的主页&#xff1a;早九晚十二 文章目录Linux限制磁盘用量的方式什么是磁盘配额磁盘配额的条件安装quota工具配额步骤新建一个磁盘分区新建…

NVMe 原理 - 命令的处理

蛋蛋读NVMe之一 (ssdfans.com) NVMe 所处层次 NVMe是一种Host与SSD之间通讯的协议&#xff0c;它在协议栈中隶属高层。NVMe在协议栈中处于应用层或者命令层。 NVMe是为SSD所生的。NVMe出现之前&#xff0c;SSD绝大多数走的是AHCI和SATA的协议&#xff0c;后者其实是为传统HDD…

元宇宙产业委与中国传媒大学就“虚拟空间文化生产与管理微专业”课程深度合作

12月17日、18日两天下午&#xff0c;由中国移动通信联合会元宇宙产业工作委员会牵头&#xff0c;为中国传媒大学虚拟空间文化生产与管理微专业成功邀请5位行业内大咖级讲师&#xff0c;为校内、外在读本科生和研究生&#xff0c;以及对虚拟文化生产与管理感兴趣且获得学士学位的…

工控CTF之协议分析6——s7comm

协议分析 流量分析 主要以工控流量和恶意流量为主&#xff0c;难度较低的题目主要考察Wireshark使用和找规律&#xff0c;难度较高的题目主要考察协议定义和特征 简单只能简单得干篇一律&#xff0c;难可以难得五花八门 常见的工控协议有&#xff1a;Modbus、MMS、IEC60870、…