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

相关文章

python常见环境管理工具超全解析

《python常见环境管理工具超全解析》在Python开发中,管理多个项目及其依赖项通常是一个挑战,下面:本文主要介绍python常见环境管理工具的相关资料,文中通过代码介绍的非常详细,需要的朋友... 目录1. conda2. pip3. uvuv 工具自动创建和管理环境的特点4. setup.py5.

苹果macOS 26 Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色

《苹果macOS26Tahoe主题功能大升级:可定制图标/高亮文本/文件夹颜色》在整体系统设计方面,macOS26采用了全新的玻璃质感视觉风格,应用于Dock栏、应用图标以及桌面小部件等多个界面... 科技媒体 MACRumors 昨日(6 月 13 日)发布博文,报道称在 macOS 26 Tahoe 中

全面解析HTML5中Checkbox标签

《全面解析HTML5中Checkbox标签》Checkbox是HTML5中非常重要的表单元素之一,通过合理使用其属性和样式自定义方法,可以为用户提供丰富多样的交互体验,这篇文章给大家介绍HTML5中C... 在html5中,Checkbox(复选框)是一种常用的表单元素,允许用户在一组选项中选择多个项目。本

Redis Cluster模式配置

《RedisCluster模式配置》:本文主要介绍RedisCluster模式配置,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友参考下吧... 目录分片 一、分片的本质与核心价值二、分片实现方案对比 ‌三、分片算法详解1. ‌范围分片(顺序分片)‌2. ‌哈希分片3. ‌虚

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

Java使用HttpClient实现图片下载与本地保存功能

《Java使用HttpClient实现图片下载与本地保存功能》在当今数字化时代,网络资源的获取与处理已成为软件开发中的常见需求,其中,图片作为网络上最常见的资源之一,其下载与保存功能在许多应用场景中都... 目录引言一、Apache HttpClient简介二、技术栈与环境准备三、实现图片下载与保存功能1.

SpringBoot排查和解决JSON解析错误(400 Bad Request)的方法

《SpringBoot排查和解决JSON解析错误(400BadRequest)的方法》在开发SpringBootRESTfulAPI时,客户端与服务端的数据交互通常使用JSON格式,然而,JSON... 目录问题背景1. 问题描述2. 错误分析解决方案1. 手动重新输入jsON2. 使用工具清理JSON3.

MybatisPlus service接口功能介绍

《MybatisPlusservice接口功能介绍》:本文主要介绍MybatisPlusservice接口功能介绍,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友... 目录Service接口基本用法进阶用法总结:Lambda方法Service接口基本用法MyBATisP

Redis过期删除机制与内存淘汰策略的解析指南

《Redis过期删除机制与内存淘汰策略的解析指南》在使用Redis构建缓存系统时,很多开发者只设置了EXPIRE但却忽略了背后Redis的过期删除机制与内存淘汰策略,下面小编就来和大家详细介绍一下... 目录1、简述2、Redis http://www.chinasem.cn的过期删除策略(Key Expir

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和