目录

前言

使用.NET 6编写Winforms时,需要绘制图表发现.NET Core默认支持Chart控件。经过查询使用CefSharp控件Echarts图表可以实现想要的显示效果

引用介绍

CefSharp

介绍

Chromium Embedded Framework (CEF)是个基于Google Chromium项目开源Web browser控件支持Windows, Linux, Mac平台。除了提供C/C++接口外,也有其他语言移植版。因为基于Chromium,所以CEF支持Webkit & Chrome中实现的HTML5的特性,并且在性能上面,也比较接近Chrome。CEF还提供的如下特性自定义插件自定义协议自定义JavaScript对象扩展可控制的resource loading, navigation, context menus等等。

CefSharp中的Sharp说明它是用于C#的,它可以在WPF或Winforms使用,增加一个类似WebBrowser但是基于谷歌浏览器内核容器显示HTML内容。Winforms自带的WebBrowser控件基于IE,实际使用中常常遇到页面布局问题(并且发现.NET WinForms中也没有了,可能也仅限于 .NET Framework WinForms)。其他类似的还有CefGlue

引用

.NET WinForms使用这个包
VS自带的Nugget包里直接安装使用。如果项目基于.NET Framework应该使用图中第一个包。

ECharts

介绍

ECharts是一款基于JavaScript数据可视化图表库,提供直观,生动,可交互,可个性化定制数据可视化图表。ECharts最初由百度团队开源,并于2018年初捐赠给Apache基金会,成为ASF孵化级项目

ECharts 提供了常规的折线图柱状图散点图、饼图、K线图,用于统计的盒形图用于地理数据可视化地图、热力图、线图,用于系数据可视化的关系图、Treemap旭日图,多维数据可视化的平行坐标,还有用于 BI 的漏斗图,仪表盘,并且支持图与图之间的混搭。

总之,就是一款通过JS实现图表功能的包。

引用

Apache ECharts官网或一些JavaScript公共网站直接获取.js文件
(nugget上的ECharts包版本太老,踩了很多坑)

这个js文件html文件需要引用的,而不是在vs项目添加依赖性。
echarts.js包位置
这里直接html文件引用包放在上下级目录,同时设置了始终复制到目录
html中引用js包

代码部分

C#代码

            //浏览器组件初始化一次,所以放在主界面
            //参数设置
            CefSettings settings = new CefSettings();
            //  settings.Locale = "zh-CN";
            // settings.CefCommandLineArgs.Add("disable-gpu", "1");//去掉gpu,否则chrome显示问题
            Cef.Initialize(settings);
		public ChromiumWebBrowser chromeBrowser;

初始化选择需要加载路径这里我们直接加载Html文件显示Echarts,路径即为html的路径),并加载WinForms中的容器中

        public void InitChart()
        {
        	string currentPath = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location);
            if (currentPath == null)
            {
            	//这里引用了SerialLog
                //logger.Error($"Failed to {nameof(InitChart)},Failed to GetDirectoryName");
                return;
            }
            string filepath = currentPath + @"objhtmlEChart.html";
            if (File.Exists(filepath))
            {  //创建实例
                chromeBrowser = new ChromiumWebBrowser(filepath);
                // 将浏览器放入器中
                chromeBrowser.Dock = DockStyle.Fill;
                chromeBrowser.Parent = panel_chart;
                chromeBrowser.MenuHandler = new MenuHandler();
            }
        }
internal class MenuHandler : IContextMenuHandler
        {
            public bool OnBeforeContextMenu(IWebBrowser browser, IContextMenuParams parameters)
            {
                return false;
            }

            public void OnBeforeContextMenu(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model)
            {
                return;
            }

            public bool OnContextMenuCommand(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters, CefMenuCommand commandId, CefEventFlags eventFlags)
            {
                return false;
            }

            public void OnContextMenuDismissed(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame)
            {
                return;
            }

            public bool RunContextMenu(IWebBrowser chromiumWebBrowser, IBrowser browser, IFrame frame, IContextMenuParams parameters, IMenuModel model, IRunContextMenuCallback callback)
            {
                return false;
            }
        }
        public void addChartData(float val)
        {
            //执行JS
            string js = $"addData({val:f2});";
            chromeBrowser.ExecuteScriptAsync(js);
        }

Html部分

Apache ECharts官网有许多教程示例这里我给出我需要做的一个实例
我实现的图表记录值在图表中,同时标记最大值最小值平均值。图表中的X轴位记录时间,Y轴位实际值。

建立一个divchart就在这个div

    <!-- 为 ECharts 准备一个定义宽高的 DOM -->
    <div id="main" style="width:100%;height:430px;"></div>

构建一个ECharts实例,稍微解释一些代码部分

  // 基于准备好的dom初始化echarts实例
        var myChart = echarts.init(document.getElementById('main'));
        myChart.showLoading();
        var x_dates = [];
        var y_datas = [];       
        // 指定图表的配置项和数据
        option = {
            toolbox: {
                show: true,
                feature: {
                    dataZoom: {
                        yAxisIndex: 'none'
                    },
                    dataView: { readOnly: false },
                    restore: {},
                }
            },
            xAxis: {
                type: 'category',
                data: x_dates,

            },
            yAxis: {
                type: 'value'
            },
            series: [
                {
                    smooth: true,
                    name: 'Measurement',
                    data: y_datas,
                    type: 'line',
                    markLine: {
                        data: [
                            {
                                type: 'average',  // type 类型可以最大值max最小值min平均值
                                name: 'average',
                            },
                        ],

                    },
                    markPoint: {
                            data: [{
                            name: "max",
                            type: "max",
                            symbol: "pin",
                            symbolSize: 50,
                            animation: true,
                            label: {
                                show: true,
                                color: '#000'
                            },
                            itemStyle: { color: '#f00' }
                        },

                        {
                            name: "min",
                            type: "min",
                            symbol: "pin",
                            symbolSize: 50,
                            animation: true,
                            label: {
                                show: true,
                                color: '#000'
                            },
                            itemStyle: { color: '#faf' }
                        }]
                    },

                }
            ],
            tooltip: {
                //trigger: 'axis',
                //triggerOn: 'mousemove',
                //transitionDuration: 0.4,
                //formatter: "时间:{b}<br/>数据值:{c}"
                trigger: 'axis',
                axisPointer: {
                    type: 'cross'
                }
            },
        };     
        myChart.hideLoading();
        myChart.setOption(option);

写一个JS方法,用于更新图表

 // 使用刚指定配置项和数据显示图表。

        function addData(val) {

            var date = new Date();

            var hour = date.getHours().toString(); //时
            hour = hour.length < 2 ? '0' + hour : hour;
            var minutes = date.getMinutes().toString(); //分
            minutes = minutes.length < 2 ? '0' + minutes : minutes;
            var seconds = date.getSeconds().toString(); //秒
            seconds = seconds.length < 2 ? '0' + seconds : seconds;

            now = [hour, minutes, seconds].join(':');
            x_dates.push(now);


            y_datas.push(val);
            //alert(x_dates.length + ":" + y_datas.length);
            myChart = echarts.init(document.getElementById('main'));
            myChart.setOption({
                xAxis: {
                    data: x_dates,
                },
                series: [
                    {
                        data: y_datas,
                    }
                ],
            });
        }   

Html完整代码如下

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <title>ECharts</title>
    <!-- 引入刚刚下载的 ECharts 文件 -->
    <script src="../echarts.js"></script>
</head>
<body>
    <!-- 为 ECharts 准备一个定义宽高的 DOM -->
    <div id="main" style="width:100%;height:430px;"></div>
    <script type="text/javascript">
        // 基于准备好的dom初始化echarts实例
        var myChart = echarts.init(document.getElementById('main'));
        myChart.showLoading();
        var x_dates = [];
        var y_datas = [];       
        // 指定图表的配置项和数据
        option = {
            toolbox: {
                show: true,
                feature: {
                    dataZoom: {
                        yAxisIndex: 'none'
                    },
                    dataView: { readOnly: false },
                    restore: {},
                }
            },
            xAxis: {
                type: 'category',
                data: x_dates,

            },
            yAxis: {
                type: 'value'
            },
            series: [
                {
                    smooth: true,
                    name: '测量值',
                    data: y_datas,
                    type: 'line',
                    markLine: {
                        data: [
                            {
                                type: 'average',  // type 类型, 可以是最大值max最小值min, 平均值
                                name: '平均值',
                            },
                        ],

                    },
                    markPoint: {
                        data: [{
                            type: "max",
                            symbol: "pin",
                            symbolSize: 50,
                            animation: true,
                            label: {
                                show: true,
                                color: '#000'
                            },
                            itemStyle: { color: '#f00' }
                        },

                        {
                            name: "最大值",
                            type: "min",
                            symbol: "pin",
                            symbolSize: 50,
                            animation: true,
                            label: {
                                show: true,
                                color: '#000'
                            },
                            itemStyle: { color: '#faf' }
                        }]
                    },

                }
            ],
            tooltip: {
                //trigger: 'axis',
                //triggerOn: 'mousemove',
                //transitionDuration: 0.4,
                //formatter: "时间:{b}<br/>数据值:{c}"
                trigger: 'axis',
                axisPointer: {
                    type: 'cross'
                }
            },
        };     
        myChart.hideLoading();
        myChart.setOption(option);


        // 使用刚指定的配置项和数据显示图表。

        function addData(val) {

            var date = new Date();

            var hour = date.getHours().toString(); //时
            hour = hour.length < 2 ? '0' + hour : hour;
            var minutes = date.getMinutes().toString(); //分
            minutes = minutes.length < 2 ? '0' + minutes : minutes;
            var seconds = date.getSeconds().toString(); //秒
            seconds = seconds.length < 2 ? '0' + seconds : seconds;

            now = [hour, minutes, seconds].join(':');
            x_dates.push(now);


            y_datas.push(val);
            //alert(x_dates.length + ":" + y_datas.length);
            myChart = echarts.init(document.getElementById('main'));
            myChart.setOption({
                xAxis: {
                    data: x_dates,
                },
                series: [
                    {
                        data: y_datas,
                    }
                ],
            });
        }   
    </script>
</body>
</html>

最终效果

最终运行效果如下:
图表演示
通过ECharts自带的工具,可以点击Zoom然后选中区域行数据缩放,也可以点击Zoom Reset变回缩放前状态
缩放数据
可以点击Data View查看数据值
Data View
还可以点击Restore还原到图表无脚本运行初始加载状态。
Restore

原文地址:https://blog.csdn.net/weixin_44453199/article/details/131191375

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任

如若转载,请注明出处:http://www.7code.cn/show_43874.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注