MahApps.Metro的MVVM模式解析(二) 主题功能

MahApps.Metro的MVVM模式解析(二) 主题功能

MahApps.Metro是一个开源的WPF框架,旨在为WPF应用程序提供现代和漂亮的用户界面。

在MahApps.Metro中提供了切换主题的功能。经过多日的筛选和分析,在本文来理清它的脉络。

1 主题功能演示

主题列表:

白天主题效果:

夜晚主题效果:

2软件架构

 

3 分模块展示代码

View

 页面中主题列表代码如下。这是使用Menu 和MenuItem 来实现了菜单效果

       

 <Menu Grid.Row="0"  Margin="5"  HorizontalAlignment="Left" VerticalAlignment="Stretch">

            <MenuItem Header="Theme"

                   ItemContainerStyle="{StaticResource AppThemeMenuItemStyle}"

                   ItemsSource="{Binding AppThemes, Mode=OneWay}" />

        </Menu>

重要代码有两处:

1 “ItemContainerStyle="{StaticResource AppThemeMenuItemStyle}"”

这里通过样式技术,实现了菜单的点击后切换主题的功能

2 “ ItemsSource="{Binding AppThemes, Mode=OneWay}" ”

这里通过与viewmodel的绑定实现了显示主题列表的功能

拓展:wpf的样式:

样式(Style)是一种将一组属性值应用到多个元素的便捷方法

在这个项目中名为“AppThemeMenuItemStyle”的样式代码如下:

 

<Style x:Key="AppThemeMenuItemStyle"

         BasedOn="{StaticResource MahApps.Styles.MenuItem}"

         TargetType="{x:Type MenuItem}">

     <Setter Property="Command" Value="{Binding ChangeAccentCommand}" />

     <Setter Property="CommandParameter" Value="{Binding Name, Mode=OneWay}" />

     <Setter Property="Header" Value="{Binding Name, Mode=OneWay}" />

     <Setter Property="Icon" Value="{StaticResource AppThemeMenuIcon}" />

 </Style>

“BasedOn”:样式可以继承。

Command”、“CommandParameter”:在样式里绑定控件的事件。这里是菜单项的点击事件。

Header”:将控件属性绑定到动态数据源

“Icon”:将控件属性绑定到静态资源。

ViewModel

作为数据源,具体代码 如下:

    public List<AppThemeMenuData> AppThemes { get; set; }
	public ViewModel_Mainwin(IDialogCoordinator dialogCoordinator)
	{
		// create metro theme color menu items for the demo
		this.AppThemes = ThemeManager.Current.Themes
									.GroupBy(x => x.BaseColorScheme)
									...
									.ToList();
	}

ViewModel_Mainwin类中,定义了公开的 AppThemes 属性。它包含了一个主题列表。

Model

当然为了实现复杂功能,AppThemes使用了AppThemeMenuData类。如下:

    public class AppThemeMenuData
	{
		public string? Name { get; set; }

		public Brush? BorderColorBrush { get; set; }

		public Brush? ColorBrush { get; set; }

		public AccentColorMenuData()
		{
			this.ChangeAccentCommand = new SimpleCommand<string?>(o => true, this.DoChangeTheme);
		}

		public ICommand ChangeAccentCommand { get; }

		protected virtual void DoChangeTheme(string? name)
		{
			if (name is not null)
			{
				ThemeManager.Current.ChangeThemeColorScheme(Application.Current, name);
			}
		}
	}

三个属性不用说。复杂的是ChangeAccentCommand 事件。一方面它被绑定到页面的点击事件上。另一方面,在构造函数里它被赋予一个匿名函数。通过调用DoChangeTheme函数来实现切换主题。

4 附录:

如何引用MahApps.Metro项目

如果将MahApps.Metro 添加到本地项目

将源代码下载到本地

将以下路径的项目添加到当前解决方案。

“****\MahApps.Metro-develop\src\MahApps.Metro”

然后在主项目“的依赖项”菜单上右键,选择“添加项目引用”

在解决方案类别中选中MahApps.Metro项目并确定。

项目还使用了其他来源的图表和样式库。可以通过NuGet工具引用

现在程序中有了它们的引用。可以开始编译了

控件外外观演示图

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

数据结构-二叉树系统性学习(四万字精讲拿捏)

前言 这里我会从二叉树的概念开始讲解&#xff0c;其次涉及到概念结构&#xff0c;以及堆的实现和堆排序。 目的是&#xff0c;堆比二叉树简单&#xff0c;同时堆本质上是二叉树的其中一种情况&#xff0c;堆属于二叉树顺序结构的实现 最后完善二叉树的讲解&#xff0c;也就是…

认知觉醒:情绪绝对是财富的拦路虎……

认知觉醒 无论是投资还是做生意&#xff0c;跟随大众情绪就一定会亏损&#xff0c;老百姓没有是非认知&#xff0c;只有好恶&#xff0c;所以就很容易被人操控情绪。随便一个社会热点事件&#xff0c;就比如最近的涂磊事件、郭有才事件&#xff0c;打开视频的评论区&#xff0…

浅谈JMeter环境变量设置

JMeter环境变量设置 确保已安装Java Development Kit (JDK) JMeter需要Java运行环境&#xff0c;因此请先安装JDK&#xff0c;并确认JAVA_HOME环境变量已经设置好。可以通过命令提示符输入java -version和javac -version来验证是否安装成功及其版本信息&#xff0c;若没有出现…

U8G2移植到STM32,SSD13XXXOLED(硬件SPI DMA通讯)

文章目录 一、前言1.1 U8g2的特点1.2 U8G2的优势1.3 U8G2的下载地址1.4 U8g2支持的显示控制器 二、STM32Cubexm SPI DMA配置2.1 SPI设置为半双工模式2.2 SPI DMA设置2.3 oled其他引脚配置 三、移植U8G2框架3.1 精简U8G2库文件3.2 去掉csrc文件夹中无用的驱动文件3.3 文件移动到…

PLC无线通讯模块在触摸屏与台达PLC之间的应用教程

本方案可以作为信捷触摸屏与台达PLC之间在台达专用协议下将有线通讯改为无线通讯的应用实例。此方案中信捷TG765触摸屏作为主站&#xff0c;台达DVP-32EH PLC作为从站&#xff0c;采用西安达泰电子日系PLC无线通讯终端——DTD435MA-V384&#xff0c;作为实现无线通讯的硬件设备…

【面试必看】系统设计

系统设计 1. 认证与授权 Authentication&#xff08;认证&#xff09; 是验证您的身份的凭据&#xff08;例如用户名/用户 ID 和密码&#xff09;&#xff0c;通过这个凭据&#xff0c;系统得以知道你就是你&#xff0c;也就是说系统存在你这个用户&#xff0c;也叫做身份/用户…

所有平台均可发布,矩阵操作+工具+素材,自动混剪8090后怀旧视频

“怀旧”这个词对于80、90后来说&#xff0c;总能勾起一阵阵心中的涟漪。无论是那些留存在记忆深处的动画经典&#xff0c;还是代代相传的游戏主题曲&#xff0c;亦或是那个时代特有的玩具&#xff0c;都构成了他们共同的美好回忆。就像乘坐一艘穿梭机&#xff0c;怀旧视频能够…

无人机行业所需企业服务等级证书详解

无人机行业中的民用无人机企业服务等级证书是对企业在无人机服务领域的能力、技术、管理和服务质量等方面的一种全面认可和评定。这种证书的存在&#xff0c;不仅有助于企业了解自身服务能力和水平&#xff0c;提升服务质量&#xff0c;增强市场竞争力&#xff0c;促进规范化管…

【有效的数独】python

目录 很好&#xff0c;超级暴力做法&#xff0c;能过就行&#xff0c;优雅个锤子啊 优雅的做法 &#xff0c;绅士&#xff0c;噢听说叫模拟 很好&#xff0c;超级暴力做法&#xff0c;能过就行&#xff0c;优雅个锤子啊 我直接11个2层for循环暴力秒杀 class Solution:def is…

使用 SwanLab 进行可视化 MNIST 手写体识别训练

使用 SwanLab 进行可视化 MNIST 手写体识别训练 在线演示demo 本案例主要&#xff1a; 使用pytorch进行CNN&#xff08;卷积神经网络&#xff09;的构建、模型训练与评估使用swanlab跟踪超参数、记录指标和可视化监控整个训练周期 一、相关简介 SwanLab SwanLab是一款开源…

Vue基础(数据绑定、export使用)

1、简介 在使用vue开发的过程中&#xff0c;经常会遇到一些容易混淆的问题&#xff0c;因此&#xff0c;在本文中进行汇总操作&#xff0c;只有通过不断总结学习&#xff0c;才能更好掌握vue的使用&#xff08;每天进步一点&#xff09;。 2、数据绑定 在js中定义数据&#xf…

三分钟一条AI小和尚视频 ,日引300+创业粉。单日变现四位数 全套工具

经过六个月的不懈努力和无数次的尝试错误&#xff0c;我终于找到了一个高效引流和积累粉丝的新策略&#xff0c;并愿意与大家无私分享。这一次&#xff0c;我将详尽地介绍这个方法&#xff0c;建议朋友们多次观看以彻底掌握其精髓。 简而言之&#xff0c;该策略主要依托于AI绘…

Spring 原理详解

1. Bean的作用域 Bean在Spring中表示的是Spring管理的对象&#xff0c;Bean的作用域是只Bean在Spring框架中的某种行为模式。 在Spring中&#xff0c;支持6中作用域&#xff1a; singleton&#xff1a;单例作用域&#xff0c;在整个 Spring IoC 容器中&#xff0c;只创建一个…

Json差异比较

json差异比较 如何比较两个json的差异 代码实现 导入依赖 <dependency><groupId>cn.xiaoandcai</groupId><artifactId>json-diff</artifactId><!-- 旧版本可能存在某些缺陷。版本请以maven仓库最版为准。 --><version>4.1.3-RC1-R…

没想到,一个小妙招让桌面运维效率翻倍

号主&#xff1a;老杨丨11年资深网络工程师&#xff0c;更多网工提升干货&#xff0c;请关注公众号&#xff1a;网络工程师俱乐部 我的网工朋友大家好。 咱们都知道&#xff0c;电脑用久了&#xff0c;总会出些小毛病&#xff0c;比如桌面图标不显示了&#xff0c;C盘又满了&a…

springboot+minio 文件上传

前期准备 需要先安装minio文件服务器&#xff0c;请参考我上一篇文章 pom.xml 版本 本次使用的是springboot2.7.16 版本&#xff0c; minio 版本是8.2.2 <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-pare…

利用AI办公工具类API,大幅提高办公效率

AI办公工具类API是一项革命性的技术&#xff0c;利用人工智能的力量为办公场景提供了许多创新的解决方案。借助AI办公工具类API&#xff0c;用户可以实现自动化的文档处理、语音转文字、图像识别、数据分析等多种功能&#xff0c;大大提高了办公效率和工作质量。此外&#xff0…

Uni-App开发 导入(引入)Vant-Weapp组件;支持vue3/vue2版本和微信小程序

文章目录 目录 文章目录 操作流程 小结 概要安装流程技术细节小结 概要 Vant Weapp官网&#xff1a;Vant Weapp - 轻量、可靠的小程序 UI 组件库 准备工作&#xff0c;需要确保自己的电脑上已安装Hbuilde和node 全程操作的环境都需要这些配合才能运行上&#xff0c;可参考作者…

如何彻底搞懂组合(Composite)设计模式?

当我们在设计系统对象关系时&#xff0c;有时候会碰到这样一种场景&#xff0c;一个对象中包含了另一组对象&#xff0c;两者构成一种”部分-整体”的关联关系。 正如上图中所展示的&#xff0c;当我们面对这样一种对象关系时&#xff0c;通常都需要分别构建单独的访问方式&…

数据挖掘案例-航空公司客户价值分析

文章目录 1. 案例背景2. 分析方法与过程2.1 分析流程步骤2.2 分析过程1. 数据探索分析2. 描述性统计分析3. 分布分析1.客户基本信息分布分析2. 客户乘机信息分布分析3. 客户积分信息分布分析 4. 相关性分析 3. 数据预处理3.1 数据清洗3.2 属性约束3. 3 数据转换 4. 模型构建4. …