背景

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相关推荐

  1. 技术图文:如何利用C# + Echarts 绘制 Bar Simple?

    背景 Echarts 是百度推出的一个使用 JavaScript 实现的开源可视化库. 该库提供了常规的折线图.柱状图.散点图.饼图.K线图,用于统计的盒形图,用于地理数据可视化的地图.热力图.线图, ...

  2. 技术图文:如何利用C# + Echarts 绘制「堆叠条形图」?

    背景 前几天,我们介绍了 如何利用C# + Echarts 绘制 Bar Simple?,原以为把 Echarts 封装到这种程度就可以完成当前任务了. 可是,把软件原型提交给对方时,发现对方更希望& ...

  3. c#中嵌入echarts_利用c#+jquery+echarts生成统计报表(附源代码)

    背景: 因为最近项目要生成报表,经过几轮挑选,最终选择了百度的echarts作为报表基础类库.百度echarts简介请参考虽然echarts功能强大,界面优美, 但是使用起来非常繁琐.本文在参考写的& ...

  4. css 渐变 椭圆,CSS图形基础:利用径向渐变绘制图形

    1.径向渐变 radial-gradient() 函数用于创建一个径向渐变的"图像",其一般调用格式为: background-image: radial-gradient(sha ...

  5. 【小沐学C#】WPF中嵌入web网页控件(WebBrowser、WebView2、CefSharp)

    文章目录 1.简介 1.1 WPF简介 1.2 WPF 体系结构 1.3 WPF入门开发 2.WebBrowser 2.1 WebBrowser特点 2.2 WebBrowser常用的属性.方法和事件 ...

  6. 在windows程序中嵌入Lua脚本引擎--编写自己的Lua库

    在<在windows程序中嵌入Lua脚本引擎--建立一个简易的"云命令"执行的系统>一文中,我提到了使用Lua的ffi库,可以让我们像写C代码一样写lua程序.这是个非 ...

  7. 在windows程序中嵌入Lua脚本引擎--使用VS IDE编译Luajit脚本引擎

    前些天听到一个需求:某业务方需要我们帮忙清理用户电脑上的一些废弃文件.同事完成这个逻辑的方案便是在我们程序中加入了一个很"独立"的业务逻辑:检索和删除某个程序产生的废弃文件.试想, ...

  8. 转载:QTableView中嵌入可视化组件

    出处:http://qimo601.iteye.com/blog/1538364 QTableView中嵌入可视化组件方法有四种: 第一种不能之前显示,必须双击/选中后才能显示,不适用. 第二种比较简 ...

  9. silverlight 打开html_在Silverlight中嵌入HTML或aspx页面-阿里云开发者社区

    有好几次遇到有的同志们问,怎么在Silverlight中嵌入其他页面如:html,aspx或jsp页面,这里写一个简单的使用方法,供大家参考: 下载第三方控件的dll,这里提供一个下载地址: 下面是这 ...

  10. html5中加入音频,使用HTML5在网页中嵌入音频和视频播放的基本方法

    HTML5 特性,包括原生音频和视频支持而无需 Flash. HTML5 和 标签让我们给站点添加媒体变得简单.我们只需要设置 src 属性来识别媒体资源,包含 controls 属性让用户可以播放和 ...

最新文章

  1. web3j官网的完整中文翻译(java开发区块链以太坊应用的开源类库)
  2. 数值运算python-Python : 数值以及数值运算
  3. centos 7 安装wps
  4. Nginx全局块的user指令
  5. 【今晚9点】:对话黄琦——从FB到快手,短视频领域里的“实习生”
  6. 左神算法:二叉树的按层打印与ZigZag打印(Java版)
  7. 2016年印度公有云服务市场将达13亿美元
  8. Linux 临时表空间满了,Temporary表空间100%解决方案
  9. 软件测试测试用例编写_不要先编写所有软件测试-只需编写一个
  10. 时间即财富:创业者浪费精力的八个错误
  11. 操作系统页面置换算法(opt,lru,fifo,clock)实现
  12. C#.NET验证码智能识别学习笔记---01C#.NET验证码识别介绍
  13. android 进程池 参数,Android 线程池全解析
  14. linux下简单好用的端口映射转发工具rinetd
  15. 木材材积表快速计算器_木材材积表快速计算器
  16. vb6引用vbRichClient5 下载对象 cDownloads 简单示例
  17. CSS的三种引入方式(行内样式、内部样式、外部样式)
  18. 认知系列2:认知半径
  19. python自动登录qq邮箱_python和selenium实现163邮箱自动登陆
  20. 网游之古剑太初最新章节

热门文章

  1. 【图像重构】基于OMP算法实现图像重构附matlab代码
  2. 匠心耕耘,新华三大学筑梦远航
  3. w讠ndows的中文读音,广西壮族自治区
  4. Proteus 8.6软件安装教程
  5. HIVE SQL 时间函数
  6. OpenXR+Runtime:OpenXR SDK Source Code源码编译
  7. 计算机发展简史ppt教程,计算机发展简史ppt课件.ppt
  8. JAVA电子书大礼包
  9. Voxengo音频插件合集:Voxengo Total Bundle Mac
  10. Beta 冲刺(7/7)