WPF学习笔记(26)CommunityToolkit.Mvvm与MaterialDesignThemes

CommunityToolkit.Mvvm与界面库

  • [一、 CommunityToolkit.Mvvm框架](#一、 CommunityToolkit.Mvvm框架)
    • [1. 常用的MVVM框架](#1. 常用的MVVM框架)
    • [2. CommunityToolkit.Mvvm概述](#2. CommunityToolkit.Mvvm概述)
    • [3. CommunityToolkit.Mvvm详解](#3. CommunityToolkit.Mvvm详解)
  • [二、 CommunityToolkit.Mvvm源生成器](#二、 CommunityToolkit.Mvvm源生成器)
    • [1. 源生成器概述](#1. 源生成器概述)
    • [2. 示例](#2. 示例)
  • 三、界面库MaterialDesignThemes
    • [1. 概述](#1. 概述)
    • [2. 示例](#2. 示例)

一、 CommunityToolkit.Mvvm框架

1. 常用的MVVM框架

2. CommunityToolkit.Mvvm概述

官方文档:https://learn.microsoft.com/zh-cn/dotnet/communitytoolkit/mvvm/

3. CommunityToolkit.Mvvm详解

以上文中的LoginViewModel为例,将自写的BaseViewModel类改为继承自CommunityToolkit.Mvvm中的ObservableObject

将自写的MainWindowViewModel类改为继承自CommunityToolkit.Mvvm中的ObservableObject

二、 CommunityToolkit.Mvvm源生成器

1. 源生成器概述

官方文档:https://learn.microsoft.com/zh-cn/dotnet/communitytoolkit/mvvm/generators/overview


2. 示例

源生成器不支持 .net framework,本次使用 .net6.0

将上文中的View、ViewModel、Model文件夹及其内容分别放到新建立的解决方案中。

重新配置App.xaml和App.xaml.cs

xml 复制代码
<Application x:Class="_077.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:local="clr-namespace:_077"
             ShutdownMode ="OnExplicitShutdown">
            <!--不设置StartupUri,通过OnStartup 指定启动 -->
            <!--这里OnExplicitShutdown是手动调用Shutdown, 否则程序不会自动关闭程序。-->
    <Application.Resources>
         
    </Application.Resources>
</Application>
csharp 复制代码
public partial class App : Application
    {//重写方法
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);

            //先弹出登录窗口
            Login login = new Login();
            bool? ret = login.ShowDialog();
            if (ret == true)
            {
                //成功登录显示主窗口
                MainWindow mainWindow = new MainWindow();
                mainWindow.ShowDialog();

                //关闭程序
                App.Current.Shutdown();
            }

        }
    }






csharp 复制代码
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Model;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Input;

namespace ViewModel
{
    //批注了之后,源生成器 会将 ViewModel 自动实现 INotifyPropertyChanged

    [ObservableObject]
    internal partial class LoginViewModel
    {

        //构造函数
        public LoginViewModel()
        {

        }

        //源生成器自动将首字母大写生成属性
        [ObservableProperty]
        private string name = "admin";


        //源生成器自动将首字母大写生成属性
        [ObservableProperty]
        private string? pwd = null;

        //属性对应,界面上报错Label控件  
        [ObservableProperty]
        private string error = "暂无信息";


        //命令属性,对应界面上的登录事件
        //源生成器,自动生成Login + Command的类型
        [RelayCommand]
        public void Login (object parameter)
        {
            //Execute方法中实现命令处理逻辑

            if (string.IsNullOrEmpty(Name) || string.IsNullOrEmpty(Pwd))
            {
                Error = "用户名密码不能为空!";
                return;
            }
            //检查登录信息
            User u = dal.FindUserByName(Name);

            if (u != null && u.Pwd == Pwd)
            {
                Window? w = parameter as Window;
                w.DialogResult = true;//关闭窗口
            }
            else
                Error = "用户名密码错误!";
        }

        //数据访问层
        public DAL dal = new DAL();
    }
}
csharp 复制代码
using CommunityToolkit.Mvvm.ComponentModel;
using CommunityToolkit.Mvvm.Input;
using Model;
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Reflection.Metadata;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Input;

namespace ViewModel
{
    //批注了之后,源生成器  会将 ViewModel 自动实现 INotifyPropertyChanged
    [ObservableObject]
    internal partial class MainWindowViewModel
    {
        //数据访问层
        public DAL dal = new DAL();

        public MainWindowViewModel()
        {
            Books = dal.GetBookList();
        }


        //对应界面上的  ListView显示的数据
        //ObservableCollection 可以通知界面更新的
        //源生成器自动将首字母大写生成属性
        [ObservableProperty]
        private ObservableCollection<Book> books;

        //删除命令 ,对应界面的删除按钮的点击操作
        //源生成器,会自动生成   (方法名)Del + Command 的命令类型,实现ICommand
        [RelayCommand]
        public void Del(object parameter)
        {
            Book b = parameter as Book;
            //删除执行的内容
            Books.Remove(b);
        }
    }
}

三、界面库MaterialDesignThemes

1. 概述

官方链接:https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit

演示app:https://github.com/MaterialDesignInXAML/MaterialDesignInXamlToolkit/releases

2. 示例

内容来自链接的演示内容

xml 复制代码
<Application 
  x:Class="Example.App"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:materialDesign="http://materialdesigninxaml.net/winfx/xaml/themes"
  StartupUri="MainWindow.xaml">
    <Application.Resources>
        <ResourceDictionary>
            <ResourceDictionary.MergedDictionaries>
                <materialDesign:BundledTheme BaseTheme="Light" PrimaryColor="DeepPurple" SecondaryColor="Lime" />

                <ResourceDictionary Source="pack://application:,,,/MaterialDesignThemes.Wpf;component/Themes/MaterialDesign2.Defaults.xaml" /> 
            </ResourceDictionary.MergedDictionaries>
        </ResourceDictionary>
    </Application.Resources>
</Application>


演示效果如下:

相关推荐
clz13145217 小时前
如何设计一个优雅可靠的金融级联机接口
wpf
闲云自留地1 天前
云平台存储管理员:Cinder 创建挂载卷 + Swift 分布式存储原理
分布式·wpf·swift
敲代码的嘎仔2 天前
从集群锁失效到异步领券:我用分布式锁 + Redisson + MQ 把领券接口 RT 从 200ms 压到 15ms
java·数据库·redis·分布式·缓存·ai·wpf
闲云自留地2 天前
OpenStack 的身份管家:Keystone 令牌、RBAC 权限模型拆解
wpf·openstack
FuckPatience4 天前
WPF 窗体唤醒,判断是否已存在,存在则弹出
wpf
程序员清风4 天前
从单体应用到微服务:后端系统拆分的基本方法
微服务·架构·wpf
FuckPatience5 天前
WPF 改变根据某一列条件改变行样式
wpf
dalong106 天前
WPF:DataGrid样式
wpf
samble8 天前
从零搭建工业控制系统(二十二):线程安全与并发控制
c#·wpf·并发·mvvm·线程安全·工业控制
姜穆澜8 天前
OneID 从 0 到 1 完整生产案例(三)
大数据·wpf