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>


演示效果如下:

相关推荐
Macbethad17 小时前
工业设备数据采集主站程序技术方案
wpf
关关长语1 天前
HandyControl 3.5.x 版本 ListViewItem不显示问题
windows·wpf
Macbethad1 天前
工业设备维护程序技术方案
wpf
Macbethad1 天前
工业设备配方管理系统技术方案
wpf
喵叔哟1 天前
7.日志系统深入
wpf
清风徐来Groot1 天前
WPF布局之Grid
wpf
清风徐来Groot1 天前
WPF布局之WrapPanel
wpf
Macbethad1 天前
WPF工业设备工艺配方流程程序技术方案
wpf
清风徐来Groot1 天前
WPF布局之UniformGrid
wpf
清风徐来Groot1 天前
WPF布局之StackPanel
wpf