在Wpf下最常使用的就是Mvvm模式了,有自己造轮子构建Mvvm框架的,也有使用现成的开源项目,我之前一直使用的是轻量级的MvvmLight了,这个框架还是非常不错的,使用也简单,不占用太大空间,其中最喜欢的莫过于全局Messenger了,可谓是神器。最近有个项目使用.Net6开发,在NuGet发现MvvmLight已经很久不更新了,上一次还是2018年9月12日,偶然发现微软官方出的Microsoft.Toolkit.Mvvm 完全继承了Messenger的优良传统,这是一个官方社区套件(Windows Community Toolkit),延续了MVVMLight的风格,是一个轻量级的组件,而且它基于.NET Standard 2.0,可用于UWP, WinForms, WPF, Xamarin, Uno等多个平台。

相比它的前身 MVVMLight,它有以下特点:
更高:版本号更高,一出手就是7.0。
更快:速度更快,MVVM Toolkit从一开始就以高性能为实现目标。
更强:后台更强,MVVM Toolkit的全程是’Microsoft.Toolkit.Mvvm’,根正苗红。

官方文档地址:
链接: https://docs.microsoft.com/zh-cn/windows/communitytoolkit/mvvm/introduction

运行环境:.Net 6
开发环境:VS2022 17.0.4
框架语言:WPF

CommunityToolkit.Mvvm 和 Microsoft.Toolkit.Mvvm 有啥区别[doge脸]
哈哈,从Nuget包管理中可以看到,两个套件除了名字不同,其他几乎一模一样,微软改名部实锤了,
在这里插入图片描述

如果用过MvvmLight的话,上手应该是非常简单的

1、ObservableObject的使用

在MvvmLight框架下,只要在ViewModel继承ViewModelBase即可,在Microsoft.Toolkit.Mvvm中正常继承ObservableObject即可,同时还有ObservableRecipient、ObservableValidator等可被选择,其实在MvvmLight框架下,ViewModelBase也是继承了ObservableObject,相当于官方的这个框架更加的灵活,在不同的场景下继承不同的类,以实现不同的效果,这也跟.Net Core很像,一切都更加原子化,模块化。
ObservableObject:实现了最基本的属性更新:SetProperty 等
ObservableRecipient:继承自ObservableObject,增加了Messenger的相关功能
ObservableValidator:这个就更不用说了,看名字就知道是用于验证属性的

public class MainWindowViewModel : ObservableObject
        public MainWindowViewModel()
            Status = "Hello";
        private string _status;
        public string Status
            get => _status;
            set => SetProperty(ref _status, value);

前端绑定属性就行了

 <TextBlock Margin="10" Text="{Binding Status}" />
2、IRelayCommand和IAsyncRelayCommand

要实现按钮的点击事件进行绑定,都需要使用继承自ICommand的接口,IRelayCommand和IAsyncRelayCommand也是如此,同时增加了NotifyCanExecuteChanged来通知ICommand.CanExecute属性发生了改变。
这里以IAsyncRelayCommand为例来实现一个进度条的功能,

public class MainWindowViewModel : ObservableObject
        public MainWindowViewModel()
            Status = "Hello";
            ExecCommand = new AsyncRelayCommand(ExecAsync);
        private string _status;
        public string Status
            get => _status;
            set => SetProperty(ref _status, value);
        private int _progressValue;
        public int ProgressValue
            get => _progressValue;
            set => SetProperty(ref _progressValue, value);
        public ICommand ExecCommand { get; }
        private async Task ExecAsync()
            Status = "Processing...";
            await Task.Run(async () =>
                for (int i = 0; i <= 100; i++)
                    ProgressValue = i;
                    await Task.Delay(100);
            });
            Status = "Complete";
            <StackPanel x:Name="sp1">
                <Button Margin="10" Command="{Binding ExecCommand}" Content="Button" />
                <TextBlock Margin="10" Text="{Binding Status}" />
                <ProgressBar Margin="10" Value="{Binding ProgressValue}" Minimum="0" Maximum="100" />
            </StackPanel>
3、Messenger的使用

在MvvmLight框架下,只要注册一下

Messenger.Default.Register<string>(this, "ReceiveMessage", ReceiveMessage);

在任意地方只要

Messenger.Default.Send<string>("Hello", "ReceiveMessage");

就能在注册的类中收到该消息,并进行相应的处理。
在MVVM Toolkit也很好的继承了这一功能,而且使用更方便,提供了WeakReferenceMessenger和StrongReferenceMessenger,两个都继承自IMessenger,从名字就可看出各自的不同用途,说实话,到目前为止我也没用过StrongReferenceMessenger,项目中一直使用的是WeakReferenceMessenger,想了解的具体可查看官方
文档
实际实用中,WeakReferenceMessenger可以在任意地方使用

WeakReferenceMessenger.Default.Register<string>(this, OnReceive);
private void OnReceive(object recipient, string message)
     ReceiveMessage = message;

这样只需要在任意地方send即可

WeakReferenceMessenger.Default.Send("Hello");

在上方讲ObservableObject中提到ObservableRecipient是实现了Messenger,那实际使用中可以这样,继承ObservableRecipient,并实现IRecipient

public class MainWindowViewModel : ObservableRecipient,IRecipient<MessageModel>
        public MainWindowViewModel()
            Status = "Hello";
            ExecCommand = new AsyncRelayCommand(ExecAsync);
        private string _status;
        public string Status
            get => _status;
            set => SetProperty(ref _status, value);
        private int _progressValue;
        public int ProgressValue
            get => _progressValue;
            set => SetProperty(ref _progressValue, value);
        private string _receiveMessage;
        public string ReceiveMessage
            get => _receiveMessage;
            set => SetProperty(ref _receiveMessage, value);
        public ICommand ExecCommand { get; }
        private async Task ExecAsync()
            Status = "Processing...";
            await Task.Run(async () =>
                for (int i = 0; i <= 100; i++)
                    ProgressValue = i;
                    await Task.Delay(100);
            });
            Status = "Complete";
            WeakReferenceMessenger.Default.Send(new MessageModel { Num= 123, Str=DateTime.Now.ToString()});
        public void Receive(MessageModel message)
            ReceiveMessage = $"Num={message.Num},Str={message.Str}";

IRecipient要求实现Receive方法,继承这个接口就相当于Register了,这里需要注意的是,在ObservableRecipient中有一个属性来指示当前类是否被注册了

this.IsActive = true;

只有设置为true,才能收到消息。
这个可以理解为是解除注册的设置,如果是正常使用Messenger,一般需要在关闭页面将注册的消息注销,可以这么做

this.Unloaded += (sender, e) => WeakReferenceMessenger.Default.UnregisterAll(this);

将当前界面的所有消息进行注销。

4、IOC的使用

在.Net Core之后,Asp.Net Web上经常会使用IOC(控制反转)将一些接口或者配置文件进行依赖注入,在WPF中可能很少使用这一功能,在MVVM Toolkit框架中也实现了这个功能

    public interface IFoo
        string GetText();
    public class Foo : IFoo
        public string GetText()
            return "Hello";
    //这里使用了ServiceCollection,需要另外引入Microsoft.Extensions.DependencyInjection
    public partial class App : Application
        public App()
            Ioc.Default.ConfigureServices(new ServiceCollection().AddSingleton<IFoo,Foo>().BuildServiceProvider());

这样可以在任意地方使用

    public class MainWindow4ViewModel: ObservableObject
        public MainWindow4ViewModel()
            Text1 =Ioc.Default.GetService<IFoo>().GetText();
        private string _text1;
        public string Text1
            get => _text1;
            set => SetProperty(ref _text1, value);

官方的这个套件功能还是非常强大的,而且很轻量,更新速度也较快,截止到2021年12月,最近版本的发布日期为2021年11月19日,还是非常不错的,从官方公布的使用对比速度来看,还是很快的。
在这里插入图片描述

前言在Wpf下最常使用的就是Mvvm模式了,有自己造轮子构建Mvvm框架的,也有使用现成的开源项目,我之前一直使用的是轻量级的MvvmLight了,这个框架还是非常不错的,使用也简单,不占用太大空间,其中最喜欢的莫过于全局Messenger了,可谓是神器。最近有个项目使用.Net6开发,在NuGet发现MvvmLight已经很久不更新了,上一次还是2018年9月12日,偶然发现微软官方出的Microsoft.Toolkit.Mvvm 完全继承了Messenger的优良传统,这是一个官方社区套件(Windo
MVVMSample003 Microsoft.Toolkit.Mvvm示例3-Messenger 使用WeakReferenceMessenger发送字符串的样本 ObservableObject 弱参考信使
如果你对WPF有一定了解,你会发现WPF中的命令就是一个实现了ICommand接口的类。同样本文虽然标题是Messenger,但也要从IMessenger接口说起。至于Messenger的中文名,我觉得就叫它的直译“信使”好了,毕竟传递消息就是信使的能力嘛。命名空间:Microsoft.Toolkit.Mvvm.Messaging 程序集:Microsoft.Toolkit.Mvvm.dll 包:Microsoft.Toolkit.MvvmIMessenger接口使实现它的类具有在不同对象之间交换消息的能力
所处的位置, 命名控件:Microsoft.Toolkit.Mvvm.ComponentModel 程序集:Microsoft.Toolkit.Mvvm.dll 包:Microsoft.Toolkit.MvvmObservableRecipient类型是可监视对象(Observable objects)的一个基类,这些对象扮演着消息接收者的角色。ObservableRecipient类是ObservableObject的拓展,它也提供了使用IMessenger类型的内置支持。 继承关系: Object→O
1. 什么是 MVVM Toolkit 模型-视图-视图模型 (MVVM) 是用于解耦 UI 代码和非 UI 代码的 UI 体系结构设计模式。 借助 MVVM,可以在 XAML 中以声明方式定义 UI,并使用数据绑定标记将 UI 链接到包含数据和命令的其他层。 微软虽然提出了 MVVM,但又没有提供一个官方的 MVVM 库(多年前有过 Prism,但已经离家出走了)。每次有人提起 MVVM 库,有些人会推荐 Prism(例如我),有些人会推荐 MVVMLight。可是现在 Prism 已经决定不再支持
转自:https://blog.csdn.net/zmx729618/article/details/54093532 在Java里, 当一个对象o被创建时, 它被放在Heap里. 当GC运行的时候, 如果发现没有任何引用指向o, o就会被回收以腾出内存空间. 或者换句话说, 一个对象被回收, 必须满足两个条件: 1)没有任何引用指向它 2)GC被运行。 我们往往通过把所有指向某个对象的ref...
WPF MVVM框架漂亮界面.rar是一个WPF应用程序的代码文件。WPF即Windows Presentation Foundation,是一种基于.NET框架的技术,用于创建漂亮、高性能的Windows应用程序。MVVM是一种架构模式,它将用户界面、应用逻辑和数据模型分离,有助于提高应用程序的可测试性和可维护性。 这个rar文件包含了使用MVVM模式构建WPF应用程序的代码和界面设计,其中界面非常漂亮。通过对这个代码文件的研究,可以学习如何使用MVVM模式进行应用程序的开发和如何设计美观的用户界面。 在WPF MVVM框架中,View层用于显示用户界面,ViewModel层用于控制用户界面和应用程序逻辑之间的交互,Model层用于处理业务逻辑和数据。通过这种分层结构,每一层都可以独立地进行开发和测试,使得应用程序更加可维护和可扩展。 总之,WPF MVVM框架漂亮界面.rar是一个很好的学习资源,对于想要深入了解WPFMVVM的开发者来说,是一个非常有价值的文件。
<Grid Name="Content" > <wv2:WebView2 Name="webView" Visibility="Visible"/> <Button Content="aaaa"/> </Grid> [/code]
Wpf在.Net 6 下该用哪个Mvvm框架-Microsoft.Toolkit.Mvvm xiaguangbo: Community.Toolkit.Mvvm已经弃用了,CommunityToolkit.Mvvm正常 WebView2 使用及现状 小兵小卒: 这个方案可以 WebView2 使用及现状 陈明亮chenml: 关于部署得时候如何处理 webview2 得运行时环境。我建议可以使用innosetup ,里面可以配置安装前得处理事件,先校验是否安装webview2,若没有先安装webiew2 在执行应用得安装