当前位置: 首页 > article >正文

使用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 中&#xff0c;DataGrid 是一个独立的包 Avalonia.Controls.DataGrid&#xff0c;因此需要单独通过 NuGet 安装。接下来&#xff0c;将介绍如何安装和使用 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 官网&#xff1a;https://ollama.com/ Ollama可以干什么&#xff1f; 可以快速在本地部署和管理各种大语言模型&#xff0c;操作命令和dokcer类似。 mac安装ollama&#xff1a; # 安装ollama brew install ollama# 启动ollama服务&#xff08;默认11434端口&#xf…...

公司的税收日期的确定(OBCK)

本文主要介绍在S4 HANA OP中S4 HANA公司的税收日期的确定(OBCK)相关设置。具体请参照如下内容&#xff1a; 如果税率是基于日期的&#xff0c;那么以上配置点用来确定基于什么日期来确定最终使用的税率。 如果勾选&#xff0c;则代表以“凭证日期”作为税率确定的日期如果不勾…...

通过高效的侦察发现关键漏洞接管整个IT基础设施

视频教程在我主页简介或专栏里 在这篇文章中&#xff0c; 我将深入探讨我是如何通过详细分析和利用暴露的端点、硬编码的凭据以及配置错误的访问控制&#xff0c;成功获取目标组织关键IT基础设施和云服务访问权限的全过程。 我们先提到目标网站的名称 https://*sub.domain*.co…...

PostGIS笔记:PostgreSQL中表、键和索引的基础操作

创建、查看与删除表 在数据库中创建一个表&#xff0c;使用如下代码&#xff1a; create table streets (id serial not null primary key, name varchar(50));这里的表名是streets&#xff0c;id是主键所以非空&#xff0c;采用serial数据类型&#xff0c;这个数据类型会自动…...

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…...

“腾讯、钉钉、飞书” 会议开源平替,免费功能强大

在数字化时代&#xff0c;远程办公和线上协作越来越火。然而&#xff0c;市面上的视频会议工具要么贵得离谱&#xff0c;要么功能受限&#xff0c;甚至还有些在数据安全和隐私保护上让人不放心。 今天开源君给大家安利一个超棒的开源项目 - Jitsi Meet&#xff0c;这可是我在网…...

接口技术-第4次作业

目录 作业内容 解答 1、设8255A接到系统中&#xff0c;端口A、B、C及控制口地址分别为304H、305H、306H及307H&#xff0c;工作在方式0&#xff0c;试编程将端口B的数据输入后&#xff0c;从端口C输出&#xff0c;同时&#xff0c;将其取反后从端口A输出。 2、下图中&#x…...

【Elasticsearch】Elasticsearch的查询

Elasticsearch的查询 DSL查询基础语句叶子查询全文检索查询matchmulti_match 精确查询termrange 复合查询算分函数查询bool查询 排序分页基础分页深度分页 高亮高亮原理实现高亮 RestClient查询基础查询叶子查询复合查询排序和分页高亮 数据聚合DSL实现聚合Bucket聚合带条件聚合…...

day6手机摄影社区,可以去苹果摄影社区学习拍摄技巧

逛自己手机的社区&#xff1a;即&#xff08;手机牌子&#xff09;摄影社区 拍照时防止抖动可以控制自己的呼吸&#xff0c;不要大喘气 拍一张照片后&#xff0c;如何简单的用手机修图&#xff1f; HDR模式就是让高光部分和阴影部分更协调&#xff08;拍风紧时可以打开&…...

wordpress代码结构解析

WordPress 是一个基于 PHP 和 MySQL 的开源内容管理系统&#xff08;CMS&#xff09;&#xff0c;广泛用于构建网站和博客。要解析 WordPress 代码&#xff0c;首先需要了解其核心结构、主要文件和常用的函数。以下是 WordPress 代码解析的基本指南&#xff1a; --- ### 1. *…...

【Leetcode 热题 100】416. 分割等和子集

问题背景 给你一个 只包含正整数 的 非空 数组 n u m s nums nums。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 数据约束 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 这篇笔记&#xff0c;我们要来介绍实现Java定时任务的第四个方案&#xff0c;使用Spring Task&#xff0c;以及该方案的优点和缺点。 ​ Spring Task是Spring框架提供的一个轻量级任务调度框架&#xff0c;用于简化任务调度的开放&#xff0c;通过注解或XML配置的…...

Linux - 进程间通信(2)

目录 2、进程池 1&#xff09;理解进程池 2&#xff09;进程池的实现 整体框架&#xff1a; a. 加载任务 b. 先描述&#xff0c;再组织 I. 先描述 II. 再组织 c. 创建信道和子进程 d. 通过channel控制子进程 e. 回收管道和子进程 问题1&#xff1a; 解答1&#xff…...

langchain基础(二)

一、输出解析器&#xff08;Output Parser&#xff09; 作用&#xff1a;&#xff08;1&#xff09;让模型按照指定的格式输出&#xff1b; &#xff08;2&#xff09;解析模型输出&#xff0c;提取所需的信息 1、逗号分隔列表 CommaSeparatedListOutputParser&#xff1a;…...

解除阿里云盘压缩包分享限制的最新工具(2025年更新)

前言 前段时间&#xff0c;为了在阿里云盘分享一些资料&#xff0c;尝试了好多种方法&#xff1a;改文件名后缀&#xff0c;打包自解压&#xff0c;使用将压缩文件追加在图片文件后&#xff0c;还有的一些工具&#xff0c;虽然能伪装文件但并不太好用&#xff0c;最后自己写了…...

2025神奇的数字—新年快乐

2025年&#xff0c;一个神奇的数字&#xff0c;承载着数学的奥秘与无限可能。它是45的平方&#xff08;45&#xff09;&#xff0c;上一个这样的年份是1936年&#xff08;44&#xff09;&#xff0c;下一个则是2116年&#xff08;46&#xff09;&#xff0c;一生仅此一次。2025…...

PWM频率测量方法

测量PWM&#xff08;脉宽调制&#xff09;信号的频率是嵌入式系统中的常见需求&#xff0c;尤其是在电机控制、LED调光、传感器信号处理等场景中。 在这里介绍两种测量PWM频率的方法&#xff1a;测频法与测周法。 1、测频&#xff08;率&#xff09;法 原理&#xff1a;在闸门…...

神经网络|(七)概率论基础知识-贝叶斯公式

【1】引言 前序我们已经了解了一些基础知识。 古典概型&#xff1a;有限个元素参与抽样&#xff0c;每个元素被抽样的概率相等。 条件概率&#xff1a;在某条件已经达成的前提下&#xff0c;新事件发生的概率。实际计算的时候&#xff0c;应注意区分&#xff0c;如果是计算综…...

JavaScript系列(47)--音频处理系统详解

JavaScript音频处理系统详解 &#x1f3b5; 今天&#xff0c;让我们深入探讨JavaScript的音频处理系统。Web Audio API为我们提供了强大的音频处理和合成能力&#xff0c;让我们能够在浏览器中实现复杂的音频应用。 音频系统基础概念 &#x1f31f; &#x1f4a1; 小知识&…...

【解决方案】VMware虚拟机adb连接宿主机夜神模拟器

1、本机&#xff08;宿主机&#xff0c;系统windows10&#xff09;ip为192.168.31.108 2、运行模拟器后本机cmd查看端口为62026 3、VMware虚拟机&#xff08;系统&#xff0c;kali&#xff09;adb连接192.168.31.108:62026报错 failed to connect to 192.168.31.108:16416: Co…...

DroneXtract:一款针对无人机的网络安全数字取证工具

关于DroneXtract DroneXtract是一款使用 Golang 开发的适用于DJI无人机的综合数字取证套件&#xff0c;该工具可用于分析无人机传感器值和遥测数据、可视化无人机飞行地图、审计威胁活动以及提取多种文件格式中的相关数据。 功能介绍 DroneXtract 具有四个用于无人机取证和审…...

基于springboot+vue的流浪动物救助系统的设计与实现

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…...

利用ue5制作CG动画笔记

tips&#xff1a; 按住鼠标中键可以拖动枢轴点 在曲线编辑器中按住shift可以使曲线编辑保持在x轴 专业术语&#xff1a; CGI&#xff1a;计算机生成图象&#xff08;computer-generated imagery&#xff09;真实的不算&#xff0c;计算机生成的 Compositing&#xff1a;合…...

AI 图片涌入百度图库

在这个信息爆炸的时代&#xff0c;我们习惯了通过搜索引擎来获取各种想要的信息和图片。然而&#xff0c;现在打开搜索引擎看到的却是许多真假难辨的信息——AI图片&#xff0c;这部分数据正以惊人的速度涌入百度图库&#xff0c;让小编不禁想问&#xff1a;未来打开百度图库不…...

《多阶段渐进式图像修复》学习笔记

paper&#xff1a;2102.02808 GitHub&#xff1a;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返回页面时携带参数到上个页面

我们平时开发中也经常遇到这种场景&#xff0c;跳转一个页面会进行一些操作&#xff0c;操作完成后再返回上个页面同时要携带着一些参数 其实也很简单&#xff0c;也来记录一下吧 假设从A页面 跳转到 B页面 A页面 直接上完整代码了哈&#xff0c;很简单&#xff1a; <t…...

2025.1.26机器学习笔记:C-RNN-GAN文献阅读

2025.1.26周报 文献阅读题目信息摘要Abstract创新点网络架构实验结论缺点以及后续展望 总结 文献阅读 题目信息 题目&#xff1a; C-RNN-GAN: Continuous recurrent neural networks with adversarial training会议期刊&#xff1a; NIPS作者&#xff1a; Olof Mogren发表时间…...