赞
踩
Avalonia框架MVVM模式打开和关闭当前界面和WPF的MVVM模式是一致的,区别只在于Avalonia是跨平台的。本文主要是记录Avalonia框架MVVM模式打开和关闭当前界面,主要是参考了十月的寒流的WPF中如何在MVVM模式下关闭窗口这个视频,有兴趣可以看看,里面提供多种方法实现打开和关闭当前界面。因为选择MVVM模式,下载CommunityToolkit.Mvvm库,具体步骤如下:
第一:实现简单的Avalonia界面,包括关闭和最小化两个按钮。
项目的结构没有变化,主要需要关注的是Command和CommandParameter,这关系到按钮功能的实现。源码如下:
- <Window xmlns="https://github.com/avaloniaui"
- xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
- xmlns:vm="using:AvaloniaMVVMTest.ViewModels"
- xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
- xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
- mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
- x:Class="AvaloniaMVVMTest.Views.MainWindow"
- x:DataType="vm:MainWindowViewModel"
- Icon="/Assets/avalonia-logo.ico"
- Title="AvaloniaMVVMTest">
-
- <Design.DataContext>
- <vm:MainWindowViewModel/>
- </Design.DataContext>
-
- <Grid>
- <StackPanel Margin="100,0,0,0" Orientation="Horizontal">
- <TextBlock Text="{Binding Greeting}" Margin="100,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Center"/>
- </StackPanel>
- <StackPanel Margin="100,100,0,0" Orientation="Horizontal">
- <Button Content="关闭" Command="{Binding CloseWindowCommand}" CommandParameter="{Binding}"
- Height="35" Width="50" Margin="100,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Center"/>
- <Button Content="最小化" Command="{Binding MinimizedWindowCommand}" CommandParameter="{Binding}"
- Height="35" Width="70" Margin="50,0,0,0" HorizontalAlignment="Center" VerticalAlignment="Center"/>
- </StackPanel>
- </Grid>
-
- </Window>

其次是改造MainWindowViewModel。
第一步是通过选择管理NuGet包。搜索Microsoft.Toolkit.Mvvm并安装它,步骤见下图;
第二步是绑定按钮的Command,因为运用了 CommunityToolkit.Mvvm库,所以代码看起来比调用ReactiveObject接口的简洁很多。通过 [ObservableObject]引入CommunityToolkit.Mvvm,通过[RelayCommand]简化Command方法的定义。
- using CommunityToolkit.Mvvm.ComponentModel;
- using CommunityToolkit.Mvvm.Input;
- using CommunityToolkit.Mvvm.Messaging;
- using System;
-
- namespace AvaloniaMVVMTest.ViewModels
- {
- [ObservableObject]
- public partial class MainWindowViewModel
- {
- public string Greeting => "Welcome to Avalonia!";
-
- //最小化窗口
- [RelayCommand]
- void MinimizedWindow()
- {
-
- }
-
- //关闭窗口
- [RelayCommand]
- void CloseWindow()
- {
-
- }
- }
- }

第三步通过WeakReferenceMessenger实现功能,WeakReferenceMessenger是CommunityToolkit.Mvvm的信使弱引用。创建Messenger文件夹,在创建CloseWindowMessage和MinimizedWindowMessage类。
CloseWindowMessage类如下
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace AvaloniaMVVMTest.Messenger
- {
- class CloseWindowMessage
- {
- public WeakReference? Sender { get; set; }
- }
- }
MinimizedWindowMessage类如下
- using System;
- using System.Collections.Generic;
- using System.Linq;
- using System.Text;
- using System.Threading.Tasks;
-
- namespace AvaloniaMVVMTest.Messenger
- {
- class MinimizedWindowMessage
- {
- public WeakReference? Sender { get; set; }
- }
- }
第四步在MainWindowViewModel中补充[RelayCommand]下的方法内容,重点关注标红的内容。
- //最小化窗口
- [RelayCommand]
- void MinimizedWindow()
- {
- WeakReferenceMessenger.Default.Send(new MinimizedWindowMessage
- {
- Sender = new WeakReference(this)
- });
-
- }
-
- //关闭窗口
- [RelayCommand]
- void CloseWindow()
- {
- WeakReferenceMessenger.Default.Send(new CloseWindowMessage
- {
- Sender = new WeakReference(this)
- });
- }

再次需要改造MainWindow.axaml.cs的数据绑定,见下图
- using Avalonia.Controls;
- using AvaloniaMVVMTest.Messenger;
- using AvaloniaMVVMTest.ViewModels;
- using CommunityToolkit.Mvvm.Messaging;
-
- namespace AvaloniaMVVMTest.Views
- {
- public partial class MainWindow : Window
- {
- public MainWindow()
- {
- InitializeComponent();
- this.DataContext = new MainWindowViewModel();
- //关闭窗口
- WeakReferenceMessenger.Default.Register<CloseWindowMessage>(this, (_, m) =>
- {
- this.Close();
- });
- //最小化窗口
- WeakReferenceMessenger.Default.Register<MinimizedWindowMessage>(this, (_, m) =>
- {
- this.WindowState = WindowState.Minimized;
- });
- }
- }
- }

最后就实现了Avalonia框架MVVM模式打开和关闭当前界面,希望本文对你可以有帮助。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。