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

2023-11-06

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Avalonia框架MVVM模式打开和关闭当前界面 的相关文章

  • C++中operator关键字(重载操作符)

    C 中operator关键字 重载操作符 C 编程语言中重载运算符 operator 介绍 C 编程语言中赋值运算符重载函数 operator 介绍 operator operator operator 操作符重载 参考 C 编程语言中赋值
  • 后端即服务BaaS

    Bmob LeanCloud 腾讯TAB APICloud 作为移动开发者 你应该了解Baas 后端即服务 移动端免费可用的BaaS接入方案 通过Bmob Android轻松制作一个APP Android高效率编码 第三方SDK详解系列 二
  • Multi-Object Tracking with Multiple Cues and Switcher-Aware Classification 论文笔记

    Multi Object Tracking with Multiple Cues and Switcher Aware Classification 似乎是商汤投 CVPR2019的论文 文中提出了一个统一的多目标跟踪 MOT 框架 学习充
  • MFC实现图片浏览器

    MFC实现图片浏览器 源代码可以加微信 DDDDYKAJ 一 功能介绍 该程序是基于对话框的图片管理的程序 改程序有以下几个功能 1 获取加载图片的图片数目 2 按下 下一张 浏览所有图片 3 图片按照序号定位 并显示 4 获取每一张图片的

随机推荐

  • 前端练习项目

    30 Web Projects 30 多个带有 HTML CSS 和 JavaScript 的 Web 项目 由 Packt Publishing 提供 https github com PacktPublishing 30 Web Pro
  • Greenplum 查看连接与锁信息数据字典

    Greenplum 查看连接与锁信息数据字典 目录 查看系统中会话 连接 SQL与锁情况 1 查看当前活动的客户端连接数 2 查询客户端连接的情况 3 查看持有锁和等待锁的一些信息 已经修改验证 4 查询系统中正在执行的或者等待执行的事务
  • 怎么给word文档注音_怎么为整篇word文字添加拼音标注

    类型 教育学习大小 21 8M语言 中文 评分 10 0 标签 立即下载 有时候一篇文章时给小朋友或者中文初学者看的 那么怎样给整篇文章每个字批量添加拼音标注呢 下面小编就来教一下大家 由于对word宏命令不太熟悉 我将个任务分解为三部分
  • 使用Opencv+Python的AR小demo

    摘要 浅浅了解一下 Python OpenCV 试着给自己的 iphone 8 做一下相机标定 github 源码 https github com aeeeeeep OpenCvArDemo 定义 增强现实 AR 是一种真实世界环境的交互
  • java 读取svg_Java Batik操作SVG,实现svg读取,生成,动态操作

    SVG在现在的应用场景中还是很常见的 例如绘制复杂的矢量图形 说到SVG 就不得提下Canvas 在这里我就不详细列举它们之间的不同之处 以及为什么要选择SVG或Canvas了 首先 我的项目是一个Maven项目 所以只需要导入batik的
  • Vuex的简单使用--累加器

    简介 Vuex 是一个专为 Vue js 应用程序开发的 状态管理模式 它采用集中式存储管理应用的所有组件的状态 并以相应的规则保证状态以一种可预测的方式发生变化 安装 在项目根目录执行如下命令来安装 Vuex依赖包 npm install
  • Windows10通过局域网共享文件的方法

    要实现局域网共享 必须两台电脑必须在同一个网段 就是要同时连接同一个路由器 两台电脑最好都使用以下设置 在主电脑和需要复制文件的电脑中 点击 开始 菜单 选择 设置 打开后点击 网络 选择共享中心 在主电脑中需要共享的文件夹中做以下设置 要
  • ROS STAGE教程2(地图定义和GMAPPING建图)

    目前用在ROS Kinetic上的stage版本为4 1 官方教程http rtv github io Stage modules html 用户可以用stage或者gazebo来创建地图和机器人 传感器模型来进行仿真 并与自己的SLAM模
  • 在运行hive时报错 权限问题

    在运行hive时报错 tmp hive on HDFS should be writable Current permissions are rwx 这是 tmp hive文件夹权限不够 须要提升权限 操作例如以下命令就可以解决这个问题 h
  • R语言如何导入数据

    在使用R的时候 我们肯定需要导入数据 现在总结一下如何导入不同类型的数据 1 使用键盘输入数据 在导入数据比较少的时候 我们使用这种方法 R中的函数 edit 会自动调用一个允许手动输入数据的文本编辑器 具体步骤如下 1 创建一个空数据框
  • python基础(第六章)文件读写+算法

    文件读写 1 文件 1 Python2 File Python3 TextIOWrapper 2 一定要有file文件路径 路径 文件名 文件格式 否则 TypeError Required argument file pos 1 not
  • 记录基于STM32的独轮车测试板构建(一)电机篇

    今年是学校第一次参加智能车竞赛 毫无传承下想要脱颖而出那必定得先发制人 预选的是独轮车组 得用完全陌生的英飞凌单片机搞全新的独轮车模 难度不小 前些天看了看龙邱的库 在配套的母版上确实很简单好用 但独轮车母版和配套工程还不知道啥时候才有 如
  • 流水线合成材料依赖表的生成算法

    前不久玩了一个烧脑的游戏 异星工厂 就是开局一农民 然后通过建造自动化的流水线 最后合成宇宙飞船飞回故乡的故事 其中自动化的流水线需要玩家自己规划 比如这样的 下面的这个是游戏中的一个物品 电力机械臂 的合成配方 可以看到 这里合成一个 电
  • 配置网卡和修改ip地址

    修改ip地址有两种方法 1 临时修改 执行命令 ifconfig eth0 需要修改的ip地址 重新启动网络 systemctl restart network 2 永久修改 vim etc sysconfig network script
  • Java使用IO流读取TXT文件

    通过BufferedReader读取TXT文件 window系统默认的编码是GBK 而IDE的编码多数为UTF 8 如果没有规定new InputStreamReader new FileInputStream file GBK 为GBK会
  • 创建型模式之简单工厂模式——接口和抽象类

    本文收录于专栏 源码中的设计模式 理论与实战的完美结合 作者其它优质专栏推荐 技术专家修炼 搞技术 进大厂 聊人生三合一专栏 leetcode 300题 每天一道算法题 进大厂必备 糊涂算法 从今天起 迈过数据结构和算法这道坎 从实战学py
  • Visual Studio Community2019的安装过程

    Visual Studio Community2019的安装过程 一 下载安装包 浏览器搜索 visual studio community 选择一个合适的版本或者搜索网址 https visualstudio microsoft com
  • Chisel 手册(中文part1)

    Chisel 手册 part1 作者 Jonathan Bachrach Huy Vo Krste Asanovi EECS Department UC Berkeley 译者 智能物联 CSDN 1 简介 本文为Chisel手册 Cons
  • 温度检测模块 DS18B20 数据解析

    目录 1 DSB18B20结构框图解析 2 64 bit ROM 发送时低位优先 3 16 bit 温度寄存器 4 8 bit 配置寄存器 5 8 bit CRC校验 6 DSB18b20命令格式 7 DSB18b20通信实例实测 1 DS
  • Avalonia框架MVVM模式打开和关闭当前界面

    Avalonia框架MVVM模式打开和关闭当前界面和WPF的MVVM模式是一致的 区别只在于Avalonia是跨平台的 本文主要是记录Avalonia框架MVVM模式打开和关闭当前界面 主要是参考了十月的寒流的WPF中如何在MVVM模式下关