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

2024-05-28 04:36

本文主要是介绍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 demothis.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工具引用

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

控件外外观演示图

这篇关于MahApps.Metro的MVVM模式解析(二) 主题功能的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1009550

相关文章

SpringKafka消息发布之KafkaTemplate与事务支持功能

《SpringKafka消息发布之KafkaTemplate与事务支持功能》通过本文介绍的基本用法、序列化选项、事务支持、错误处理和性能优化技术,开发者可以构建高效可靠的Kafka消息发布系统,事务支... 目录引言一、KafkaTemplate基础二、消息序列化三、事务支持机制四、错误处理与重试五、性能优

SpringIntegration消息路由之Router的条件路由与过滤功能

《SpringIntegration消息路由之Router的条件路由与过滤功能》本文详细介绍了Router的基础概念、条件路由实现、基于消息头的路由、动态路由与路由表、消息过滤与选择性路由以及错误处理... 目录引言一、Router基础概念二、条件路由实现三、基于消息头的路由四、动态路由与路由表五、消息过滤

Spring Boot 3.4.3 基于 Spring WebFlux 实现 SSE 功能(代码示例)

《SpringBoot3.4.3基于SpringWebFlux实现SSE功能(代码示例)》SpringBoot3.4.3结合SpringWebFlux实现SSE功能,为实时数据推送提供... 目录1. SSE 简介1.1 什么是 SSE?1.2 SSE 的优点1.3 适用场景2. Spring WebFlu

基于SpringBoot实现文件秒传功能

《基于SpringBoot实现文件秒传功能》在开发Web应用时,文件上传是一个常见需求,然而,当用户需要上传大文件或相同文件多次时,会造成带宽浪费和服务器存储冗余,此时可以使用文件秒传技术通过识别重复... 目录前言文件秒传原理代码实现1. 创建项目基础结构2. 创建上传存储代码3. 创建Result类4.

Python+PyQt5实现多屏幕协同播放功能

《Python+PyQt5实现多屏幕协同播放功能》在现代会议展示、数字广告、展览展示等场景中,多屏幕协同播放已成为刚需,下面我们就来看看如何利用Python和PyQt5开发一套功能强大的跨屏播控系统吧... 目录一、项目概述:突破传统播放限制二、核心技术解析2.1 多屏管理机制2.2 播放引擎设计2.3 专

一文详解SpringBoot响应压缩功能的配置与优化

《一文详解SpringBoot响应压缩功能的配置与优化》SpringBoot的响应压缩功能基于智能协商机制,需同时满足很多条件,本文主要为大家详细介绍了SpringBoot响应压缩功能的配置与优化,需... 目录一、核心工作机制1.1 自动协商触发条件1.2 压缩处理流程二、配置方案详解2.1 基础YAML

Java的IO模型、Netty原理解析

《Java的IO模型、Netty原理解析》Java的I/O是以流的方式进行数据输入输出的,Java的类库涉及很多领域的IO内容:标准的输入输出,文件的操作、网络上的数据传输流、字符串流、对象流等,这篇... 目录1.什么是IO2.同步与异步、阻塞与非阻塞3.三种IO模型BIO(blocking I/O)NI

Python 中的异步与同步深度解析(实践记录)

《Python中的异步与同步深度解析(实践记录)》在Python编程世界里,异步和同步的概念是理解程序执行流程和性能优化的关键,这篇文章将带你深入了解它们的差异,以及阻塞和非阻塞的特性,同时通过实际... 目录python中的异步与同步:深度解析与实践异步与同步的定义异步同步阻塞与非阻塞的概念阻塞非阻塞同步

SpringBoot如何通过Map实现策略模式

《SpringBoot如何通过Map实现策略模式》策略模式是一种行为设计模式,它允许在运行时选择算法的行为,在Spring框架中,我们可以利用@Resource注解和Map集合来优雅地实现策略模式,这... 目录前言底层机制解析Spring的集合类型自动装配@Resource注解的行为实现原理使用直接使用M

使用PyTorch实现手写数字识别功能

《使用PyTorch实现手写数字识别功能》在人工智能的世界里,计算机视觉是最具魅力的领域之一,通过PyTorch这一强大的深度学习框架,我们将在经典的MNIST数据集上,见证一个神经网络从零开始学会识... 目录当计算机学会“看”数字搭建开发环境MNIST数据集解析1. 认识手写数字数据库2. 数据预处理的