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模式打开和关闭当前界面,希望本文对你可以有帮助。