c#中嵌入echarts_如何利用 C# + Echarts 绘制 Bar Simple
背景
Echarts 是百度推出的一个使用 JavaScript 实现的开源可视化库。 该库提供了常规的折线图、柱状图、散点图、饼图、K线图,用于统计的盒形图,用于地理数据可视化的地图、热力图、线图,用于关系数据可视化的关系图、treemap、旭日图,多维数据可视化的平行坐标,还有用于 BI 的漏斗图,仪表盘,并且支持图与图之间的混搭。
柱状图
散点图
关系图
三维图
既然 Echarts 提供了丰富的图形,所以咱们有必要把它封装起来,以便让其支持 Windows 窗体应用程序。
技术分析
整体的技术方案就是做一个自定义控件,该控件中包含 WebBrowser 浏览器控件,通过该浏览器控件显示指定位置的网页。就像咱们直接通过 Web 浏览器网页一样。具体的步骤如下:
首先,创建一个在 Windows 窗体应用程序中使用的控件项目 LSGO.Core.ECharts。
其次,在该控件项目的设计器中,拖入一个 WebBrowser 控件,并设置其 Dock 属性为 Fill,即让 WebBrowser 充满整个容器。
接着,写一个 InitialECharts 方法,加载指定目录的网页.\assets\echarts.html,让该网页在 WebBrowser 中打开。
当该网页加载完成后,触发 WebBrowser 的 WebBrowserDocumentCompletedEventHandler 事件,在该事件注册的方法中调用该网页中用 JS 写的 showChart 方法,则在该网页中显示图形。
当窗体控件的尺寸发生变化后,触发 WebBrowser 的 SizeChanged 事件,在该事件注册的方法中调用该网页中用 JS 写的 setPosition 方法,则重新调整显示图形的布局,以满足新的尺寸。
WebBrowser 类的常用属性、事件与方法。
属性
///
/// 获取或设置一个对象,该对象可由显示在 WebBrowser 控件中的网页所包含的脚本代码访问。
///
///
/// 可用于脚本代码的对象。
///
public object ObjectForScripting { get; set; }
///
/// 表示当前页的 HtmlDocument,如果未加载任何页,则为 null。
///
public HtmlDocument Document { get; }
事件
///
/// 在 WebBrowser 控件完成加载文档时发生。
///
public event WebBrowserDocumentCompletedEventHandler DocumentCompleted;
///
/// 在 Control.Size 属性值更改时发生。
///
public event EventHandler SizeChanged;
方法
///
/// 将指定的统一资源定位器 (URL) 处的文档加载到 WebBrowser 控件中,替换上一个文档。
///
/// 要加载的文档的 URL。
public void Navigate(string urlString);
HtmlDocument 类的常用方法。
///
/// 活动脚本调用所返回的对象。
///
/// 要调用的脚本方法的名称。
/// 要传递给脚本方法的参数。
public object InvokeScript(string scriptName, object[] args);
代码实现
Step1:创建一个用于显示图形的网页。
初始显示的网页 echarts.html
var myChart = echarts.init(document.getElementById('main'));
// 指定图表的配置项和数据
var option = {
title: {
text: 'ECharts 入门示例'
},
tooltip: {},
legend: {
data:['销量']
},
xAxis: {
data: ["衬衫","羊毛衫","雪纺衫","裤子","高跟鞋","袜子"]
},
yAxis: {},
series: [{
name: '销量',
type: 'bar',
data: [5, 20, 36, 10, 10, 20]
}]
};
myChart.setOption(option);
显示图形时调用的 JS 代码 showChart
function showChart(option) {
myChart.clear();
var op = JSON.parse(option);
myChart.setOption(op);
}
当控件的尺寸发生变化时调用的 JS 代码 setPosition
function setPosition(height) {
var divMain = document.getElementById("main");
divMain.style.height = height + "px";
window.onresize = myChart.resize();
}
Step2:创建自定义控件 Echarts。
初始化 Echarts 控件的方法
public object Option { get; set; }
public void InitialECharts(Option option)
{
if (option == null)
throw new ArgumentNullException();
Option = JsonConvert.SerializeObject(option);
string strHtml = Application.StartupPath + @"\assets\echarts.html";
if (File.Exists(strHtml))
{
webBrowserMain.Navigate(strHtml);
webBrowserMain.ObjectForScripting = this;
}
}
当 echarts.html 在 WebBrowser 内加载完成之后执行的方法。
private void webBrowserMain_DocumentCompleted(object sender,
WebBrowserDocumentCompletedEventArgs e)
{
object[] objArray = new object[] {Option};
HtmlDocument htmlDocument = webBrowserMain.Document;
if (htmlDocument != null)
{
htmlDocument.InvokeScript("showChart", objArray);
objArray[0] = Height;
htmlDocument.InvokeScript("setPosition", objArray);
_isDocumentLoaded = true;
}
}
当控件 Echarts 尺寸发生变化之后执行的方法。
private void webBrowserMain_SizeChanged(object sender, EventArgs e)
{
if (_isDocumentLoaded)
{
object[] objArray = new object[] {Height};
HtmlDocument htmlDocument = webBrowserMain.Document;
if (htmlDocument != null)
{
htmlDocument.InvokeScript("setPosition", objArray);
}
}
}
Step3:对百度 Echarts 组件的封装。
对 ECharts 中的 xAxis 结构的封装。
public class XAxis
{
///
/// 坐标轴类型
///
public string type { get; set; } = "category";
///
/// 类目数据
///
public List data { get; set; }
}
对 ECharts 中 yAxis 结构的封装。
public class YAxis
{
///
/// 坐标轴类型
///
public string type { get; set; } = "value";
}
对 ECharts 中 series 集合元素的封装。
public class SeriesItem
{
///
/// 每个系列通过 type 决定自己的图表类型
///
public string type { get; set; }
///
/// 系列中的数据内容数组
///
public List data { get; set; }
}
对 ECharts 中 option 结构的封装。
public class Option
{
///
/// x轴
///
public XAxis xAxis { get; set; }
///
/// y轴
///
public YAxis yAxis { get; set; }
///
/// 数据
///
public List series { get; set; }
}
总结
百度示例的代码:
option = {
xAxis: {
type: 'category',
data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
},
yAxis: {
type: 'value'
},
series: [{
data: [120, 200, 150, 80, 70, 110, 130],
type: 'bar'
}]
};
封装成控件之后的调用代码:
private List GetXAxisData()
{
List reslt = new List
{
"Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun"
};
return reslt;
}
private List GetSeriesData()
{
List result = new List();
SeriesItem item = new SeriesItem
{
type = "bar",
data = new List
{
120, 200, 150, 80, 70, 110, 130
}
};
result.Add(item);
return result;
}
private void FormMain_Load(object sender, EventArgs e)
{
Option option = new Option
{
title = new Title
{
text= "ECharts 入门示例",
},
xAxis = new XAxis
{
type = "category",
data = GetXAxisData()
},
yAxis = new YAxis
{
type = "value"
},
series = GetSeriesData()
};
echartsMain.InitialECharts(option);
}
图形显示如下:
图形显示
当然,咱们封装百度的 Echarts 并非心血来潮,学习任何技术的目的都要应用于实际,去体现技术的价值。
应用01
应用02
好了,今天就到这里吧!See You!
相关图文:
c#中嵌入echarts_如何利用 C# + Echarts 绘制 Bar Simple相关推荐
- 技术图文:如何利用C# + Echarts 绘制 Bar Simple?
背景 Echarts 是百度推出的一个使用 JavaScript 实现的开源可视化库. 该库提供了常规的折线图.柱状图.散点图.饼图.K线图,用于统计的盒形图,用于地理数据可视化的地图.热力图.线图, ...
- 技术图文:如何利用C# + Echarts 绘制「堆叠条形图」?
背景 前几天,我们介绍了 如何利用C# + Echarts 绘制 Bar Simple?,原以为把 Echarts 封装到这种程度就可以完成当前任务了. 可是,把软件原型提交给对方时,发现对方更希望& ...
- c#中嵌入echarts_利用c#+jquery+echarts生成统计报表(附源代码)
背景: 因为最近项目要生成报表,经过几轮挑选,最终选择了百度的echarts作为报表基础类库.百度echarts简介请参考虽然echarts功能强大,界面优美, 但是使用起来非常繁琐.本文在参考写的& ...
- css 渐变 椭圆,CSS图形基础:利用径向渐变绘制图形
1.径向渐变 radial-gradient() 函数用于创建一个径向渐变的"图像",其一般调用格式为: background-image: radial-gradient(sha ...
- 【小沐学C#】WPF中嵌入web网页控件(WebBrowser、WebView2、CefSharp)
文章目录 1.简介 1.1 WPF简介 1.2 WPF 体系结构 1.3 WPF入门开发 2.WebBrowser 2.1 WebBrowser特点 2.2 WebBrowser常用的属性.方法和事件 ...
- 在windows程序中嵌入Lua脚本引擎--编写自己的Lua库
在<在windows程序中嵌入Lua脚本引擎--建立一个简易的"云命令"执行的系统>一文中,我提到了使用Lua的ffi库,可以让我们像写C代码一样写lua程序.这是个非 ...
- 在windows程序中嵌入Lua脚本引擎--使用VS IDE编译Luajit脚本引擎
前些天听到一个需求:某业务方需要我们帮忙清理用户电脑上的一些废弃文件.同事完成这个逻辑的方案便是在我们程序中加入了一个很"独立"的业务逻辑:检索和删除某个程序产生的废弃文件.试想, ...
- 转载:QTableView中嵌入可视化组件
出处:http://qimo601.iteye.com/blog/1538364 QTableView中嵌入可视化组件方法有四种: 第一种不能之前显示,必须双击/选中后才能显示,不适用. 第二种比较简 ...
- silverlight 打开html_在Silverlight中嵌入HTML或aspx页面-阿里云开发者社区
有好几次遇到有的同志们问,怎么在Silverlight中嵌入其他页面如:html,aspx或jsp页面,这里写一个简单的使用方法,供大家参考: 下载第三方控件的dll,这里提供一个下载地址: 下面是这 ...
- html5中加入音频,使用HTML5在网页中嵌入音频和视频播放的基本方法
HTML5 特性,包括原生音频和视频支持而无需 Flash. HTML5 和 标签让我们给站点添加媒体变得简单.我们只需要设置 src 属性来识别媒体资源,包含 controls 属性让用户可以播放和 ...
最新文章
- web3j官网的完整中文翻译(java开发区块链以太坊应用的开源类库)
- 数值运算python-Python : 数值以及数值运算
- centos 7 安装wps
- Nginx全局块的user指令
- 【今晚9点】:对话黄琦——从FB到快手,短视频领域里的“实习生”
- 左神算法:二叉树的按层打印与ZigZag打印(Java版)
- 2016年印度公有云服务市场将达13亿美元
- Linux 临时表空间满了,Temporary表空间100%解决方案
- 软件测试测试用例编写_不要先编写所有软件测试-只需编写一个
- 时间即财富:创业者浪费精力的八个错误
- 操作系统页面置换算法(opt,lru,fifo,clock)实现
- C#.NET验证码智能识别学习笔记---01C#.NET验证码识别介绍
- android 进程池 参数,Android 线程池全解析
- linux下简单好用的端口映射转发工具rinetd
- 木材材积表快速计算器_木材材积表快速计算器
- vb6引用vbRichClient5 下载对象 cDownloads 简单示例
- CSS的三种引入方式(行内样式、内部样式、外部样式)
- 认知系列2:认知半径
- python自动登录qq邮箱_python和selenium实现163邮箱自动登陆
- 网游之古剑太初最新章节