avalonia、WPF使用ScottPlot动态显示ECG心电图

这篇具有很好参考价值的文章主要介绍了avalonia、WPF使用ScottPlot动态显示ECG心电图。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

avalonia、WPF使用ScottPlot动态显示ECG心电图

avalonia、WPF使用ScottPlot动态显示ECG心电图

实现效果,动态效果懒得录视频了

avalonia、WPF使用ScottPlot动态显示ECG心电图,Avalonia,WPF,问题心得,wpf,c#,avalonia,Ecg,心电图

安装

1.安装ScottPlot.Avalonia NuGet包

注意:
如果开发环境是macos、linux,需要按照官网步骤配置环境
此处是官网配置链接

代码部分

view部分 注意安装包之后引入
xmlns:ScottPlot="clr-namespace:ScottPlot.Avalonia;assembly=ScottPlot.Avalonia"文章来源地址https://www.toymoban.com/news/detail-682425.html

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        mc:Ignorable="d" d:DesignWidth="1920" d:DesignHeight="600"
        xmlns:vm="using:AvaloniaMedical.ViewModels"
        x:Class="AvaloniaMedical.Views.xx"
		 xmlns:ScottPlot="clr-namespace:ScottPlot.Avalonia;assembly=ScottPlot.Avalonia"
		x:DataType="vm:xx"
        xmlns:views="clr-namespace:AvaloniaMedical.Views"
		xmlns:i="clr-namespace:Avalonia.Xaml.Interactivity;assembly=Avalonia.Xaml.Interactivity"
        xmlns:controls1="clr-namespace:Material.Styles.Controls;assembly=Material.Styles"
		Background="#31363A"
        >
        此处只显示三导心电
	
		<ScottPlot:AvaPlot Height="200"  Name="AvaPlotName1" Grid.Row="1" Grid.Column="0" >

		</ScottPlot:AvaPlot>

		<ScottPlot:AvaPlot Height="200"  Name="AvaPlotName2" Grid.Row="2" Grid.Column="0" >

		</ScottPlot:AvaPlot>
		<ScottPlot:AvaPlot Height="200" Name="AvaPlotName3" Grid.Row="3" Grid.Column="0" >

		</ScottPlot:AvaPlot>
</Window>
using System;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Diagnostics;
using System.Drawing;
using System.Threading;
using Avalonia;
using Avalonia.Controls;
using Avalonia.Data;
using Avalonia.Markup.Xaml;
using Avalonia.Threading;
using AvaloniaMedical.ViewModels;
using Npoi.Mapper;
using ScottPlot;
using ScottPlot.Avalonia;
using ScottPlot.Plottable;

namespace AvaloniaMedical.Views;

public partial class xx : Window
{
    private readonly double[] liveData = new double[4000];
    private readonly double[] liveData2 = new double[4000];
    private readonly double[] liveData3 = new double[4000];



    private readonly Timer _updateDataTimer;
    private readonly DispatcherTimer _renderTimer;
    private readonly VLine vline;
    private readonly VLine vline2;
    private readonly VLine vline3;
    int nextValueIndex = -1;
    int nextValueIndex2 = -1;
    int nextValueIndex3= -1;

    AvaPlot AvaPlot1;
    AvaPlot AvaPlot2;
    AvaPlot AvaPlot3;
    public xx()
    {
        InitializeComponent();
        
#if DEBUG
        this.AttachDevTools();
#endif
        AvaPlot1 = this.Find<AvaPlot>("AvaPlotName1");
        AvaPlot2 = this.Find<AvaPlot>("AvaPlotName2");
        AvaPlot3 = this.Find<AvaPlot>("AvaPlotName3");

        AvaPlot1.Plot.AddSignal(liveData, 1, color: Color.LightGreen);
        AvaPlot1.Plot.AxisAutoX(margin: 0);
        AvaPlot1.Plot.SetAxisLimits(yMin: 2, yMax:7);

        AvaPlot2.Plot.AddSignal(liveData2, 1, color: Color.LightGreen);
        AvaPlot2.Plot.AxisAutoX(margin: 0);
        AvaPlot2.Plot.SetAxisLimits(yMin: 2, yMax: 7);

        AvaPlot3.Plot.AddSignal(liveData3, 1, color: Color.LightGreen);
        AvaPlot3.Plot.AxisAutoX(margin: 0);
        AvaPlot3.Plot.SetAxisLimits(yMin: 2, yMax: 7);


        vline = AvaPlot1.Plot.AddVerticalLine(0, Color.LightGreen, 1);
        vline2 = AvaPlot2.Plot.AddVerticalLine(0, Color.LightGreen, 1);
        vline3 = AvaPlot3.Plot.AddVerticalLine(0, Color.LightGreen, 1);
        ///Binding binding = new Binding();
        binding.Source = AvaPlot1;
        binding.Path = new ropertyPath();
        AvaPlot1.SetValue(TagProperty, 0);
        AvaPlot1.Plot.Style(Style.Gray1); 
        AvaPlot2.Plot.Style(Style.Gray1); 
        AvaPlot3.Plot.Style(Style.Gray1);


         customize styling
        //AvaPlot1.Plot.Title("Electrocardiogram Strip Chart");


        AvaPlot1.Plot.Grid(true);
        AvaPlot2.Plot.Grid(true);
        AvaPlot3.Plot.Grid(true);






        // create a traditional timer to update the data
        //_updateDataTimer = new Timer(_ => UpdateData(), null, 0, 1);

         create a separate timer to update the GUI
        _renderTimer = new DispatcherTimer
        {
            Interval = TimeSpan.FromMilliseconds(1)
        };
        _renderTimer.Tick += Render;
        _renderTimer.Start();

        Closed += (sender, args) =>
        {
            _updateDataTimer?.Dispose();
            _renderTimer?.Stop();
        };
    }
    public void UpdateChart(double dto)
    {
        UpdateData(dto);
    }

    public void UpdateChart2(double dto)
    {
        UpdateData2(dto);
    }

    public void UpdateChart3(double dto)
    {
        UpdateData3(dto);
    }
    void UpdateData(double dto)
   {
        // "scroll" the whole chart to the left
        // Array.Copy(liveData, 1, liveData, 0, liveData.Length - 1);

        // place the newest data point at the end

            double nextValue = dto;
            nextValueIndex = (nextValueIndex < liveData.Length - 1) ? nextValueIndex + 1 : 0;
            liveData[nextValueIndex] = nextValue;
            vline.IsVisible = true;
            vline.X = nextValueIndex;
       
    }

    void UpdateData2(double dto)
    {
        // "scroll" the whole chart to the left
        // Array.Copy(liveData, 1, liveData, 0, liveData.Length - 1);

        // place the newest data point at the end

        double nextValue = dto;
        nextValueIndex2 = (nextValueIndex2 < liveData2.Length - 1) ? nextValueIndex2 + 1 : 0;
        liveData2[nextValueIndex2] = nextValue;
        vline2.IsVisible = true;
        vline2.X = nextValueIndex2;

    }

    void UpdateData3(double dto)
    {
        // "scroll" the whole chart to the left
        // Array.Copy(liveData, 1, liveData, 0, liveData.Length - 1);

        // place the newest data point at the end

        double nextValue = dto;
        nextValueIndex3 = (nextValueIndex3 < liveData3.Length - 1) ? nextValueIndex3 + 1 : 0;
        liveData3[nextValueIndex3] = nextValue;
        vline3.IsVisible = true;
        vline3.X = nextValueIndex3;

    }


    void Render(object sender, EventArgs e)
    {
        AvaPlot1.Refresh();
        AvaPlot2.Refresh();
        AvaPlot3.Refresh();
    }

    private void InitializeComponent()
    {
        AvaloniaXamlLoader.Load(this);
    }

    protected override void OnClosing(CancelEventArgs e)
    {
        this.Hide();
        base.OnClosing(e);
    }

    

}

UpdateData方法就是用来更新心电图表的方法, 根据消息队列数据去更新视图中的ScottPlot 图表

到了这里,关于avalonia、WPF使用ScottPlot动态显示ECG心电图的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 加载并绘制时间域内的心电图信号,并实施Q因子为1的陷波滤波器以去除50 Hz频率研究(Matlab代码实现)

     💥💥💞💞 欢迎来到本博客 ❤️❤️💥💥 🏆博主优势: 🌞🌞🌞 博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️ 座右铭: 行百里者,半于九十。 📋📋📋 本文目录如下: 🎁🎁🎁 目录 💥1 概述 📚2 运行结果 🎉3 参考文献 🌈4 Matlab代码实现 陷波滤

    2024年02月13日
    浏览(26)
  • 基于FPGA的ECG心电信号峰值检测和心率计算,包括testbench测试文件和ECG数据转换为coe文件程序

    目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 vivado2019.2 matlab2022a         心电图(ECG)是一种广泛应用于医疗诊断的技术,用于监测心脏的电活动。随着医疗技术的发展,基于FPGA(现场可编程门阵列)的ECG信号处理系统

    2024年02月10日
    浏览(32)
  • 在WPF中使用Scottplot 实现波形展示

    前言 上位机开发过程中,信号数据是最常遇到的,在采集到信号数据后,如果能更好的展示成了难题。刚好最近接手了一个脑电信号数据的采集的项目,需要实时采集脑电信号并以波形展示出来。经过一番调研,网上有不少开源的图形控件用于波形的展示,比如oxyplot,scot

    2023年04月13日
    浏览(108)
  • C# 使用 ScottPlot.WinForms 实现示波器的波形显示

    灵活使用C# 的部分图表组件,可以快速搭建一个【示波器】波形显示的界面 这里使用: ScottPlot.WinForms ,通过官方描述是开源的 下载地址:https://github.com/ScottPlot/ScottPlot.git visual studio 可以使用: NuGet 安装管理 ScottPlot.WinForms ScottPlot 支持:WPF 与 WinForms等多种实现方法 官方介绍

    2023年04月08日
    浏览(92)
  • 使用ego1的xadc采集心电模块的输出并用vga显示

    最近刚做完学校的实验,记录一下自己的实验过程,也可以给需要的朋友一个参考,不对之处欢迎指正。 XADC:fpga内部IP核 XADC可以将0-1V的模拟电压信号转化为12位的数字电压信号,存储在DO[15:0]口的高12位上,转化速率为1MSPS的ADC(模数转换器)。 XADC中文全称应该是“Xilinx模

    2024年02月06日
    浏览(29)
  • C# WPF ListBox 动态显示图片

            最近在和其他软件联合做一个本地图片选择传输功能,为此希望图片能够有序的呈现在客户端,简单的实现了一下功能,通过Mvvm模式进行呈现,过程简单通俗,话不多说直接上图。  前台代码 你只需要粘贴到你的前台xml中就可以,位置记得调整下Margin,我这是按照我

    2024年02月12日
    浏览(33)
  • Avalonia UI跨平台WPF

    Avalonia是一个强大的框架,使开发人员能够使用.NET创建跨平台应用程序。 它使用自己的渲染引擎绘制UI控件,确保在Windows、macOS、Linux、Android、iOS和WebAssembly等不同平台上具有一致的外观和行为。 官网链接: 官网链接 文档链接: 中文文档

    2024年04月27日
    浏览(31)
  • WPF向Avalonia迁移(四、其他事项)

    开发必备 1. Avalonia项目源代码!!!!!!!!!!没有源代码,你连控件的背景色怎么改都找不着!! 2.下载你所使用的版本!!!!!!!!!0.10.XX与0.11.XX 差很多!!!!要看好自己用的版本号 3.如果你使用了其他的UI库,比如说Semi.Avalonia,下载对应版本的源代码,改

    2024年02月07日
    浏览(37)
  • 适用于 Linux 的 WPF:Avalonia

    许多年前,在 WPF 成为“Windows Presentation Foundation”并将 XAML 作为 .NET、Windows 等的 UI 标记语言引入之前,有一个代号为“Avalon”的项目。Avalon 是 WPF 的代号。XAML 现在无处不在,XAML 标准是一个词汇规范。 Avalonia 是一个开源项目,它显然从 Avalon 中汲取灵感,并且对 XAML 有着毫

    2024年02月05日
    浏览(32)
  • WPF向Avalonia迁移(三、项目结构)

    前提: Avalonia版本11.0.0 1.配置文件 1.1 添加配置文件 1.2 读取配置文件  添加System.Configuration.ConfigurationManager 2.样式 2.1 添加样式文件至Assets文件夹下  2.2 引用样式        打开App.axaml文件,添加StyleInclude Source=\\\"你要用的样式文件.axaml\\\"/,添加后该样式在整个应用生效。 3.资源

    2024年02月07日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包