使用Canvas扩展绘制动态ASP.NET Core Blazor气泡图

2023-10-29

目录

介绍

背景

使用代码

步骤1:创建ASP.NET Core Blazor服务器应用程序

运行测试应用程序

步骤2:安装软件包

步骤3:创建模型类

创建服务类

步骤4:将服务添加到Startup.cs中

步骤5:使用客户端项目

添加Razor组件

Import部分

HTML设计和数据绑定部分

函数部分

气泡图

导航菜单

生成并运行应用程序

兴趣点


介绍

在今天的文章中,我们将看到如何使用HTML5 CanvasASP.NET Core Blazor Web应用程序绘制自己的气泡图。

背景

使用代码

步骤1:创建ASP.NET Core Blazor服务器应用程序

安装上面列出的所有必备组件后,单击桌面上的开始 >> 程序 >> Visual Studio 2019 >> Visual Studio 2019。单击新建 >> 项目

选择Blazor App,然后单击下一步按钮。

选择您的项目文件夹并输入您的项目名称,然后单击创建按钮。

选择Blazor服务器应用程序

创建ASP.NET Core Blazor服务器应用程序后,请等待几秒钟。您将在解决方案资源管理器中看到以下结构。

Data文件夹中,我们可以添加所有模型、DBContext类、服务和控制器,我们将在本文中看到。

Pages文件夹中,我们可以添加我们的所有组件files.component文件,都应该有.razor扩展名的文件名。

Shared文件夹中,我们可以添加所有左侧菜单形式的NavMenu.razor文件,并改变来自MainLayout.razor文件的主要内容。

_Imports.razor文件中,我们可以看到已经添加了所有导入集,以便在所有组件页面中使用。

App.razor文件中,我们将添加要在浏览器中运行时默认显示的主要组件可用Appsertings.json添加连接字符串。

Startup.cs文件是一个重要文件,我们在其中添加所有端点示例,例如Controller端点,HTTP Client,添加服务和在startup Configuration方法中使用的dbcontext

运行测试应用程序

运行应用程序时,我们可以看到左侧具有导航功能,右侧包含数据。我们可以看到默认示例页面和菜单将显示在Blazor网站上。我们可以使用页面或将其删除,然后从我们自己的页面开始。

步骤2:安装软件包

要在我们的Blazor应用程序中使用Blazor Canvas扩展,我们需要安装以下软件包:

  • Blazor.Extensions.Canvas

右键单击解决方案,然后单击 Manage Nuget package。搜索所有软件包并安装所有需要的软件包,如下图所示:

安装软件包后,我们可以从依赖软件包中进行确认。

注意:添加blazor.extensions.canvas.js文件。

打开_Host.cshtml文件,并将以下代码添加到head标记内。

<script src="_content/Blazor.Extensions.Canvas/blazor.extensions.canvas.js"></script>

步骤3:创建模型类

接下来,我们需要创建Model类以在我们的应用程序中用于绑定条形图中的项目名称和项目计数。

右键单击Data文件夹,然后将新的类文件创建为ItemMaster.cs ”

在该类中,我们添加与以下代码相同的属性字段名称:

public String ItemName { get; set; }

public int SaleCount { get; set; }

创建服务类

接下来,我们创建一个ItemMasterService类,以便将图表中的结果与样本项目详细信息绑定在一起,每个项目都具有项目名称和销售数量。为此,我们右键单击Data文件夹,然后单击Add New Item以添加我们的ItemMasterService类。

在此类中,我们创建了一个方法来获取ItemMaster详细信息,该方法使用了项目名称和每个项目的销售计数作为随机值的5个项目记录示例。

public class ItemMasterService
    {
        public Task<ItemMaster[]> GetItemMasters()
        {
            var rng = new Random();
            int ivale = 0;
            return Task.FromResult(Enumerable.Range(1, 5).Select(index => new ItemMaster
            {
                ItemName = "itm" + rng.Next(1, 100),
                SaleCount = rng.Next(20, 100),
            }).ToArray()); 
        }
    }

步骤4:将服务添加到Startup.cs

我们需要将我们创建的服务添加到Startup.cs ConfigureServices方法中。

services.AddSingleton<ItemMasterService>();

步骤5:使用客户端项目

首先,我们需要添加“Razor组件页面。

添加Razor组件

要添加“Razor组件页面,请在Client项目中右键单击Pages”文件夹。单击添加 >> 新建项目 >> 选择Razor组件 >>输入您的组件名称。在这里,我们将其命名为DrawingSample.razor

请注意,所有组件文件都必须具有.razor扩展名。

Razor Component Page中,我们有三部分代码,首先是我们导入要在组件中使用的所有引用和模型的Import部分,HTML设计和数据绑定部分,最后是具有调用所有Web API的功能部分以绑定到我们的HTML页面中,并执行要在组件页面中显示的客户端业务逻辑。

Import部分

首先,我们在Razor View页面中导入所有必需的支持文件和引用。在这里,我们首先导入了要在我们的视图中使用的Model类,还导入了Blazor Canvas Extension,以便为Blazor应用程序绘制自己的图表控件。

@page "/drawingsample"

@using Blazor.Extensions.Canvas
@using Blazor.Extensions;
@using Blazor.Extensions.Canvas.Canvas2D;
@using ClazorCharts.Data
@inject ItemMasterService MasterService

HTML设计和数据绑定部分

接下来,我们设计DrawingSample详细信息页面以显示带有商品名称和每件商品销售数量的条形图。在这里,我们在Blazor HTML设计部分中添加了Blazor Extension HTML5画布,以绘制条形图。

<h3>Shanu - Draw Bar Chart using Blazor Canvas Extensions</h3>
<hr />  
<BECanvas Width="500" Height="500" @ref="_canvasReference"></BECanvas>

函数部分

函数部分用于获取服务结果并将结果绑定到数组中,并绘制用于显示柱状图的值。

在这里,我们首先声明ItemsArray要以获得绑定BarChartItem Mater的结果。接下来,我们创建一个string数组作为pirChartColor,以从数组中使用不同的颜色绘制每个条形图。在OnInitializedAsync中,我们得到ItemMasterService结果并将结果绑定到ItemsArrys中。在OnAfterRenderAsync方法中,我们使用C#绘制对象向绘制条形图到Canvas。我们使用项目数组的foreach获取所有的项目名称和值,这里我们绘制所有值并使用Array值绘制气泡图。使用该值,我们将从此方法在画布标签上绘制气泡图。

气泡图

气泡图通常至少具有3个变量,其中之一是气泡大小,X绘图值和y绘图值。在我们的示例中,气泡大小为或SaleCount值和xvaluey值,用于在图表内绘制气泡。

@code {

    private Canvas2DContext _context;

    protected BECanvasComponent _canvasReference;

    ItemMaster[] itemsArrys;

    private static readonly string[] pirChartColor = new[]
      {
      "#3090C7", "#BDEDFF", "#F9B7FF", "#736AFF", "#78C7C7", 
      "#B048B5", "#4E387E","#7FFFD4", "#3EA99F", "#EBF4FA", "#F9B7FF", "#8BB381",
          //"#6CBB3C", "#F87217", "#EAC117", "#EDDA74", "#CD7F32", 
          //"#CCFB5D", "#FDD017", "#9DC209", "#E67451", "#728C00","#617C58", "#64E986"
        };

    protected override async Task OnInitializedAsync()
    {
        itemsArrys = await MasterService.GetItemMasters();
    }

    protected override async Task OnAfterRenderAsync(bool firstRender)
    {
        lastend = 0;
        xSpace = 10;
        XvalPosition = xSpace;
        maxDataVal = itemsArrys.Max(row => row.SaleCount);
        noOfPlots = itemsArrys.Length;
        chartWidth = Convert.ToInt32(_canvasReference.Width);

        chartHeight = Convert.ToInt32(_canvasReference.Height);

        int widthcalculation = 
            (Convert.ToInt32(_canvasReference.Width) - 100) / itemsArrys.Length;

        chartHeight = Convert.ToInt32(_canvasReference.Height) - 40;

        this._context = await this._canvasReference.CreateCanvas2DAsync();
        int colorval = 0;

        // Draw the axises

        await this._context.BeginPathAsync();
        await this._context.MoveToAsync(xSpace, xSpace);

        // first Draw Y Axis

        await this._context.LineToAsync(xSpace, chartHeight);

        // Next draw the X-Axis

        await this._context.LineToAsync
              (Convert.ToInt32(_canvasReference.Width) - 10, chartHeight);
        await this._context.StrokeAsync();
       
      int  varbubbleSize = 30;  
  
   int ival = 1; 

        @foreach (var itemsArry in itemsArrys)
        {
            // Draw Xaxis Plots Line and Text   ***********

            XvalPosition = XvalPosition + widthcalculation;
            await this._context.MoveToAsync(XvalPosition, chartHeight);
            await this._context.LineToAsync(XvalPosition, chartHeight + 15);
            await this._context.StrokeAsync();
            await this._context.SetFillStyleAsync("#034560");
            await this._context.SetStrokeStyleAsync("#034560");
            await this._context.SetFontAsync("12pt Calibri");
            await this._context.StrokeTextAsync
                  (itemsArry.ItemName, XvalPosition - 40, chartHeight + 24);

            //  EndXval Plotting  ************
            Draw Bar Graph  **************==================********************

            await this._context.SetFillStyleAsync(pirChartColor[colorval]);

            await this._context.SetStrokeStyleAsync(pirChartColor[colorval]);

            await this._context.BeginPathAsync();

            varbubbleSize = itemsArry.SaleCount;
            if(itemsArry.SaleCount>70)
            {
                varbubbleSize = itemsArry.SaleCount-10;
            }

            await this._context.ArcAsync(getXPlotvalue(ival)-6, 
            getYPlotVale(varbubbleSize-10), varbubbleSize, varbubbleSize, Math.PI * 2, true);
            await this._context.FillAsync();
            await this._context.StrokeAsync();
            await this._context.SetFillStyleAsync("#034560");
            await this._context.SetStrokeStyleAsync("#034560");
            await this._context.SetFontAsync("12pt Calibri");
            await this._context.StrokeTextAsync(itemsArry.SaleCount.ToString(), 
            getXPlotvalue(ival)-12, getYPlotVale(itemsArry.SaleCount)+46);
            await this._context.SetStrokeStyleAsync("#C0C0C0");             

            colorval = colorval + 1;

            ival = ival + 1;
        }
    }

获得X绘图和Y绘图值的方法:在这里,我们计算在XY轴上绘制图表项。

// to return the x-Value  
private double getXPlotvalue(int val) {  

return Convert.ToDouble((chartWidth-40) / noOfPlots) * val + (xSpace * 1.5) - 20; 
}  
  
// Return the y value  
private double  getYPlotVale(int val) {  
   return chartHeight - (((chartHeight - xSpace) / maxDataVal) * val);  
  
}  }

导航菜单

现在,我们需要将此新添加的DrawingSample Razor”页面添加到左侧导航中。要添加此内容,请打开共享文件夹,然后打开NavMenu.cshtml页面并添加菜单。

<li class="nav-item px-3">
            <NavLink class="nav-link" href="DrawingSample">
                <span class="oi oi-list-rich" aria-hidden="true"></span> Bar Chart
            </NavLink>
        </li>

生成并运行应用程序

兴趣点

在此示例中,我们使用了简单的方法来显示0100范围内的气泡图。为了用于许多比例,我们可以扩展此图表以绘制图例和其他详细信息。由于这是我们自己的图表,因此我们可以根据需要添加任何功能。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用Canvas扩展绘制动态ASP.NET Core Blazor气泡图 的相关文章

  • 从画布保存/转换后文件质量下降的问题

    这是我正在使用的代码 代码位于这篇文章的底部 但这里是链接GitHubGist Noitidart ff addon snippet browseForBadgeThenCreateSaveAnApply js https gist git
  • 特别更改画布上的笔画不透明度,但不更改颜色

    我有一个漂亮整洁的脚本 可以循环显示颜色 并且与 xxxxxx格式 但我想改变透明度 有没有办法做到这一点 我指的是ctx strokeStyle 这是当前的代码 canvas strokeStyle 16777215 s length i
  • HTML Canvas - 动态更改文本

    当我在输入文本字段中输入内容时 我试图更改 html 画布上的文本 但是 我可以添加文本 如果我删除并再次输入 新文本将添加到旧文本的顶部 JSFIDDLE https jsfiddle net bm7jv7bk 1 document ge
  • DrawBitmapMesh 如何在 Android Canvas 中工作

    我想在矩形上绘制位图 我使用以下值 this meshWidth 1 this meshHeight 1 this verts new float 8 this points 0 x float this getWidth 4 this p
  • 如何将webview内容划分为多个页面

    我必须使用 Android 上的 PdfDocument 从 webView 创建 PDF https developer android com reference android graphics pdf PdfDocument htm
  • 将带有 html 标签的纯文本转换为 html 字符串并在 Blazor 中呈现

    Sample var s p Sample text p 期待 Sample text 我希望它在浏览器上呈现 但我无法呈现它 它只是将 s 的整个值作为文本字符串输出 我已经尝试过 new HtmlString s 将其编码为HttpUt
  • 如何更改 .NET MAUI Blazor 项目中的默认字体?

    我有一个用于 NET MAUI Blazor 应用程序的默认 Visual Studio 项目 针对 Windows x64 构建 我尝试了两种不同的更改字体的方法 在MauiProgram cs中有一个字体的配置ConfigureFont
  • html5 canvas 使用图像作为蒙版

    是否可以使用具有形状的图像作为整个画布或画布内图像的蒙版 我想将图像放置在画布中 并在图像上添加蒙版 然后将其另存为新图像 您可以使用 source in globalCompositeOperation 将黑白图像用作蒙版 首先 将蒙版图
  • 如何从SurfaceView绘制到Canvas?

    我正在尝试做简单的画家 问题是Android看起来有三个独立的Canvas并给我它来顺序绘制 我用以下方式制作了用户界面SurfaceView 把霍尔德从中拿走 Override protected void onCreate Bundle
  • WPF 画布缩放/变换以适合

    我重新发布这个问题 因为上次我没有得到太多答复 希望重新措辞可能有所帮助 本质上 我想做的是创建一个数据绑定画布 它将自动缩放其内容以 填充 可用空间 有点像缩放以适应操作 不幸的是 我的 WPF 技能还不是很强 我正在努力弄清楚如何完成最
  • 将图像缩略图上传到服务器,而不上传整个图像

    据我所知 我在这里问的是不可能的 但我想无论如何我都会问 以防我遗漏了什么 假设您想让用户上传 JPG 图像 并且这些图像被缩放为较小的图标 并且原始图像始终被丢弃并且不再需要 有没有什么方法可以在大多数现代浏览器中普遍使用 让用户选择硬盘
  • 限制线的长度

    我正在尝试画一条代表 弹弓 的线 并且希望它具有最大拉伸长度 在 p5 中 我在位置和位置之间画了一条线 line posA x posA y posB x posB y posA 是鼠标 x 和 y posB 是画布上圆的位置 我想要做的
  • Chartjs + Angular6 未显示图表或任何错误

    我正在尝试以角度实现chart js 编写了一个简单的代码来在html上显示图表 但是页面上没有输出 也没有错误 我不明白问题出在哪里以及为什么显示图表失败 堆栈闪电战 https stackblitz com edit angularch
  • @code 内部的代码在 blazor 服务器端的哪里运行?

    这可能是一个愚蠢的问题 但我试图阅读更多有关 Blazor 的内容 但我总是感到困惑 code 据我了解 当你使用 code在客户端 blazor 内部 所有内容都在客户端浏览器本地运行 所以我有几个问题 当您使用 blazor 服务器端时
  • 导出具有高质量图像的画布的最佳实践是什么?

    我需要你的帮助 我解释一下我的情况 我正在使用 Fabric js 库在我的应用程序中放置形状 文本等 我的画布尺寸为 1000x1000 像素 约 26 45x26 45 厘米 我有一个图像上传脚本 仅用于上传高质量图像 例如 300 d
  • 在 Fabric.js 中进行裁剪的“toDataURL”函数中,Multiplier 属性无法正常工作

    我的原始尺寸canvas is 800X700 我在用clipTo要在画布的选定部分中工作 var rect new fabric Rect left 100 top 50 fill fff width 376 height 602 str
  • 如何从任何类 blazor 服务器端读取 appsetting.json

    我知道如何从 razor 组件访问 appsettings json 但如何从 blazor 服务器端项目中的任何类访问 从剃刀组件我只需注入 注入IConfiguration config 并访问我需要的所有内容 例如 config Ge
  • fillRect(0,0,0,1)和clearRect()有什么区别

    之间有什么区别 ctx fillStyle rgba 0 0 0 1 ctx fillRect 0 0 100 100 and ctx clearRect 0 0 100 100 性能或生成的图像或画布数据有什么差异吗 更新以对应有问题的
  • 将 Blazor JS 脚本写入 blazor 组件

    我正在构建 Blazor 应用程序 我需要动态添加仅在单个 Blazor 组件中使用的 JavaScript 文件 您可能知道 Blazor 只允许向根 HTML 文档添加脚本标签 这使得添加仅在单个组件中需要的 JavaScript 文件
  • 在 HTML5 画布上绘制一个点 [重复]

    这个问题在这里已经有答案了 使用以下命令在 HTML5 画布上绘制一条线非常简单context moveTo and context lineTo 功能 我不太确定是否可以绘制一个点 即为单个像素着色 lineTo 函数不会绘制单个像素线

随机推荐

  • mongoose 实现DBRef查找所有子类信息

    产品表 var Mongoose require mongoose var Schema Mongoose Schema var Product new Schema image type String description type S
  • 【highlight】highlight 动态添加代码,样式失效

    在使用highlight 的时候 发现效果不错 然而当我用jQuery改变内容时 酷炫的高亮效果没了 原来hljs initHighlightingOnLoad 初始化的时候只会对其渲染一次 查阅资料发现 解决方案 code code 使用
  • s3 实现图片上传并返回图片路径

    一般做图片上传的的业务时我们接收的都是 MultipartFile 类型的文件 但是s3提供的图片上传只支持file 类型的文件上传 所以需要我先把 MultipartFile 转换为 file MultipartFile 转换为file
  • 递归树形结构的多级分类数据封装

    在日常开发中 我们经常需要查询一些树形结构的多级分类数据 如 多级菜单 商品三级分类 企业组织架构等等 我们以商品三级分类为例 大部分情况下 在同一张数据表中 无论是一级商品还是三级商品 每一条商品信息独占一行空间 通过 层级 字段 标明该
  • 金先生的 NutUI3 初体验

    冬日清晨 客服小王第一个来到了公司 还没顾得上脱下厚厚的羽绒服 桌上的电话就响了起来 您好 这里是京东客服 请问有什么可以帮到您的么 电话那头很嘈杂 呼啸的北风让来电人的声音很难被听清 而唯一可以被弄懂的就是对方一直在声嘶力竭反复强调的 开
  • 人脸相似度对比

    由清晰的人脸照转化出的像素值矩阵 应当设计出什么样的函数 f x 转化为特征值呢 这个问题的答案依赖于分类问题 即 先不谈特征值 首先如何把照片集合按人正确地分类 这里就要先谈谈机器学习 机器学习认为可以从有限的训练集样本中把算法很好地泛化
  • Sql Server 锁知识及锁应用

    转 sql server锁知识及锁应用 胡杰的专栏 CSDN博客sql server锁 lock 知识及锁应用一 关于锁的基础知识二 锁的分析及应用系列三 SQL Server 锁机制 悲观锁 乐观锁 实测解析四 SQL Server 中W
  • android车载行业前景,车载 Android 系统快来了,但前景可能并不乐观

    行业内相关主机厂 供应商已经习惯了利用移动版 Android 系统的开源性 进行框架层面的定制化改造 但是 车载 Android 系统为了保证满足车规应用 显然不会像移动版那样有很大的灵活定制性 特别是当谷歌开始把手伸向更底层的车辆控制系统
  • linux通信机制signal()函数详解

    我们来谈一谈signal 函数的作用 linux系统提供了signal 和sigaction 两个函数来改变对于信号的处理方法 其中signal 是一个基于sigaction 系统调用的glibc库函数 其行为在不同的linux操作系统存在
  • 赋值语句作为if的判断条件

    具体如下代码所示 char name xiaopingguo if char p NULL cout lt lt NULL lt
  • mysql按照每个表一个备份文件的逻辑备份脚本和检查报警脚本

    下面是逻辑备份脚本 1 首先通过information schema tables获取所有数据库名称 2 然后根据日期创建临时备份目录 根据数据库名进行循环 获取每个数据库下面的表名集合 3 然后进行循环备份 按照表级备份完成后 4 然后进
  • Microsemi Libero系列教程(一)——Libero开发环境介绍、下载、安装与注册

    文章目录 前言 Libero 简介 关于Libero IDE和Libero SoC Libero SoC Libero 下载 支持的操作系统 所有版本的安装包下载链接 V11 8安装包下载 V11 8 SP2补丁包下载 Libero 安装
  • java的示例题1

    前言 整理一部分java的示例题型 在线编译 入口 java的System out println与System out print 浩星 CSDN博客前言 java基础知识之System out println System out pr
  • vue配置history路由(Nginx版)

    修改Nginx配置文件 在里面加上这两段 h5为vue项目打包文件名 location h5 try files uri uri router index index html index htm location router rewri
  • css页眉标签,css与页眉,页脚和多栏布局scrled

    我正在尝试创建一个网页布局模板我的目标是页眉 页脚和2列之间 2栏是什么都给我最大的头痛 我想左列为固定宽度 右侧列填充剩余区域 我也成功完成了这一项 但我也希望这两列 垂直填充雨区 当内容填充超过我看每列要分别骂而不使用正常的Brower
  • 龙架构(LoongArch)赋能众享链网,相关产品已完成适配

    立足于中国特色区块链发展现状 以及 低成本 高效率 多兼容 新型网络技术发展需求 近日 龙芯3C5000L与众享链网底层平台 ChainSQL完成了兼容适配 龙芯3C5000L服务器作为超级节点正式加入众享链网并对外提供服务 适配结果表明
  • 【计算机视觉】MoCo 讲解

    有任何的书写错误 排版错误 概念错误等 希望大家包含指正 MoCo 模型概述 MoCo 是何恺明提出的一种通过对比学习的方式无监督地对图像编码器进行预训练的方法 MoCo 包括三个结构 query 编码器 key 编码器和动态字典 训练完成
  • Ubuntu20.4安装gnuradio艰辛之路

    自从毕设选了跟老师做雷达信号 一路坎坷 做信号盲检测需要安装gnuradio 一路艰辛 小白零基础经历耗费了差不多四天 经历了很多次系统奔溃死机 光是Ubuntu系统就重装了不下十次 最后打王者等待的时候 水晶爆了 但是突然弹出来安装好gn
  • Docker 具名和匿名挂载

    匿名挂载 v 容器内路径 docker run d p 9090 80 name nginx01 v etc nginx nginx 查看所有卷 volume 情况 docker volume ls DRIVER VOLUME NAME l
  • 使用Canvas扩展绘制动态ASP.NET Core Blazor气泡图

    目录 介绍 背景 使用代码 步骤1 创建ASP NET Core Blazor服务器应用程序 运行测试应用程序 步骤2 安装软件包 步骤3 创建模型类 创建服务类 步骤4 将服务添加到Startup cs中 步骤5 使用客户端项目 添加Ra