Avalonia学习(十五)-OxyPlot

今天开始继续Avalonia练习。展示一些样例,尤其是第三方库的使用。

本节:OxyPlot

1.引入OxyPlot.Avalonia

2.项目引入

在Main方法里增加OxyPlotModule.EnsureLoaded()方法调用。

public static void Main(string[] args)
{
    OxyPlotModule.EnsureLoaded();
    AppBuilder.Configure<App>()
        .UsePlatformDetect()
        .StartWithClassicDesktopLifetime(args);
}

在App.xaml文件中增加样式引用。

<Application xmlns="https://github.com/avaloniaui"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             x:Class="OxyPlotAvalonia.App"
             xmlns:local="using:OxyPlotAvalonia"
             RequestedThemeVariant="Default">
             <!-- "Default" ThemeVariant follows system theme variant. "Dark" or "Light" are other available options. -->

    <Application.DataTemplates>
        <local:ViewLocator/>
    </Application.DataTemplates>
  
    <Application.Styles>
        <FluentTheme />
      <StyleInclude Source="avares://OxyPlot.Avalonia/Themes/Default.axaml"/>
     
    </Application.Styles>
</Application>

前台代码

<Window xmlns="https://github.com/avaloniaui"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:vm="using:OxyPlotAvalonia.ViewModels"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:oxy="clr-namespace:OxyPlot.Avalonia;assembly=OxyPlot.Avalonia" 
        mc:Ignorable="d" d:DesignWidth="800" d:DesignHeight="450"
        x:Class="OxyPlotAvalonia.Views.MainWindow"
       
        x:DataType="vm:MainWindowViewModel"
        Icon="/Assets/avalonia-logo.ico"
        Title="OxyPlotAvalonia">

    <Design.DataContext>
        <!-- This only sets the DataContext for the previewer in an IDE,
             to set the actual DataContext for runtime, set the DataContext property in code (look at App.axaml.cs) -->
        <vm:MainWindowViewModel/>
    </Design.DataContext>
      <oxy:PlotView Model="{Binding Model}" />
    <!--<TextBlock Text="{Binding Greeting}" HorizontalAlignment="Center" VerticalAlignment="Center"/>-->

</Window>

后台代码

using OxyPlot;
using OxyPlot.Series;
using System.Collections.Generic;

namespace OxyPlotAvalonia.ViewModels
{
    public class MainWindowViewModel : ViewModelBase
    {
#pragma warning disable CA1822 // Mark members as static
        public string Greeting => "Welcome to Avalonia!";
#pragma warning restore CA1822 // Mark members as static
        public PlotModel Model { get; private set; }
        public MainWindowViewModel()
        {

         //   OxyPlot.Avalonia.PlotView plotView=new OxyPlot.Avalonia.PlotView();
         //   plotView.Model = Model;
            // Create the plot model
            var tmp = new PlotModel { Title = "Simple example", Subtitle = "using OxyPlot" };

           // OxyPlot.Series.Series series=new  
            // Create two line series (markers are hidden by default)
          
            var series1 = new LineSeries { Title = "Series 1", MarkerType = MarkerType.Circle };
            List<DataPoint> points = new List<OxyPlot.DataPoint>();
            points.Add(new DataPoint(0, 0));
            points.Add(new DataPoint(10, 18));
            points.Add(new DataPoint(20, 12));
            points.Add(new DataPoint(30, 8));
            points.Add(new DataPoint(40, 15));
            series1.ItemsSource = points;

            var series2 = new LineSeries { Title = "Series 2", MarkerType = MarkerType.Square };
            List<DataPoint> points1 = new List<OxyPlot.DataPoint>();
            points.Add(new DataPoint(0, 0));
            points.Add(new DataPoint(10, 18));
            points.Add(new DataPoint(20, 12));
            points.Add(new DataPoint(30, 8));
            points.Add(new DataPoint(40, 15));
            points1.Add(new DataPoint(0, 4));
            points1.Add(new DataPoint(10, 12));
            points1.Add(new DataPoint(20, 16));
            points1.Add(new DataPoint(30, 25));
            points1.Add(new DataPoint(40, 5));
         
            // Add the series to the plot model
            // tmp.Series.Add(series1);
            // tmp.Series.Add(series2);
            tmp.Series.Add(series1);
            this.Model = tmp;
        }
    }
}

运行效果

经过测试,最新版Avalonia11.0.6会报错,Oxyplot.Avalonia没有对应更新,你要直接用最新Avalonia,可以引入Oxyplot.AvaloniaCore包测试。

另外推荐的控件库ScottPlot,livecharts。

具体比较大家搜索,livecharts比较美观,但是有收费版,免费版不能加载大数据量。

ScottPlot比较加载大数据量,比较快。不贴例子了。

livecharts运行效果:

ScottPlot运行效果:

<think>好的,我现在需要帮用户解决关于C#上位机开发第三方库推荐的问题。首先,用户提到了他们正在寻找适用于C#的第三方库,并且引用了几个相关的资料,特别是引用[5]提到了S7.Net,这可能是一个关键点。 首先,我得回忆一下常用的C#上位机开发库。上位机通常涉及与硬件通信、数据处理、界面设计等方面。常见的库可能包括通信协议库,比如Modbus、OPC UA,或者PLC相关的库,比如Siemens的S7协议库。用户提到的S7.Net应该就是用于西门子S7系列PLC通信的库,这在工业自动化中很常见。 接下来,我需要确认用户的需求场景。上位机开发可能涉及数据采集、设备控制、监控系统等,所以需要推荐不同方面的库。例如,Modbus通讯可以使用NModbus,OPC UA可能需要OPC Foundation的官方库,而界面设计可能需要第三方控件库如DevExpress或HslCommunication,后者可能更全面,包含多种协议支持。 然后,要检查用户提供的引用内容。引用[4]提到与下位机通信和可靠控制,引用[5]具体提到了S7.Net,这说明用户可能在与PLC设备交互。因此,推荐S7.Net是正确的。同时,用户可能需要其他协议的支持,比如Modbus和OPC UA,所以需要列出这些库。 另外,数据处理和图表显示也是上位机的重要部分。LiveCharts和OxyPlot都是常用的图表库,能够帮助用户可视化数据。而界面美化方面,第三方控件库如DevExpress和HslCommunication可以提升用户体验,但需要区分HslCommunication是否包含协议支持,根据引用[5],HslCommunication可能也包含通信组件。 还需要考虑库的维护状态和社区支持。例如,S7.Net在GitHub上有一定的星标,说明较为活跃。NModbus也是一个成熟的项目,适合Modbus通信。OPC UA的官方库虽然复杂,但标准支持好,适合需要高安全性的场景。 最后,用户可能需要学习资源或示例代码,所以建议官方文档和社区论坛,比如Stack Overflow和GitHub。同时,结合引用[3]提到的学习建议,推荐这些资源能帮助用户更好地入门和解决问题。 总结下来,应该分门别类推荐:通信协议库、界面控件、数据处理与图表,以及辅助工具,每个类别给出几个选项,并简要说明其应用场景和特点,同时结合用户提供的引用,特别是S7.Net的例子,强调其在实际项目中的使用。</think>在C#上位机开发中,选择合适的第三方库能显著提升开发效率。以下是分类推荐及具体应用场景说明: ### 一、通信协议库 1. **S7.Net** - 专用于西门子S7系列PLC通信(支持S7-200/300/400/1200/1500) - 提供读写PLC寄存器、数据块操作功能 - 示例代码: ```csharp var plc = new Plc(CpuType.S71200, "192.168.0.1", 0, 1); plc.Open(); var status = plc.Read(DataType.DataBlock, 1, 0, VarType.Int, 1); ``` [^5] 2. **NModbus** - 实现Modbus RTU/TCP协议 - 支持主从机模式,适合传感器数据采集 - 特性: - 自动处理CRC校验 - 支持同步/异步通信 3. **OPC UA库** - 官方库`OPCFoundation.NetStandard.Opc.Ua` - 安全通信支持(X.509证书、数据加密) - 跨平台兼容工业4.0标准 ### 二、工业通讯集成库 **HslCommunication** - 国产开源库(GitHub 3.2k+星) - 多协议支持: - 西门子/三菱/欧姆龙PLC - Modbus/松下PLC/Redis数据库 - 特色功能: ```csharp // 西门子PLC读取示例 SiemensS7Net siemens = new SiemensS7Net(SiemensPLCS.S1500); siemens.IpAddress = "192.168.1.10"; OperateResult<short> result = siemens.ReadInt16("DB2.0"); ``` ### 三、界面开发组件 | 库名称 | 授权方式 | 核心优势 | 典型控件 | |--------------|----------|---------------------------|-----------------------| | DevExpress | 商业 | 50+数据可视化组件 | DxGrid, DxChart | | MaterialSkin | 开源 | Material Design风格实现 | 扁平化按钮/卡片布局 | | LiveCharts | MIT | 实时曲线刷新性能优化 | 动态波形/3D热力图 | ### 四、数据处理辅助 1. **Newtonsoft.Json** - 工业级JSON序列化库 - 支持Bson格式处理设备配置 2. **Serilog** - 结构化日志记录 - 支持写入数据库/Elasticsearch ### 五、特殊场景解决方案 1. **机器视觉** - Emgu CV(OpenCV .NET封装) - 示例应用: ```csharp using Emgu.CV; Mat image = CvInvoke.Imread("defect.jpg"); CvInvoke.CvtColor(image, image, ColorConversion.Bgr2Gray); ``` 2. **跨平台需求** - Avalonia UI框架 - 支持Linux边缘计算网关部署 ### 选型建议 1. 评估协议兼容性时,需确认设备手册支持的通信标准 2. 商业项目优先考虑长期维护的库(检查GitHub最后提交时间) 3. 复杂系统建议采用分层架构: ``` 应用层(UI) ↓ 业务逻辑层 ↓ 设备驱动层(Hsl/S7.Net) ``` ### 学习路径 1. 从简单Modbus通信入手理解报文结构 2. 掌握PLC数据地址映射规则(如西门子DB块寻址) 3. 使用Wireshark分析通信过程
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值