首页 > 其他分享 >MahApps.Metro的MVVM模式解析(二) 主题功能

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

时间:2024-05-27 11:43:56浏览次数:26  
标签:MahApps Metro MVVM get 主题 AppThemes public

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,get,主题,AppThemes,public
From: https://www.cnblogs.com/tiankong0012/p/18215193

相关文章

  • WPF ListBox thumbnails and image mvvm behavior CallMethodAction
    <Windowx:Class="WpfApp108.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:d="http://schemas.microsoft......
  • WPF mvvm find element by name
    Copyfrom https://stackoverflow.com/questions/636383/how-can-i-find-wpf-controls-by-name-or-type //xaml<Windowx:Class="WpfApp102.MainWindow"xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmln......
  • Community Mvvm Toolkit常用组件的基本使用(第一版)
    一、组件ObservableObjectObservableObject实现了INotifyPropertyChanged和INotifyPropertyChanging,并触发PropertyChanged和PropertyChanging事件1publicclassUser:ObservableObject2{3privatestringname;45publicstringName6{7......
  • A. Metro
    原题链接题解思考这类问题之前先考虑完成目标有几种方法,再考虑方法的可行性code#include<bits/stdc++.h>usingnamespacestd;inta[1005],b[1005];intmain(){intn,m;cin>>n>>m;for(inti=1;i<=n;i++)cin>>a[i];for(inti=1;i<=n;i++)cin>>......
  • [C#] [WPF] 在MVVM中实现拖拽功能 - 入门
    拖拽功能是使用频率较高的一种交互,用传统方法去写很简单,但是在mvvm规则下,也没必要弄得很麻烦我的入门案例就选择了使用mvvm重写tutorialspoint-Interaction里的调色盘案例,view如下MainWindow.xaml这里的重点是控件要允许拖拽以及对应的事件目标控件,填充色绑定,......
  • 手写MVVM
    internalclassDelegateCommand:ICommand{publiceventEventHandler?CanExecuteChanged{add{CommandManager.RequerySuggested+=value;}remove{CommandManager.RequerySuggested-=value;}}publicDelegateComm......
  • Matlab用BUGS马尔可夫区制转换Markov switching随机波动率SV模型、序列蒙特卡罗SMC、M
    原文链接:http://tecdat.cn/?p=24498原文出处:拓端数据部落公众号在这个例子中,我们考虑马尔可夫转换随机波动率模型。统计模型让  是因变量和  未观察到的对数波动率 .随机波动率模型定义如下 区制变量  遵循具有转移概率的二态马尔可夫过程 表示均值的正态分布......
  • WPF MVVM Datagrid Selected Multiple items via behavior interaction.trigger,event
    1.Install Microsoft.Xaml.Behaviors.WpffromNuget;2.Addbehaviorreferenceinxamlxmlns:behavior="http://schemas.microsoft.com/xaml/behaviors"3.Passmethodtomvvmviabehavior,interaction,trigger,eventname,TargetObject,MethodNameinxaml......
  • WPF控件:密码框绑定MVVM
    以下是一种使用MVVM模式的方法:首先,在ViewModel中添加一个属性来保存密码,我们可以使用SecureString类型。//密码变量privateSecureString_password;//密码属性,用于获取和设置密码publicSecureStringPassword{get{return_passw......
  • RuntimeBroker.exe 是 Windows 操作系统中的一个系统进程,它负责管理 Metro 应用程序(现
    RuntimeBroker.exe是Windows操作系统中的一个系统进程,它负责管理Metro应用程序(现在称为UniversalWindowsPlatform应用程序)的权限和沙盒环境。该进程通常在用户登录后启动,并且对于每个用户会话都会有一个实例在运行。具体来说,RuntimeBroker主要有以下作用:权限管......