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模式解析(二) 主题功能的更多相关文章

  1. MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息

    MVVM模式解析和在WPF中的实现(六) 用依赖注入的方式配置ViewModel并注册消息 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二 ...

  2. MVVM模式解析和在WPF中的实现(五)View和ViewModel的通信

    MVVM模式解析和在WPF中的实现(五) View和ViewModel的通信 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 M ...

  3. MVVM模式解析和在WPF中的实现(三)命令绑定

    MVVM模式解析和在WPF中的实现(三) 命令绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  4. Socket 简易静态服务器 WPF MVVM模式(二)

    command类 标准来说,command会有三种模式,委托命令 准备命令 附加命令 1.DelegateCommand 2.RelayCommand 3.AttachbehaviorCommand ...

  5. MVVM模式和在WPF中的实现(二)数据绑定

    MVVM模式解析和在WPF中的实现(二) 数据绑定 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在WPF中 ...

  6. MVVM模式和在WPF中的实现(一)MVVM模式简介

    MVVM模式解析和在WPF中的实现(一) MVVM模式简介 系列目录: MVVM模式解析和在WPF中的实现(一)MVVM模式简介 MVVM模式解析和在WPF中的实现(二)数据绑定 MVVM模式解析和在 ...

  7. 190行代码实现mvvm模式

    前言 网上讲 vue 原理,mvvm 模式的实现,数据双向绑定的文章一搜一大堆,不管写的谁好谁坏,都是写的自己的理解,我也发一篇文章记录自己的理解,如果对看官有帮助,那也是我莫大的荣幸,不过看完之后, ...

  8. MahApps.Metro扁平化UI控件库(可修改主题色等)

    一.名词解释 使用MahApps.Metro扁平化UI控件库,可以使界面呈现更加美观.本文将总结MahApps.Metro的使用方法,及如何自定义修改其主题颜色等. 详细内容可参考官网:https:/ ...

  9. 前端笔记之微信小程序(二){{}}插值和MVVM模式&数据双向绑定&指令&API

    一.双花括号{{}}插值和MVVM模式 1.1 体会{{}}插值 index.wxml的标签不是html的那些标签,这里的view就是div. {{}}这样的插值写法,叫做mustache语法.mus ...

  10. 【工作笔记二】ASP.NET MVC框架下使用MVVM模式

    ASP.NET MVC框架下使用MVVM模式 原文:http://www.cnblogs.com/n-pei/archive/2011/07/21/2113022.html 对于asp.net mvc ...

随机推荐

  1. 使用 Grafana 统一监控展示-对接 Zabbix

    概述 在某些情况下,Metrics 监控的 2 大顶流: Zabbix: 用于非容器的虚拟机环境 Prometheus: 用于容器的云原生环境 是共存的.但是在这种情况下,统一监控展示就不太方便,本文 ...

  2. centos7.2 利用yum安装配置apache2.4多虚拟主机

    centos7.2 利用yum安装配置apache2.4多虚拟主机 标签: centosapacheyum 2017-01-10 21:01  3175人阅读  评论(0)  收藏  举报   分类: ...

  3. UE4中HTC Vive 手柄如何抓取物体

    想知道 HTC Vive 手柄如何抓取物体? HTC Vive 的手柄有许多功能,在游戏里你可以用手柄射箭,可以用手柄拾取木棍等等,但是这些是如何设置的呢?来看看我们的公开课教程吧. 本期教程为上半部 ...

  4. 【cef编译包】下载地址

    http://opensource.spotify.com/cefbuilds/index.html

  5. 力扣566(java)-重塑矩阵(简单)

    题目: 在 MATLAB 中,有一个非常有用的函数 reshape ,它可以将一个 m x n 矩阵重塑为另一个大小不同(r x c)的新矩阵,但保留其原始数据. 给你一个由二维数组 mat 表示的  ...

  6. EasyCV DataHub 提供多领域视觉数据集下载,助力模型生产

    简介: 在人工智能广泛应用的今天,深度学习技术已经在各行各业起到了重要的作用.在计算机视觉领域,深度学习技术在大多数场景已经替代了传统视觉方法.如果说深度学习是一项重要的生产工具,那么数据就是不可或缺 ...

  7. [FE] 实时视频流库 hls.js 重载切换资源的方式

    hls 播放需要先 attachMedia,然后 loadSource. 如果切换 resource,需要先执行 hls.destroy(),否则会出现混乱. destroy 之后再依次进行 hls ...

  8. 使用 Data Assistant 快速创建测试数据集

    使用 Data Assistant 快速创建测试数据集 Data Assistant 提供超过 100 种数据类型,为任何开发.测试或演示目的生成大量.异构.真实的数据. 官网地址:http://ww ...

  9. K8s集群中部署SpringCloud在线购物平台(一)

    一.安装k8s高可用集群 主机名 IP 配置 网络 master控制节点 192.168.10.10 centos 7.9 4核4G 桥接 node1工作节点 192.168.10.11 centos ...

  10. 构建RAG应用-day05: 如何评估 LLM 应用 评估并优化生成部分 评估并优化检索部分

    评估 LLM 应用 1.一般评估思路 首先,你会在一到三个样本的小样本中调整 Prompt ,尝试使其在这些样本上起效. 随后,当你对系统进行进一步测试时,可能会遇到一些棘手的例子,这些例子无法通过 ...