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>


演示效果如下:

相关推荐
深漂阿碉10 小时前
WPF打包exe应用的图标问题
wpf
SEO-狼术3 天前
DevExpress WPF Crack, DevExpress WPF v25.1
wpf
小老鼠爱大米3 天前
C# WPF - Prism 学习篇:搭建项目(一)
c#·wpf·prism
博睿谷IT99_3 天前
Hadoop 分布式存储与计算框架详解
wpf
qq_392397124 天前
Redis常用操作
数据库·redis·wpf
三千道应用题4 天前
WPF学习笔记(25)MVVM框架与项目实例
wpf
厦门德仔5 天前
【WPF】WPF(样式)
android·java·wpf
三千道应用题5 天前
WPF学习笔记(24)命令与ICommand接口
wpf
三千道应用题6 天前
WPF学习笔记(16)树控件TreeView与数据模板
wpf