使用Avalonia UI实现DataGrid
1.Avalonia中的DataGrid的使用
DataGrid 是客户端 UI 中一个非常重要的控件。在 Avalonia 中,DataGrid 是一个独立的包 Avalonia.Controls.DataGrid,因此需要单独通过 NuGet 安装。接下来,将介绍如何安装和使用 DataGrid 控件。
2.安装 DataGrid 包
要使用 DataGrid 控件,首先需要在 NuGet 中安装 Avalonia.Controls.DataGrid 包。只需在 NuGet 搜索框中输入 Avalonia.Controls.DataGrid,然后进行安装即可。
版本选择
在安装 Avalonia.Controls.DataGrid 包时,请确保其版本与 Avalonia 框架版本一致,否则可能导致安装失败。Avalonia 框架版本是您创建项目时选择的“Avalonia Version”。
注:Avalonia框架版本也可以在“依赖项→包”中查看
3.DataGrid的使用
在 App.axaml 文件中(或其他需要使用 DataGrid 的界面文件),需要引用 DataGrid 的样式文件。可以通过以下方式在界面中引入:
<!--下面样式文件二选一-->
<StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml"/>
<StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Simple.xaml"/>
注:必须引用 DataGrid 的样式文件,否则 DataGrid 将无法正确显示。
4.代码实现
App.axaml文件
<Application xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"x:Class="datagridTest.App"RequestedThemeVariant="Default"><!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. --><Application.Styles><FluentTheme/><StyleInclude Source="avares://Avalonia.Controls.DataGrid/Themes/Fluent.xaml"/></Application.Styles>
</Application>
MainWindow.axaml文件
<Window xmlns="https://github.com/avaloniaui"xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"xmlns:local="clr-namespace:datagridTest"x:Class="datagridTest.MainWindow"x:DataType="local:MainWindow"Title="DataGrid Test" Width="400" Height="300"><StackPanel><!-- 显示 People 的数量,修改为显示“行数” --><TextBlock Text="{Binding PeopleCountText}" Margin="10" FontSize="16" /><!-- 按钮:点击后加载数据 --><Button Content="加载数据" Margin="10" Click="LoadDataButton_Click"/><!-- 按钮:点击后清除数据 --><Button Content="清除数据" Margin="10" Click="ClearDataButton_Click"/><!-- DataGrid --><DataGrid Name="DataGrid1" Margin="10" ItemsSource="{Binding People}"SelectionChanged="DataGrid_SelectionChanged"DoubleTapped="DataGrid_DoubleTapped" IsReadOnly="True"><DataGrid.Columns><DataGridTextColumn Header="ID" Binding="{Binding Id}" /><DataGridTextColumn Header="姓名" Binding="{Binding Name}" /><DataGridTextColumn Header="Age" Binding="{Binding Age}" /></DataGrid.Columns></DataGrid></StackPanel>
</Window>
MainWindow.axaml.cs文件
using Avalonia.Controls;
using Avalonia.Markup.Xaml;
using System.Collections.Generic;
using System.ComponentModel;
using System.Runtime.CompilerServices;
using Avalonia.Interactivity;
using MsBox.Avalonia;namespace datagridTest
{public partial class MainWindow : Window, INotifyPropertyChanged{private List<Person> _people;public List<Person> People{get => _people ?? (_people = new List<Person>());set{_people = value;OnPropertyChanged();OnPropertyChanged(nameof(PeopleCountText));}}public string PeopleCountText => $"一共有{People.Count}行数据";public MainWindow(){InitializeComponent();DataContext = this;People = new List<Person>();}private void InitializeComponent(){AvaloniaXamlLoader.Load(this);System.Diagnostics.Debug.WriteLine("XAML loaded successfully");// 获取 DataGrid 控件的引用DataGrid1 = this.FindControl<DataGrid>("DataGrid1");}private void LoadDataButton_Click(object sender, RoutedEventArgs e){People = new List<Person>{new Person { Id = 1, Name = "张三(John Doe)", Age = 30 },new Person { Id = 2, Name = "李四(Jane Smith)", Age = 25 },new Person { Id = 3, Name = "王五(Sam Brown)", Age = 35 }};}private void ClearDataButton_Click(object sender, RoutedEventArgs e){People = new List<Person>();}private void DataGrid_SelectionChanged(object sender, SelectionChangedEventArgs e){if (DataGrid1 == null) return; // 检查 DataGrid1 是否为 nullvar selectedPerson = DataGrid1.SelectedItem as Person;if (selectedPerson != null){MsBox.Avalonia.MessageBoxManager.GetMessageBoxStandard("点击按钮(Button Clicked)", "您点击了: " + selectedPerson.Name).ShowWindowAsync();}}// 双击行时触发private void DataGrid_DoubleTapped(object sender, Avalonia.Interactivity.RoutedEventArgs e){if (DataGrid1 == null) return; // 检查 DataGrid1 是否为 nullvar selectedPerson = DataGrid1.SelectedItem as Person;if (selectedPerson != null){MsBox.Avalonia.MessageBoxManager.GetMessageBoxStandard("点击按钮(Button Clicked)", "您点击了: " + selectedPerson.Id).ShowWindowAsync();}}public event PropertyChangedEventHandler PropertyChanged;protected void OnPropertyChanged([CallerMemberName] string propertyName = null){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));}}public class Person{public int Id { get; set; }public string Name { get; set; }public int Age { get; set; }}
}
代码解析:
1.INotifyPropertyChanged接口:
一定要实现INotifyPropertyChanged接口,否则界面datagrid数据无法展示。INotifyPropertyChanged 接口用于数据绑定通知,确保当数据变化时,界面能够自动更新。
2.数据绑定 (Binding):
在XAML中,DataGrid的ItemsSource属性通过Binding绑定到了People属性。这意味着DataGrid会显示People集合中的数据。
3.后台代码中的People属性:
在MainWindow类中,People是一个List<Person>类型的属性。它存储了要在界面上显示的数据。
4.初始化和数据加载:
MainWindow构造函数中,DataContext被设置为this(即MainWindow的实例),使得XAML中的绑定可以访问People属性。
4.数据加载和清除:
在LoadDataButton_Click方法中,当点击加载数据按钮时,People属性被设置为一个新的List<Person>,这会触发OnPropertyChanged()方法,从而更新界面。
5.DataGrid_SelectionChanged 事件
触发时机:该事件在 DataGrid 中的选中项发生变化时触发。例如,用户点击了某一行或选择了某个单元格时。
6.DataGrid_DoubleTapped 事件事件
触发时机:该事件在 DataGrid 中某行被双击时触发。即用户快速连续点击某一行时触发。
5.界面展示

源码地址:https://download.csdn.net/download/weixin_44643352/90323900
相关文章:
使用Avalonia UI实现DataGrid
1.Avalonia中的DataGrid的使用 DataGrid 是客户端 UI 中一个非常重要的控件。在 Avalonia 中,DataGrid 是一个独立的包 Avalonia.Controls.DataGrid,因此需要单独通过 NuGet 安装。接下来,将介绍如何安装和使用 DataGrid 控件。 2.安装 Dat…...
特权模式docker逃逸
目录 1.环境 2.上线哥斯拉 3.特权模式逃逸 1.判断是否为docker环境 2.判断是否为特权模式 3.挂载宿主机磁盘到docker 4.计划任务反弹shell 1.环境 ubuntu部署一个存在CVE-2017-12615的docker: (ip:192.168.117.147) kali(ip:192.168.117.128) 哥斯拉 2.上线哥斯拉…...
Ollama+DeepSeek本地大模型部署
1、Ollama 官网:https://ollama.com/ Ollama可以干什么? 可以快速在本地部署和管理各种大语言模型,操作命令和dokcer类似。 mac安装ollama: # 安装ollama brew install ollama# 启动ollama服务(默认11434端口…...
公司的税收日期的确定(OBCK)
本文主要介绍在S4 HANA OP中S4 HANA公司的税收日期的确定(OBCK)相关设置。具体请参照如下内容: 如果税率是基于日期的,那么以上配置点用来确定基于什么日期来确定最终使用的税率。 如果勾选,则代表以“凭证日期”作为税率确定的日期如果不勾…...
通过高效的侦察发现关键漏洞接管整个IT基础设施
视频教程在我主页简介或专栏里 在这篇文章中, 我将深入探讨我是如何通过详细分析和利用暴露的端点、硬编码的凭据以及配置错误的访问控制,成功获取目标组织关键IT基础设施和云服务访问权限的全过程。 我们先提到目标网站的名称 https://*sub.domain*.co…...
PostGIS笔记:PostgreSQL中表、键和索引的基础操作
创建、查看与删除表 在数据库中创建一个表,使用如下代码: create table streets (id serial not null primary key, name varchar(50));这里的表名是streets,id是主键所以非空,采用serial数据类型,这个数据类型会自动…...
Yolo11 + OCR 营业执照识别+信息抽取(预期后续改用其他ocr更简单,推理预计使用onnxruntim加速,分c++和python两种方式部署)
目录 一 数据集制作 1 labelimg的安装与使用 2 标注方式 3 数据集制作 二 模型训练 三 使用Yolo11 + OCR 实现“营业执照”信息解析完整方案 1 cutLinesforcode.py 2 getBusinessLicenseContentPart.py 3 getPartWords.py 4 pdfTojpg.py 5 main.py 本项目可用于毕业…...
Linux 学习笔记__Day2
目录 十二、上传和下载文件 十三、软件包的安装和卸载 十四、打包和压缩 1、zip命令 2、tar命令 3、其它打包压缩的命令 十五、Linux进程 1、查看进程 2、终止进程 十六、性能分析top 1、top输出结果说明 2、top常用的选项 3、top交互命令 4、demo01.cpp 5、de…...
“腾讯、钉钉、飞书” 会议开源平替,免费功能强大
在数字化时代,远程办公和线上协作越来越火。然而,市面上的视频会议工具要么贵得离谱,要么功能受限,甚至还有些在数据安全和隐私保护上让人不放心。 今天开源君给大家安利一个超棒的开源项目 - Jitsi Meet,这可是我在网…...
接口技术-第4次作业
目录 作业内容 解答 1、设8255A接到系统中,端口A、B、C及控制口地址分别为304H、305H、306H及307H,工作在方式0,试编程将端口B的数据输入后,从端口C输出,同时,将其取反后从端口A输出。 2、下图中&#x…...
【Elasticsearch】Elasticsearch的查询
Elasticsearch的查询 DSL查询基础语句叶子查询全文检索查询matchmulti_match 精确查询termrange 复合查询算分函数查询bool查询 排序分页基础分页深度分页 高亮高亮原理实现高亮 RestClient查询基础查询叶子查询复合查询排序和分页高亮 数据聚合DSL实现聚合Bucket聚合带条件聚合…...
day6手机摄影社区,可以去苹果摄影社区学习拍摄技巧
逛自己手机的社区:即(手机牌子)摄影社区 拍照时防止抖动可以控制自己的呼吸,不要大喘气 拍一张照片后,如何简单的用手机修图? HDR模式就是让高光部分和阴影部分更协调(拍风紧时可以打开&…...
wordpress代码结构解析
WordPress 是一个基于 PHP 和 MySQL 的开源内容管理系统(CMS),广泛用于构建网站和博客。要解析 WordPress 代码,首先需要了解其核心结构、主要文件和常用的函数。以下是 WordPress 代码解析的基本指南: --- ### 1. *…...
【Leetcode 热题 100】416. 分割等和子集
问题背景 给你一个 只包含正整数 的 非空 数组 n u m s nums nums。请你判断是否可以将这个数组分割成两个子集,使得两个子集的元素和相等。 数据约束 1 ≤ n u m s . l e n g t h ≤ 200 1 \le nums.length \le 200 1≤nums.length≤200 1 ≤ n u m s [ i ] ≤ …...
Java定时任务实现方案(四)——Spring Task
Spring Task 这篇笔记,我们要来介绍实现Java定时任务的第四个方案,使用Spring Task,以及该方案的优点和缺点。 Spring Task是Spring框架提供的一个轻量级任务调度框架,用于简化任务调度的开放,通过注解或XML配置的…...
Linux - 进程间通信(2)
目录 2、进程池 1)理解进程池 2)进程池的实现 整体框架: a. 加载任务 b. 先描述,再组织 I. 先描述 II. 再组织 c. 创建信道和子进程 d. 通过channel控制子进程 e. 回收管道和子进程 问题1: 解答1ÿ…...
langchain基础(二)
一、输出解析器(Output Parser) 作用:(1)让模型按照指定的格式输出; (2)解析模型输出,提取所需的信息 1、逗号分隔列表 CommaSeparatedListOutputParser:…...
解除阿里云盘压缩包分享限制的最新工具(2025年更新)
前言 前段时间,为了在阿里云盘分享一些资料,尝试了好多种方法:改文件名后缀,打包自解压,使用将压缩文件追加在图片文件后,还有的一些工具,虽然能伪装文件但并不太好用,最后自己写了…...
2025神奇的数字—新年快乐
2025年,一个神奇的数字,承载着数学的奥秘与无限可能。它是45的平方(45),上一个这样的年份是1936年(44),下一个则是2116年(46),一生仅此一次。2025…...
PWM频率测量方法
测量PWM(脉宽调制)信号的频率是嵌入式系统中的常见需求,尤其是在电机控制、LED调光、传感器信号处理等场景中。 在这里介绍两种测量PWM频率的方法:测频法与测周法。 1、测频(率)法 原理:在闸门…...
神经网络|(七)概率论基础知识-贝叶斯公式
【1】引言 前序我们已经了解了一些基础知识。 古典概型:有限个元素参与抽样,每个元素被抽样的概率相等。 条件概率:在某条件已经达成的前提下,新事件发生的概率。实际计算的时候,应注意区分,如果是计算综…...
JavaScript系列(47)--音频处理系统详解
JavaScript音频处理系统详解 🎵 今天,让我们深入探讨JavaScript的音频处理系统。Web Audio API为我们提供了强大的音频处理和合成能力,让我们能够在浏览器中实现复杂的音频应用。 音频系统基础概念 🌟 💡 小知识&…...
【解决方案】VMware虚拟机adb连接宿主机夜神模拟器
1、本机(宿主机,系统windows10)ip为192.168.31.108 2、运行模拟器后本机cmd查看端口为62026 3、VMware虚拟机(系统,kali)adb连接192.168.31.108:62026报错 failed to connect to 192.168.31.108:16416: Co…...
DroneXtract:一款针对无人机的网络安全数字取证工具
关于DroneXtract DroneXtract是一款使用 Golang 开发的适用于DJI无人机的综合数字取证套件,该工具可用于分析无人机传感器值和遥测数据、可视化无人机飞行地图、审计威胁活动以及提取多种文件格式中的相关数据。 功能介绍 DroneXtract 具有四个用于无人机取证和审…...
基于springboot+vue的流浪动物救助系统的设计与实现
开发语言:Java框架:springbootJDK版本:JDK1.8服务器:tomcat7数据库:mysql 5.7(一定要5.7版本)数据库工具:Navicat11开发软件:eclipse/myeclipse/ideaMaven包:…...
利用ue5制作CG动画笔记
tips: 按住鼠标中键可以拖动枢轴点 在曲线编辑器中按住shift可以使曲线编辑保持在x轴 专业术语: CGI:计算机生成图象(computer-generated imagery)真实的不算,计算机生成的 Compositing:合…...
AI 图片涌入百度图库
在这个信息爆炸的时代,我们习惯了通过搜索引擎来获取各种想要的信息和图片。然而,现在打开搜索引擎看到的却是许多真假难辨的信息——AI图片,这部分数据正以惊人的速度涌入百度图库,让小编不禁想问:未来打开百度图库不…...
《多阶段渐进式图像修复》学习笔记
paper:2102.02808 GitHub:swz30/MPRNet: [CVPR 2021] Multi-Stage Progressive Image Restoration. SOTA results for Image deblurring, deraining, and denoising. 目录 摘要 1、介绍 2、相关工作 2.1 单阶段方法 2.2 多阶段方法 2.3 注意力机…...
uniapp使用uni.navigateBack返回页面时携带参数到上个页面
我们平时开发中也经常遇到这种场景,跳转一个页面会进行一些操作,操作完成后再返回上个页面同时要携带着一些参数 其实也很简单,也来记录一下吧 假设从A页面 跳转到 B页面 A页面 直接上完整代码了哈,很简单: <t…...
2025.1.26机器学习笔记:C-RNN-GAN文献阅读
2025.1.26周报 文献阅读题目信息摘要Abstract创新点网络架构实验结论缺点以及后续展望 总结 文献阅读 题目信息 题目: C-RNN-GAN: Continuous recurrent neural networks with adversarial training会议期刊: NIPS作者: Olof Mogren发表时间…...
