当前位置:   article > 正文

Avalonia框架MVVM模式打开和关闭当前界面_avalonia communitytoolkit

avalonia communitytoolkit

Avalonia框架MVVM模式打开和关闭当前界面和WPF的MVVM模式是一致的,区别只在于Avalonia是跨平台的。本文主要是记录Avalonia框架MVVM模式打开和关闭当前界面,主要是参考了十月的寒流WPF中如何在MVVM模式下关闭窗口这个视频,有兴趣可以看看,里面提供多种方法实现打开和关闭当前界面。因为选择MVVM模式,下载CommunityToolkit.Mvvm库,具体步骤如下:

第一:实现简单的Avalonia界面,包括关闭和最小化两个按钮。

 项目的结构没有变化,主要需要关注的是Command和CommandParameter,这关系到按钮功能的实现。源码如下:

  1. <Window xmlns="https://github.com/avaloniaui"
  2. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  3. xmlns:vm="using:AvaloniaMVVMTest.ViewModels"
  4. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  5. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  6. mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
  7. x:Class="AvaloniaMVVMTest.Views.MainWindow"
  8. x:DataType="vm:MainWindowViewModel"
  9. Icon="/Assets/avalonia-logo.ico"
  10. Title="AvaloniaMVVMTest">
  11. <Design.DataContext>
  12. <vm:MainWindowViewModel/>
  13. </Design.DataContext>
  14. <Grid>
  15. <StackPanel Margin="100,0,0,0" Orientation="Horizontal">
  16. <TextBlock Text="{Binding Greeting}" Margin="100,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  17. </StackPanel>
  18. <StackPanel Margin="100,100,0,0" Orientation="Horizontal">
  19. <Button Content="关闭" Command="{Binding CloseWindowCommand}" CommandParameter="{Binding}"
  20. Height="35" Width="50" Margin="100,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  21. <Button Content="最小化" Command="{Binding MinimizedWindowCommand}" CommandParameter="{Binding}"
  22. Height="35" Width="70" Margin="50,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Center"/>
  23. </StackPanel>
  24. </Grid>
  25. </Window>

其次是改造MainWindowViewModel。

第一步是通过选择管理NuGet包。搜索Microsoft.Toolkit.Mvvm并安装它,步骤见下图;

 第二步是绑定按钮的Command,因为运用了 CommunityToolkit.Mvvm库,所以代码看起来比调用ReactiveObject接口的简洁很多。通过 [ObservableObject]引入CommunityToolkit.Mvvm,通过[RelayCommand]简化Command方法的定义。

  1. using CommunityToolkit.Mvvm.ComponentModel;
  2. using CommunityToolkit.Mvvm.Input;
  3. using CommunityToolkit.Mvvm.Messaging;
  4. using System;
  5. namespace AvaloniaMVVMTest.ViewModels
  6. {
  7. [ObservableObject]
  8. public partial class MainWindowViewModel
  9. {
  10. public string Greeting => "Welcome to Avalonia!";
  11. //最小化窗口
  12. [RelayCommand]
  13. void MinimizedWindow()
  14. {
  15. }
  16. //关闭窗口
  17. [RelayCommand]
  18. void CloseWindow()
  19. {
  20. }
  21. }
  22. }

第三步通过WeakReferenceMessenger实现功能,WeakReferenceMessenger是CommunityToolkit.Mvvm的信使弱引用。创建Messenger文件夹,在创建CloseWindowMessage和MinimizedWindowMessage类。

CloseWindowMessage类如下

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace AvaloniaMVVMTest.Messenger
  7. {
  8. class CloseWindowMessage
  9. {
  10. public WeakReference? Sender { get; set; }
  11. }
  12. }

MinimizedWindowMessage类如下

  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. namespace AvaloniaMVVMTest.Messenger
  7. {
  8. class MinimizedWindowMessage
  9. {
  10. public WeakReference? Sender { get; set; }
  11. }
  12. }

第四步在MainWindowViewModel中补充[RelayCommand]下的方法内容,重点关注标红的内容。

  1. //最小化窗口
  2. [RelayCommand]
  3. void MinimizedWindow()
  4. {
  5. WeakReferenceMessenger.Default.Send(new MinimizedWindowMessage
  6. {
  7. Sender = new WeakReference(this)
  8. });
  9. }
  10. //关闭窗口
  11. [RelayCommand]
  12. void CloseWindow()
  13. {
  14. WeakReferenceMessenger.Default.Send(new CloseWindowMessage
  15. {
  16. Sender = new WeakReference(this)
  17. });
  18. }

再次需要改造MainWindow.axaml.cs的数据绑定,见下图

  1. using Avalonia.Controls;
  2. using AvaloniaMVVMTest.Messenger;
  3. using AvaloniaMVVMTest.ViewModels;
  4. using CommunityToolkit.Mvvm.Messaging;
  5. namespace AvaloniaMVVMTest.Views
  6. {
  7. public partial class MainWindow : Window
  8. {
  9. public MainWindow()
  10. {
  11. InitializeComponent();
  12. this.DataContext = new MainWindowViewModel();
  13. //关闭窗口
  14. WeakReferenceMessenger.Default.Register<CloseWindowMessage>(this, (_, m) =>
  15. {
  16. this.Close();
  17. });
  18. //最小化窗口
  19. WeakReferenceMessenger.Default.Register<MinimizedWindowMessage>(this, (_, m) =>
  20. {
  21. this.WindowState = WindowState.Minimized;
  22. });
  23. }
  24. }
  25. }

 最后就实现了Avalonia框架MVVM模式打开和关闭当前界面,希望本文对你可以有帮助。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号