.NET_WPF_使用Livecharts数据绑定图表
相关概念
- LiveCharts 是一个开源的图表库,适用于多种 .NET 平台,包括 WPF、UWP、WinForms 等。
- LiveCharts 通过数据绑定与 MVVM 模式兼容,使得视图模型可以直接控制图表的显示,无需直接操作 UI 元素。这使得代码更加模块化,易于维护和测试。
- 在WPF中通过XAML代码实现生成不同的图表。
WPF中 LiveCharts 不同图表类型
图表类型 | XML示例 |
折线图(Line Chart) | <lvc:LineChart Series="{Binding SeriesCollection}"> |
柱状图(Column Chart) | <lvc:ColumnChart Series="{Binding SeriesCollection}"> |
饼图(Pie Chart) | <lvc:PieChart Series="{Binding SeriesCollection}"> |
散点图(Scatter Chart) | <lvc:ScatterChart Series="{Binding SeriesCollection}"> |
雷达图(Radar Chart) | <lvc:RadarChart Series="{Binding SeriesCollection}"> |
模拟股票监控demo:
步骤:
- 安装livecharts。
- 定义 ViewModel。
- 定义View。
- 在view后端进行数据绑定。
- 运行文件。
步骤1.
| 步骤3. |
| 步骤5. |
步骤2.
using LiveCharts;
using LiveCharts.Wpf;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Timers;namespace test.ModelView
{// 定义一个名为StockPriceViewModel的公共类,实现INotifyPropertyChanged接口public class StockPriceViewModel : INotifyPropertyChanged{// 声明一个私有变量,用于存储图表系列集合private SeriesCollection seriesCollection;// 声明一个私有变量,用于存储图表的值集合private ChartValues<decimal> priceValues;// 声明一个私有变量,用于存储时间格式化函数private Func<double, string> dateTimeFormatter;// 提供一个公共属性,用于绑定到视图的SeriesCollectionpublic SeriesCollection SeriesCollection{get { return seriesCollection; } // 获取系列集合set{seriesCollection = value; // 设置系列集合OnPropertyChanged(nameof(SeriesCollection)); // 通知属性已更改}}// 提供一个公共属性,用于绑定到视图的时间格式化函数public Func<double, string> DateTimeFormatter{get { return dateTimeFormatter; } // 获取时间格式化函数set{dateTimeFormatter = value; // 设置时间格式化函数OnPropertyChanged(nameof(DateTimeFormatter)); // 通知属性已更改}}// 构造函数,当创建StockPriceViewModel实例时执行public StockPriceViewModel(){priceValues = new ChartValues<decimal>(); // 初始化价格值集合SeriesCollection = new SeriesCollection // 初始化系列集合,并添加一个折线系列{new LineSeries{Values = priceValues // 将价格值集合赋给折线系列的Values属性}};// 设置X轴为时间,并定义格式化显示的函数DateTimeFormatter = value => new DateTime((long)value).ToString("HH:mm:ss");// 创建一个定时器,用于模拟实时数据更新var timer = new Timer(1000); // 设置定时器间隔为1000毫秒(1秒)timer.Elapsed += (sender, args) => UpdatePrice(); // 当定时器触发时调用UpdatePrice方法timer.Start(); // 启动定时器}// 更新价格的私有方法,用于模拟新价格的添加private void UpdatePrice(){var newPrice = new Random().Next(100, 200); // 生成一个100到200之间的随机价格priceValues.Add(newPrice); // 将新价格添加到价格值集合中OnPropertyChanged(nameof(SeriesCollection)); // 通知SeriesCollection属性已更改}// 声明一个公共事件,用于通知属性更改public event PropertyChangedEventHandler PropertyChanged;// 受保护的虚方法,用于触发属性更改事件protected virtual void OnPropertyChanged(string propertyName){PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); // 触发事件}}}
步骤3.
<Grid><lvc:CartesianChart Series="{Binding SeriesCollection}"><lvc:CartesianChart.AxisX><lvc:Axis Title="时间" LabelFormatter="{Binding DateTimeFormatter}" /></lvc:CartesianChart.AxisX><lvc:CartesianChart.AxisY><lvc:Axis Title="价格" /></lvc:CartesianChart.AxisY></lvc:CartesianChart></Grid>
步骤4.
InitializeComponent();this.DataContext = new StockPriceViewModel();相关文章:
.NET_WPF_使用Livecharts数据绑定图表
相关概念 LiveCharts 是一个开源的图表库,适用于多种 .NET 平台,包括 WPF、UWP、WinForms 等。LiveCharts 通过数据绑定与 MVVM 模式兼容,使得视图模型可以直接控制图表的显示,无需直接操作 UI 元素。这使得代码更加模块化&#x…...
一句JS代码,实现随机颜色的生成
今天我们只用 一句JS代码,实现随机颜色的生成,首先看一下效果: 每次刷新浏览器背景颜色都不一样 实现此效果的JS函数 : let randomColor () > ...: 定义一个箭头函数randomColor,用于生成一个随机颜色。 Math.ra…...
校园抢课助手【7】-抢课接口限流
在上一节中,该接口已经接受过风控的处理,过滤掉了机器人脚本请求,剩下都是人为的下单请求。为了防止用户短时间内高频率点击抢课链接,海量请求造成服务器过载,这里使用接口限流算法。 先介绍下几种常用的接口限流策略…...
char类型和int类型
一、char类型 在Java中,char(字符)类型用于表示单个字符,它是基本数据类型之一。以下是关于Java中char类型的一些重要信息: 表示方式: char类型用于存储Unicode字符,占用16位(即2个字…...
C++参悟:stl中的比较最大最小操作
stl中的比较最大最小操作 一、概述二、最小值1. min2. min_element 三、最大值1. max2. max_element 四、混合1. minmax2. minmax_element 一、概述 记录这里C11中常用的最小值和最大值的比较函数,最好的参考资料其实就是 https://zh.cppreference.com 最重要的查…...
JAVA读取netCdf文件并绘制热力图
读取netCdf的依赖 <dependency><groupId>ucar</groupId><artifactId>netcdfAll</artifactId><version>5.5.3</version><scope>system</scope><exclusions><exclusion><groupId>org.slf4j</groupId…...
数据结构——八大排序
一.排序的概念和其应用 1.1排序的概念 排序:排列或排序是将一组数据按照一定的规则或顺序重新组织的过程,数据既可以被组织成递增顺序(升序),或者递减顺序(降序)。稳定性:假定在待…...
【Unity】RPG2D龙城纷争(十九)流程与UI界面(终章)
更新日期:2024年8月1日。 项目源码:第五章发布(正式开始游戏逻辑的章节) 索引 简介一、游戏流程1.初始化流程2.开始流程3.关卡流程4.关卡结束流程5.启用所有流程二、UI界面逻辑1.开始界面2.存档界面3.关卡界面DataRegion 数据显示逻辑区域RoundRegion 回合逻辑区域RoleMenu…...
C#类和结构体的区别
1、类class是引用类型,多个引用类型变量的值会互相影响。存储在堆(heap)上 2、结构体struct是值类型,多个值类型变量的值不会互相影响。存储在栈(stack)上 类结构关键字classstruct类型引用类型值类型存储…...
【RabbitMQ】RabbitMQ持久化
一、简介 RabbitMQ的持久化机制是一种确保数据在RabbitMQ服务重启或异常情况下不会丢失的重要特性。RabbitMQ的持久化主要包括三个方面的内容:交换器的持久化、队列的持久化、消息的持久化。 二、交换器的持久化 1、实现方式 在RabbitMQ中,实现交换器…...
算法刷题笔记 Kruskal算法求最小生成树(详细算法介绍,详细注释C++代码实现)
文章目录 题目描述基本思路实现代码 题目描述 给定一个n个点m条边的无向图,图中可能存在重边和自环,边权可能为负数。求最小生成树的树边权重之和,如果最小生成树不存在则输出impossible。 最小生成树的概念:给定一张边带权的无向…...
5年经验的软件测试人员,碰到这样的面试题居然会心虚......
我们这边最近的面试机会比较多,但是根据他们的反馈,结束后大部分都没音信了,因为现在企业面试问的非常多,范围非常广,而且开放性的问题很多,很多人即便面试前刷了成百上千道面试题,也很难碰到一…...
C#进阶-轻量级ORM框架Dapper的使用教程与原理详解
本文详细介绍了Dapper在C#中的使用方法,包括Dapper的基本概念、与其他持久层框架的比较、基本语法和高级语法的使用,并通过实例讲解了如何在项目中集成和使用Dapper。Dapper以其高效的性能和简洁的API受到开发者的青睐,适用于各种数据库操作需…...
Windows图形界面(GUI)-MFC-C/C++ - 编辑框(Edit Control) - CEdit
公开视频 -> 链接点击跳转公开课程博客首页 -> 链接点击跳转博客主页 目录 编辑框(Edit Control) - CEdit 基本概念 成员函数 示例代码 编辑框(Edit Control) - CEdit 基本概念 编辑框(Edit Control)是一个允许用户输入和编辑文本的窗…...
网络安全防御【IPsec VPN搭建】
目录 一、实验拓扑图 二、实验要求 三、实验思路 四、实验步骤: 修改双机热备的为主备模式: 2、配置交换机LSW6新增的配置: 3、防火墙(FW4)做相关的基础配置: 4、搭建IPsec VPN通道 (1…...
java环境配置与tomcat的配置
1、java环境配置 一、JDK下载 访问Oracle官网: 前往Oracle官网(Oracle | Cloud Applications and Cloud Platform),在首页的顶部菜单中选择“Resources” > “Downloads” > “Java” > “JDK”。注意:Orac…...
OD C卷 - 来自异国的客人/幸运数字
来自异国的客人/幸运数字(100) 输入描述: 输入k,n,m k表示物品价值(十进制) k>0 n表示幸运数字, n > 0 m表示异国采用的进制;m > 1 n < m 输出描述: 输出幸运数字的个数࿰…...
C++ | 动态内存管理 new、delete (用法、底层)详解
目录 简单回顾C语言动态内存管理 new、delete的用法 内置类型 new delete 自定义类型 new、delete底层讲解(重要) operator new 与 operator delete 定位 new 结语 简单回顾C语言动态内存管理 在C语言的学习阶段 我们接触到了三个能在堆上开辟…...
【C语言】结构体内存布局解析——字节对齐
🦄个人主页:小米里的大麦-CSDN博客 🎏所属专栏:https://blog.csdn.net/huangcancan666/category_12718530.html 🎁代码托管:黄灿灿 (huang-cancan-xbc) - Gitee.com ⚙️操作环境:Visual Studio 2022 目录 一、引言 二、什么是字节对齐&…...
模型表达方式
目录 一、模型表达概述 二、模型精确表达 2.1 几何表示 (Geometrical Representation) 三、模型非精确表达 3.1 网格表示 (Mesh Representation) 3.2 体素表示 (Voxel Representation) 一、模型表达概述 模型的表达方式多种多样,选择适合的表达方式取决于具体应用场景和…...
HUM4D数据集:无标记人体动作捕捉的挑战与评估
1. HUM4D数据集概述HUM4D是一个专门针对无标记人体动作捕捉技术评估的基准数据集,由计算机视觉研究团队开发。这个数据集的核心价值在于填补了现有动作捕捉基准在复杂场景下的空白——那些包含快速运动、严重遮挡、深度突变和身份混淆的真实挑战。在动作捕捉领域&am…...
AI智能体记忆系统设计:分层架构与向量化检索实战
1. 项目概述:一个为AI智能体设计的记忆系统最近在折腾AI智能体(Agent)相关的项目,发现一个挺有意思的痛点:如何让这些智能体拥有“记忆”?不是那种简单的对话历史记录,而是更接近人类工作记忆和…...
为什么你的Gemini写作总像“AI腔”?资深技术文档架构师揭秘3层语义校准法
更多请点击: https://intelliparadigm.com 第一章:为什么你的Gemini写作总像“AI腔”?资深技术文档架构师揭秘3层语义校准法 Gemini 生成的技术文档常被诟病为“语法正确但语义失焦”——术语堆砌、逻辑断层、人机语感割裂。根本原因在于模…...
告别IDEA编译警告:深入解析JDK版本过时问题与多维度解决方案
1. 当IDEA开始"抱怨":那些烦人的编译警告从哪来? 每次打开老项目,总能看到那个熟悉的黄色警告:"Warning:java: 源值1.5已过时,将在未来所有发行版中删除"。这个提示就像个唠叨的老朋友,…...
别只盯着SQL了!GaussDB健康度巡检,这5个‘外围’命令和日志文件更重要
别只盯着SQL了!GaussDB健康度巡检,这5个‘外围’命令和日志文件更重要 当数据库出现性能波动时,大多数DBA的第一反应是检查慢SQL或调整参数。但根据某金融客户的生产环境统计,超过60%的数据库故障其实源于日志溢出、网络闪断或备份…...
设计师连夜删稿的真相:Onion Skin未启用导致版本错位!3分钟紧急修复+历史帧自动锚定脚本
更多请点击: https://intelliparadigm.com 第一章:设计师连夜删稿的真相:Onion Skin未启用导致版本错位!3分钟紧急修复历史帧自动锚定脚本 当动画师在 Toon Boom Harmony 或 Adobe Animate 中反复导出“看似正确”的中间帧&#…...
SteamAutoCrack:3步自动化破解Steam游戏的终极解决方案
SteamAutoCrack:3步自动化破解Steam游戏的终极解决方案 【免费下载链接】Steam-auto-crack Steam Game Automatic Cracker 项目地址: https://gitcode.com/gh_mirrors/st/Steam-auto-crack 你是否厌倦了每次想离线玩游戏时都要手动破解的繁琐过程?…...
保姆级教程:在Ubuntu 22.04上从源码编译DPDK TestPMD并跑通第一个包转发测试
从零构建DPDK TestPMD:Ubuntu 22.04实战指南与性能调优 当你第一次听说DPDK能实现百万级数据包转发时,是否好奇这背后的技术魔法?本文将带你用一台普通Ubuntu服务器,亲手搭建这套高性能网络处理框架。不同于官方文档的抽象描述&am…...
从波形到Mel谱图:机器学习音频特征提取的完整实践指南
1. 音频信号处理基础:从物理世界到数字信号 第一次接触音频信号处理时,我被那一串串看似随机的波形数据弄得一头雾水。直到后来才明白,这些数字背后其实对应着我们熟悉的物理现象——声音。声音的本质是空气压力的变化,就像水面泛…...
Hive内部表 vs 外部表:选错一次,数据全丢?结合HDFS路径详解核心区别与选型指南
Hive内部表与外部表:数据安全与架构设计的深度抉择 在数据仓库与大数据分析领域,Hive作为构建在Hadoop之上的数据仓库工具,其表类型的选择往往被初学者视为简单的语法差异。然而,当生产环境中TB级的数据因为一个DROP TABLE命令而永…...


