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 7附录:
如何引用MahApps.Metro项目
如果将MahApps.Metro 添加到本地项目
方式1 :将源代码下载到本地
将以下路径的项目添加到当前解决方案。
“****\MahApps.Metro-develop\src\MahApps.Metro”
然后在主项目“的依赖项”菜单上右键,选择“添加项目引用”

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

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

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

控件外外观演示图

MahApps.Metro的MVVM模式解析(二) 主题功能的更多相关文章
- MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息
MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...
- MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信
MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...
- MVVM模式解析和在WPF中的实现(三)命令绑定
MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- Socket 简易静态服务器 WPF MVVM模式(二)
command类 标准来说,command会有三种模式,委托命令 准备命令 附加命令 1.DelegateCommand 2.RelayCommand 3.AttachbehaviorCommand ...
- MVVM模式和在WPF中的实现(二)数据绑定
MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...
- MVVM模式和在WPF中的实现(一)MVVM模式简介
MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...
- 190行代码实现mvvm模式
前言 网上讲 vue 原理,mvvm 模式的实现,数据双向绑定的文章一搜一大堆,不管写的谁好谁坏,都是写的自己的理解,我也发一篇文章记录自己的理解,如果对看官有帮助,那也是我莫大的荣幸,不过看完之后, ...
- MahApps.Metro扁平化UI控件库(可修改主题色等)
一.名词解释 使用MahApps.Metro扁平化UI控件库,可以使界面呈现更加美观.本文将总结MahApps.Metro的使用方法,及如何自定义修改其主题颜色等. 详细内容可参考官网:https:/ ...
- 前端笔记之微信小程序(二){{}}插值和MVVM模式&数据双向绑定&指令&API
一.双花括号{{}}插值和MVVM模式 1.1 体会{{}}插值 index.wxml的标签不是html的那些标签,这里的view就是div. {{}}这样的插值写法,叫做mustache语法.mus ...
- 【工作笔记二】ASP.NET MVC框架下使用MVVM模式
ASP.NET MVC框架下使用MVVM模式 原文:http://www.cnblogs.com/n-pei/archive/2011/07/21/2113022.html 对于asp.net mvc ...
随机推荐
- HarmonyOS应用侧与前端页面数据通道建立
一. 应用侧调用前端页面函数 应用侧可以通过runJavaScript()方法调用前端页面的JavaScript相关函数.在下面的示例中,点击应用侧的"runJavaScript" ...
- Spring Cloud Bus:消息总线
Spring Cloud Bus:消息总线 SpringCloud学习教程 SpringCloud Spring Cloud Bus 使用轻量级的消息代理来连接微服务架构中的各个服务,可以将其用于广播 ...
- maven 创建spring boot 需要的配置[一]
前言 之所以写这个是因为现在官方推荐云创建: 所以标注一下maven project,创建后,如何导入spring boot. 正文 1.步骤一 在pom.xml 中加入: <dependenc ...
- Android studio 提示“android qemu-system-i386.exe停止工作”
解决方案 android studio 关闭AVD时提示"android qemu-system-i386.exe停止工作" 配置虚拟机时"Graphics"选 ...
- 力扣1097(MySQL)-游戏玩法分析Ⅴ(困难)
题目: 我们将玩家的安装日期定义为该玩家的第一个登录日. 我们还将某个日期 X 的第 1 天留存时间定义为安装日期为 X 的玩家的数量,他们在 X 之后的一天重新登录,除以安装日期为 X 的玩家的数量 ...
- 力扣1620(java&python)-网络信号最好的坐标(中等)
题目: 给你一个数组 towers 和一个整数 radius . 数组 towers 中包含一些网络信号塔,其中 towers[i] = [xi, yi, qi] 表示第 i 个网络信号塔的坐标是 ...
- 阿里本地生活全域日志平台 Xlog 的思考与实践
简介: 作者:王宇(御田).当你踏进了编程的领域,代码和日志将是你最重要的伙伴".基于日志的问题排查是研发效能领域的重要部分,阿里集团本地生活在支撑多生态公司.多技术栈的背景下,逐渐沉淀了一 ...
- 从no-code到low-code:企业级hpaPaaS的未来
简介: 本文将简单谈一谈基于 no-code > low-code > pro-code 渐进式思路的研发体系. 引子 宜搭负责人骁勇给我举过一个例子,我们小时候逢年过节穿的衣服,都是去裁 ...
- Facebook宕机背后,我们该如何及时发现DNS问题
简介: 国庆期间,Facebook 及其旗下 Instagram 和 WhatsApp 等应用全网宕机,停机时间将近 7 小时 5 分钟,Facebook 市值损失 643 亿美元.针对Facebo ...
- boom lab分析
单步调试: (gdb) bt #1 0x0000000000401347 in strings_not_equal () #2 0x0000000000400eee in phase_1 () #3 ...