BlazorCharts 原生图表库的建设历程

点击蓝字

关注我们

背景

目前 Blazor 中可用的图表组件库主要有以下几个:

  • ant-design-blazor/ant-design-charts-blazor

    -基于G2Plot 

  • mariusmuntean/ChartJs.Blazor

    - 基于ChartJs 

  • blazor-cn/Blazor.ECharts

    - 基于ECharts

ant-design-charts-blazor是我主导完成的,相关使用教程可参阅《进击吧!Blazor!》系列入门教程 第一章 7.图表(https://blog.csdn.net/TimChen44/article/details/114295041)

然而这些图表库无不例外的采用的JS库进行二次分装,基本实现方式雷同,我以ant-design-charts-blazor举例

大致逻辑如下:

  1. 首先通过IJSRuntime接口与自己开发的own.js进行交互

  2. own.js中对图表库的api做了简单封装,主要目的是减少.razor与G2Plot的交互,毕竟IJSRuntime接口调用js对象没有js之间直接相互调用方便

  3. G2Plot会在Canvas中绘制出图表

  4. 图表中的一些事件通过own.js进行捕捉后通过IJSRuntime反馈给.razor

ant-design-charts-blazo r的技术实现方式,可详见我之前的文章《用Blazor技术封装G2Plot实现Charts组件》(https://zhuanlan.zhihu.com/p/163808856)

看了上述内容,我们思考一下,Blazor技术将C#带到了前端,我们却继续使用着JS的图表库,合理吗? 

明显不合理,所以我们应该去创建一个基于Blazor技术构建的图表库替代上面的JS库。

到这里还有一个小问题,就是 Canvas 提供的接口都是面向 JS 的,那么我们需要另外一个绘图技术,需兼顾功能和性能,其实不用选,SVG,就是你了。

可缩放矢量图形(Scalable Vector Graphics,SVG),是一种用于描述二维的矢量图形,基于 XML 的标记语言。作为一个基于文本的开放网络标准,SVG能够优雅而简洁地渲染不同大小的图形,并和CSS,DOM,JavaScript和SMIL等其他网络标准无缝衔接。

BlazorCharts

BlazorCharts 是我主导的开源项目,目标是创建一个基于Blazor技术,使用简单,功能相对丰富的图表库。

项目地址:https://github.com/TimChen44/blazor-charts

项目信息

首先,确定一个图标,俗话说图标确定后项目就完成了一半????,以本人的能力,只能将图表和@合并,设计出“缝合怪”作为我的图标????

接着,再确定我们组件的一些基本理念,我今后的设计尽我所能满足这些理念。

  • 使用简单

    组件库是拿来用的,所以使用方式要简单,使用方法要符合常规逻辑,争取使用时最大可能的减少对文档的依赖。

  • 功能实用

    实现一堆极少场景才会使用的图表,不如集中精力做好用的最多的那些图表。实现一堆极少场景才会使用的功能,不如集中精力做好用的最多的那些功能。

  • 信息直观

    使用图表的核心目的是解决表格数据显示不直观的问题,所以不论功能、布局、颜色、动画都是为了这个服务。

实现方式介绍

首先我们看一下图表包含的基本元素

基于这个结构,下面是我项目的类图,通过一些抽象,将图表的一些元素进行了归纳。

图表中每一个元素的大小位置变化都会影响到其他元素,所以位置和布局的确定存在一个先后关系,顺序如下:

图表效果

下面是一个最简单的图表示例

所需的配置

<BcChart Height="600" Width="800" Data="DemoData.Githubs" CategoryField="x=>x.Year.ToString()"><BcTitle Title="图表示例" TData="Github"></BcTitle><BcAxesY TData="Github" GridLineMajor="true" GridLineMinor="true"></BcAxesY><BcLegend TData="Github" BorderWidth="1" Position="LegendPosition.Bottom"></BcLegend><BcColumnSeries TData="Github" ValueFunc="x=>x.Sum(y=>y.View)" GroupName="View"></BcColumnSeries><BcColumnSeries TData="Github" ValueFunc="x=>x.Sum(y=>y.Start)" GroupName="Start"></BcColumnSeries><BcLineSeries TData="Github" ValueFunc="x=>x.Sum(y=>y.Fork)" GroupName="Fork" IsSecondaryAxis="true"></BcLineSeries>
</BcChart>

所需的数据

static class DemoData
{public static List<Github> Githubs = new List<Github>(){new Github(){Year=2017,View =2500,Start=800,Fork=400},new Github(){Year=2018,View =2200,Start=900,Fork=800},new Github(){Year=2019,View =2800,Start=1100,Fork=700},new Github(){Year=2020,View =2600,Start=1400,Fork=900},};
}

更多内容请观看下面的视频

MSReactor

扫码|关注我们

Bilibili|微软Reactor_SH

新浪微博|MSReactorShanghai

知乎|微软 Reactor

你们点点“分享”,给我充点儿电吧~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/301788.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Imageready(IR)动画介绍

PS自带了IR的大部分功能,如需使用动画功能,打开窗口---动画 ,然后就可以做动画了。最后保存方式要注意。存储为web和设备所用格式之后在弹出的选项上选GIF 。  一般通过设置图层不透明度来隐藏的图片实现多个图片切换。 CS5好像无法直接导出为swf。

别光顾着背单词了,每天花18分钟做这件事,英语水平暴增!

全世界只有3.14 % 的人关注了数据与算法之美在知乎上看过一个问题&#xff1a;在当今社会&#xff0c;英语还重要吗&#xff1f;点赞第一的回答是——英语可以差&#xff0c;但你的口语一定要好&#xff01;你记住了1万个单词、将语法书倒背如流、英语成绩名列前茅、英语证书一…

java中treemap释放_在Java中从TreeMap删除键

使用该remove()方法从TreeMap中删除键。让我们首先创建一个TreeMap并添加一些元素-TreeMap m new TreeMap();m.put(1,"India");m.put(2,"US");m.put(3,"Australia");m.put(4,"Netherlands");m.put(5,"Canada");现在让我们删…

WPF 路径动画PathAnimations的使用

在wpf中让一个控件按照一定的路径运行的动画。。叫做路径动画&#xff0c;这个示例演示了让一个rectangle按照一个s形曲线反复运行的动画。效果&#xff1a;只有一个文件&#xff1a;全部代码如下 &#xff1a;<Window x:Class"wpfcore.MainWindow"xmlns"htt…

setresult()java_Java ResultSet getType()方法与示例

该java.sql.ResultSet中的接口表示由SQL语句返回这样的表格数据。即ResultSet对象保存由执行查询数据库的语句的方法返回的表格数据(通常是Statement接口的executeQuery()方法)。ResultSet对象的类型根据您可以遍历的方向及其灵敏度确定结果集的类型。(在ResultSet中完成的更改…

STEM科学实验:测试了2000+儿童后证明它秒杀了90%的玩具!

▲数据汪特别推荐点击上图进入玩酷屋除了ipad和那些普通的玩具&#xff0c;我们还能给孩子玩儿些什么&#xff1f;当然是“玩”科学。因为创造力是他们这个年纪&#xff0c;最需要培养的东西。真正的科学启蒙不是将科学知识生硬的灌输给孩子&#xff0c;而是要让孩子在探索中能…

两个对象转换的方法

1、如果属性完全一致&#xff0c;可以使用已有方法 BeanUtils.copyProperties(clientPlugin, clientPluginVO); SuppressWarnings("all") ResourceMapping(value "/plugin/list", method HttpMethod.GET) public List<ClientPluginVO> getClient…

java如何运行一个任务_如何每天从Java运行任务?

石英是在Java环境中调度进程最著名的解决方案,但您有很多选择。检查此列表:Quartz是一个开放源码作业调度系统,可以与任何J2EE或J2SE应用程序集成,也可以与之一起使用。Quartz可用于创建简单或复杂的计划。Jcrontab设计用于扩展和集成任何项目。读取和存储要在文件、数据库或EJ…

人工智能时代,学好数学有什么用?

随着科技的快速发展&#xff0c;人工智能的热度越来越高。而数学知识蕴含着处理智能问题的基本思想与方法&#xff0c;是理解复杂算法的必备要素。在机器学习工作流程中&#xff0c;数学与代码高度交织在一起&#xff0c;代码通常可以根据数学直观地构建&#xff0c;甚至会共享…

JQuery真的不难~第六回 JQ中的异步调用方式

回到目录 前言 今天主要讲一下JQ中的异步编程&#xff0c;它将ajax进行封装&#xff0c;在进行异步请求时显得非常容易&#xff0c;无论是GET&#xff0c;POST方式&#xff0c;还是text,xml,javascript,json等数据通讯都是那么的自然 现在&#xff0c;我们就走入jq的ajax的殿堂…

使用CLI模板 | Visual Studio 2019(16.10)新功能试用

Visual Studio很早以前就有模板了&#xff0c;.NET Core命令行界面&#xff08;CLI&#xff09;也能够安装模板并通过dotnet new命令使用它们。然而&#xff0c;但是并没有什么简单的方法可以在Visual Studio中直接使用这些模板。在Visual Studio 2019(16.10)中&#xff0c;启用…

jmeter测试java服务_Jmeter 测试 JMS (Java Message Service)/ActiveMQ 性能

前言JMS 介绍:JMS 即 Java 消息服务(Java Message Service)应用程序接口&#xff0c;是一个 Java 平台中关于面向消息中间件(MOM)的 API&#xff0c;用于在两个应用程序之间&#xff0c;或分布式系统中发送消息&#xff0c;进行异步通信。(百度)本文只测试 ActiveMQ,其他消息中…

MetroGridHelper: A helpful debugging assistant for designers and developers alike

You’ve heard me preach it before: fix those margins, align, and try and make your apps as beautiful and inspiring as you can (see also: my designer tips for developers). On Thursday, I stopped by the Windows Phone Design Team’s beautiful studio space her…

马斯克和贝索斯的“星球大战”

全世界只有3.14 % 的人关注了数据与算法之美商业太空计划已经蓬勃发展了十年。在这个领域中&#xff0c;最雄心勃勃的两家公司当属Blue Origin&#xff08;蓝色起源&#xff09;和SpaceX&#xff08;太空探索技术公司&#xff09;&#xff0c;而它们之间的竞争一直是众人的焦点…

【招聘(北京)】北京华光普泰生物招聘.NET软件开发

.Net开发工程师——中级 3~5年 15~20K公司名称&#xff1a;北京华光普泰生物技术有限公司工作地址&#xff1a;北京市海淀区青云当代大厦岗位职责&#xff1a;1. 与技术负责人讨论确定项目架构和技术选型等关键问题并形成技术方案2. 完成软件子系统框架设计&#xff0c;包括基本…

java pojo 是什么_什么是POJO

POJO(Plain Old Java Objects)简单的Java对象&#xff0c;实际就是普通JavaBeans&#xff0c;是为了避免和EJB混淆所创造的简称。在Java应用程序中的角色使用POJO名称是为了避免和EJB混淆起来, 而且简称比较直接. 其中有一些属性及其gettersetter方法的类,没有业务逻辑&#xf…

JMeter基础知识

2019独角兽企业重金招聘Python工程师标准>>> 1.JMeter常用术语 1&#xff09;采样器&#xff08;Samplers&#xff09; 采样器是JMeter测试脚本的基础单元&#xff0c;用户可以用他来向服务器发出一个特定的请求&#xff0c;比如HTTP请求、JAVA请求。 2&#xff…

开年趣图汇总:对不起,让你笑了这么久

全世界只有3.14 % 的人关注了数据与算法之美房东家小孩抓周&#xff0c;感觉不管抓什么都很有未来....计算机语言成就一段恋情程序员&#xff0c;千万别像他学习如果编程语言是工具你这工作怎么越做越晚呢&#xff1f;那一刻&#xff0c;程序员露出了尴尬又不失礼貌的微笑这个名…

【视频回放】Best of Build Tour in China 暨 Watching Party - 大湾区专场

活动介绍微软一年一度的Build大会已经在5月25-27日盛大召开&#xff0c;今年的主题演讲&#xff0c;全球CEO Satya Nadella从开发者速度&#xff0c;智能云原生应用&#xff0c;以及在混合工作场景下提高生产力等诸多话题进行探讨。为了让技术社区和开发者更好地了解微软Build大…

android关于获取摄像头帧数据转成图片

第一部分&#xff1a; 由于Android下摄像头预览数据只能 ImageFormat.NV21 格式的&#xff0c;所以解码时要经过一翻周折. Camera mCamera Camera.open(); Camera.Parameters p mCamera.getParameters(); p.setPreviewFormat(ImageFormat.NV21); /*这是唯一值&#xff0c;也…