ChartJS 折线图 - 多条线,在工具提示上显示一个值

2023-11-24

我正在尝试制作一个图表,该图表必须显示每个客户的帐户变动。

我正在尝试做什么

我有树线; 第一行:最低余​​额(如果客户的余额低于最低余额)。余额,他的余额将从他的银行帐户自动加载。

第二行:当前余额

第三行:最大余额:如果客户的余额超过最大余额。他的余额将成为他银行账户上系统的差额。

我的问题

图片链接 : Chartjs工具提示问题

正如您在工具提示中看到的,这是所有 3 个值。直线的值与客户无关,因为限制(最大值和最小值由客户自己设置)。


为了实现这一点,您可以扩展折线图以添加一个选项来显示/隐藏每个数据集基础上的工具提示。烦人的是,只有一些更改,但必须重写整个方法才能获得其中的更改,因此下面看起来很多,但基本上对以下方法进行了 3 处更改

  • 初始化 - 添加了在每个点中存储 showTooltip 选项的选项

  • getPointsAtEvent - 添加了检查以确保我们在获取积分时要显示工具提示

  • showTooltip - 再次添加检查以确保我们想要显示工具提示

然后使用它时,图表的设置相同,但您将其设为 LineTooltip(这就是我所说的扩展图表),并在数据集中传递一个额外的选项,称为 showToolip。

 datasets: [{
        label: "My First dataset",
        fillColor: "rgba(220,220,220,0.5)",
        strokeColor: "rgba(220,220,220,0.8)",
        highlightFill: "rgba(220,220,220,0.75)",
        highlightStroke: "rgba(220,220,220,1)",
        showTooltip: false, //NEW OPTION DON"T NEED TO INCLUDE IT IF YOU WANT TO DISPLAY BUT WON"T HURT IF YOU DO
        data: [15, 10, 10, 10, 10, 10, 10]
    }, {
        label: "My second dataset",
        fillColor: "rgba(220,220,220,0.5)",
        strokeColor: "rgba(220,220,220,0.8)",
        highlightFill: "rgba(220,220,220,0.75)",
        highlightStroke: "rgba(220,220,220,1)",
        showTooltip: false, //NEW OPTION DON"T NEED TO INCLUDE IT IF YOU WANT TO DISPLAY BUT WON"T HURT IF YOU DO
        data: [100, 100, 100, 100, 100, 100, 100]
    }, {
        label: "My third dataset",
        fillColor: "rgba(151,187,205,0.5)",
        strokeColor: "rgba(151,187,205,0.8)",
        highlightFill: "rgba(151,187,205,0.75)",
        highlightStroke: "rgba(151,187,205,1)",
        data: [28, 48, 40, 19, 86, 27, 90]
    }]

我在下面的代码中添加了更大的评论横幅,以尝试突出显示所做更改的位置。我还将此功能添加到了我的 Chartjs 分支中,因为这可能对更多人有用https://github.com/leighquince/Chart.js,使用这个你可以只使用普通的折线图并添加 showTooltip

下面是将线扩展到自定义图表以包含此功能的示例,我在 LineTooltip 中调用为,但可以称为任何您喜欢的名称。

Chart.types.Line.extend({

  name: "LineTooltip",
  /*
   * we have to add one item in the init so need to rewrite it again here with the one edit
   */
  initialize: function(data) {
    //have to get the helpers as we are using this outside chart where it was declared
    var helpers = Chart.helpers;
    //Declare the extension of the default point, to cater for the options passed in to the constructor
    this.PointClass = Chart.Point.extend({
      strokeWidth: this.options.pointDotStrokeWidth,
      radius: this.options.pointDotRadius,
      display: this.options.pointDot,
      hitDetectionRadius: this.options.pointHitDetectionRadius,
      ctx: this.chart.ctx,
      inRange: function(mouseX) {
        return (Math.pow(mouseX - this.x, 2) < Math.pow(this.radius + this.hitDetectionRadius, 2));
      }
    });

    this.datasets = [];

    //Set up tooltip events on the chart
    if (this.options.showTooltips) {
      helpers.bindEvents(this, this.options.tooltipEvents, function(evt) {
        var activePoints = (evt.type !== 'mouseout') ? this.getPointsAtEvent(evt) : [];
        this.eachPoints(function(point) {
          point.restore(['fillColor', 'strokeColor']);
        });
        helpers.each(activePoints, function(activePoint) {
          activePoint.fillColor = activePoint.highlightFill;
          activePoint.strokeColor = activePoint.highlightStroke;
        });
        this.showTooltip(activePoints);
      });
    }

    //Iterate through each of the datasets, and build this into a property of the chart
    helpers.each(data.datasets, function(dataset) {
      var datasetObject = {
        label: dataset.label || null,
        fillColor: dataset.fillColor,
        strokeColor: dataset.strokeColor,
        pointColor: dataset.pointColor,
        pointStrokeColor: dataset.pointStrokeColor,
        showTooltip: dataset.showTooltip,
        points: []
      };

      this.datasets.push(datasetObject);


      helpers.each(dataset.data, function(dataPoint, index) {
        //Add a new point for each piece of data, passing any required data to draw.
        datasetObject.points.push(new this.PointClass({

          /*
           * set wether to show the tooltip or not, left this as being able to be undfined
           * and default to true
           */
          showTooltip: dataset.showTooltip === undefined ? true : dataset.showTooltip,
          value: dataPoint,
          label: data.labels[index],
          datasetLabel: dataset.label,
          strokeColor: dataset.pointStrokeColor,
          fillColor: dataset.pointColor,
          highlightFill: dataset.pointHighlightFill || dataset.pointColor,
          highlightStroke: dataset.pointHighlightStroke || dataset.pointStrokeColor
        }));
      }, this);

      this.buildScale(data.labels);


      this.eachPoints(function(point, index) {
        helpers.extend(point, {
          x: this.scale.calculateX(index),
          y: this.scale.endPoint
        });
        point.save();
      }, this);

    }, this);


    this.render();
  },
  /*
   * need to edit how points at event works so it only uses points that we want to show the tool tip for
   */
  getPointsAtEvent: function(e) {
    //have to get the helpers as we are using this outside chart where it was declared
    var helpers = Chart.helpers;
    var pointsArray = [],
      eventPosition = helpers.getRelativePosition(e);
    helpers.each(this.datasets, function(dataset) {
      helpers.each(dataset.points, function(point) {
        if (point.inRange(eventPosition.x, eventPosition.y) && point.showTooltip) pointsArray.push(point);
      });
    }, this);
    return pointsArray;
  },
  /*
   * also need to change how the core showTooltip functions as otherwise, it trys to be helpful
   * and grab any points it thinks also need to be displayed
   */
  showTooltip: function(ChartElements, forceRedraw) {
    //have to get the helpers as we are using this outside chart where it was declared
    var helpers = Chart.helpers;
    var each = helpers.each;
    var indexOf = helpers.indexOf;
    var min = helpers.min;
    var max = helpers.min;
    // Only redraw the chart if we've actually changed what we're hovering on.
    if (typeof this.activeElements === 'undefined') this.activeElements = [];

    var isChanged = (function(Elements) {
      var changed = false;

      if (Elements.length !== this.activeElements.length) {
        changed = true;
        return changed;
      }

      each(Elements, function(element, index) {
        if (element !== this.activeElements[index]) {
          changed = true;
        }
      }, this);
      return changed;
    }).call(this, ChartElements);

    if (!isChanged && !forceRedraw) {
      return;
    } else {
      this.activeElements = ChartElements;
    }
    this.draw();
    if (ChartElements.length > 0) {
      // If we have multiple datasets, show a MultiTooltip for all of the data points at that index
      if (this.datasets && this.datasets.length > 1) {
        var dataArray,
          dataIndex;

        for (var i = this.datasets.length - 1; i >= 0; i--) {
          dataArray = this.datasets[i].points || this.datasets[i].bars || this.datasets[i].segments;
          dataIndex = indexOf(dataArray, ChartElements[0]);
          if (dataIndex !== -1) {
            break;
          }
        }
        var tooltipLabels = [],
          tooltipColors = [],
          medianPosition = (function(index) {

            // Get all the points at that particular index
            var Elements = [],
              dataCollection,
              xPositions = [],
              yPositions = [],
              xMax,
              yMax,
              xMin,
              yMin;
            helpers.each(this.datasets, function(dataset) {
              dataCollection = dataset.points || dataset.bars || dataset.segments;
              /*
               *check to make sure we want to show the point
               */
              if (dataCollection[dataIndex] && dataCollection[dataIndex].hasValue() && (dataCollection[dataIndex].showTooltip === undefined || dataCollection[dataIndex].showTooltip)) {
                Elements.push(dataCollection[dataIndex]);
              }
            });

            helpers.each(Elements, function(element) {
              xPositions.push(element.x);
              yPositions.push(element.y);


              //Include any colour information about the element
              tooltipLabels.push(helpers.template(this.options.multiTooltipTemplate, element));
              tooltipColors.push({
                fill: element._saved.fillColor || element.fillColor,
                stroke: element._saved.strokeColor || element.strokeColor
              });

            }, this);

            yMin = min(yPositions);
            yMax = max(yPositions);

            xMin = min(xPositions);
            xMax = max(xPositions);

            return {
              x: (xMin > this.chart.width / 2) ? xMin : xMax,
              y: (yMin + yMax) / 2
            };
          }).call(this, dataIndex);

        new Chart.MultiTooltip({
          x: medianPosition.x,
          y: medianPosition.y,
          xPadding: this.options.tooltipXPadding,
          yPadding: this.options.tooltipYPadding,
          xOffset: this.options.tooltipXOffset,
          fillColor: this.options.tooltipFillColor,
          textColor: this.options.tooltipFontColor,
          fontFamily: this.options.tooltipFontFamily,
          fontStyle: this.options.tooltipFontStyle,
          fontSize: this.options.tooltipFontSize,
          titleTextColor: this.options.tooltipTitleFontColor,
          titleFontFamily: this.options.tooltipTitleFontFamily,
          titleFontStyle: this.options.tooltipTitleFontStyle,
          titleFontSize: this.options.tooltipTitleFontSize,
          cornerRadius: this.options.tooltipCornerRadius,
          labels: tooltipLabels,
          legendColors: tooltipColors,
          legendColorBackground: this.options.multiTooltipKeyBackground,
          title: ChartElements[0].label,
          chart: this.chart,
          ctx: this.chart.ctx
        }).draw();

      } else {
        each(ChartElements, function(Element) {
          var tooltipPosition = Element.tooltipPosition();
          new Chart.Tooltip({
            x: Math.round(tooltipPosition.x),
            y: Math.round(tooltipPosition.y),
            xPadding: this.options.tooltipXPadding,
            yPadding: this.options.tooltipYPadding,
            fillColor: this.options.tooltipFillColor,
            textColor: this.options.tooltipFontColor,
            fontFamily: this.options.tooltipFontFamily,
            fontStyle: this.options.tooltipFontStyle,
            fontSize: this.options.tooltipFontSize,
            caretHeight: this.options.tooltipCaretSize,
            cornerRadius: this.options.tooltipCornerRadius,
            text: template(this.options.tooltipTemplate, Element),
            chart: this.chart
          }).draw();
        }, this);
      }
    }
    return this;
  },

});




var ctx = document.getElementById("chart").getContext("2d");
var data = {
  labels: ["January", "February", "March", "April", "May", "June", "July"],
  datasets: [{
    label: "My First dataset",
    fillColor: "rgba(220,220,220,0.5)",
    strokeColor: "rgba(220,220,220,0.8)",
    highlightFill: "rgba(220,220,220,0.75)",
    highlightStroke: "rgba(220,220,220,1)",
    showTooltip: false, //TO USE JUST ADD THIS NEW OPTION ONLY REALLY NEEDS TO PRESENT IF SETTING TO FALSE
    data: [15, 10, 10, 10, 10, 10, 10]
  }, {
    label: "My second dataset",
    fillColor: "rgba(220,220,220,0.5)",
    strokeColor: "rgba(220,220,220,0.8)",
    highlightFill: "rgba(220,220,220,0.75)",
    highlightStroke: "rgba(220,220,220,1)",
    showTooltip: false, //TO USE JUST ADD THIS NEW OPTION ONLY REALLY NEEDS TO PRESENT IF SETTING TO FALSE
    data: [100, 100, 100, 100, 100, 100, 100]
  }, {
    label: "My third dataset",
    fillColor: "rgba(151,187,205,0.5)",
    strokeColor: "rgba(151,187,205,0.8)",
    highlightFill: "rgba(151,187,205,0.75)",
    highlightStroke: "rgba(151,187,205,1)",
    data: [28, 48, 40, 19, 86, 27, 90]
  }]
};


var myBarChart = new Chart(ctx).LineTooltip(data);
<script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/1.0.2/Chart.min.js"></script>
<canvas id="chart" width="600px"></canvas>

如果你觉得很容易看的话,还有一把小提琴http://jsfiddle.net/leighking2/1Lammwpt/

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

ChartJS 折线图 - 多条线,在工具提示上显示一个值 的相关文章

  • “scales”选项似乎破坏了 Chart.js 图表

    我正在尝试使用 Chart js 在我的 django 项目中包含一些股票数据的折线图 我可以用我想要的数据渲染一个简单的图表 但是当我尝试格式化 x 轴的日期和时间时 图表不再渲染 这是该文件的工作版本 client small mark
  • Chartjs - 在整数 x 轴值上绘制垂直线

    在下面的示例中 chartjs 注释使用字符串值 MAR 但不是整数值 如何在某个整数 x 轴值上绘制垂直线 var chartData labels JAN FEB MAR datasets data 12 3 2 window onlo
  • Chart.js 中的水平条形图

    我正在尝试使用 Chart js 2 3 0 绘制水平条形图 var MeSeContext document getElementById MeSeStatusCanvas getContext 2d var MeSeData label
  • 如何防止图表中的刻度标签被切断?

    我有问题chartjs http chartjs org其中刻度标签通过以下方式被 切断 1 是否有可以设置的边距 我在 ChartJS 文档中没有看到任何关于此的内容 并且这些似乎包含在 ChartJS Canvas 元素中 意思是 不被
  • 如何在chart.js中应用渐变颜色?

    我正在使用 Chart js 库制作折线图 在这里我想将线条的颜色更改为渐变颜色 我试过的代码 const gradientFill ctx createLinearGradient 500 0 100 0 gradientFill add
  • 当数据为0时,如何使chartJs堆叠条形始终四舍五入?

    我想出了这个小提琴 https jsfiddle net 2s09hqLu https jsfiddle net 2s09hqLu 它按照我想要的方式堆叠了圆形图表 但问题是当数据数组中的值为 0 时 它不会使其四舍五入 我总是希望它四舍五
  • 如何在 Chartjs 中添加图像作为背景?

    我在可编程设备上使用 Chart js lib 我需要添加图像作为图表的背景 如果不可能 我如何将背景颜色更改为黑色 我无法使用 Jquery 因为平台不支持它 谢谢 谢谢你 我没想到CSS 我也以类似的方式添加了图像 canvas bac
  • Chartjs 条形图悬停时显示旧数据

    我有一个使用 Chart js 创建的条形图 页面加载时一切正常 但是当我使用日期范围选择器更改时间范围时 会出现故障 新数据已引入 但当我将鼠标悬停在其上时 会显示旧数据 我是 javascript 新手 所以我希望得到一些帮助 看起来我
  • Chartjs 气泡图中的各个气泡可以有标签吗?

    我正在使用 Chartjs 创建气泡图 我能够创建描述每个气泡的工具提示 但我的图表的用户可能无法将鼠标悬停在其上以查看工具提示 BubbleData 对象格式不包含标签元素 无论如何我都放了一个 不走运 我尝试过图表数据对象的 标签 元素
  • 如何增加标签和图表区域之间的空间?

    我所有的标签都在栏的顶部 我可以看到这个 but I want that would be like this 填充不适用于税费 但适用于税费 legend display false scales xAxes position top s
  • Chartjs:如何删除特定标签

    我有一个包含这些数据和选项的条形图 var data labels periodnames datasets yAxisID bar stacked data rcash backgroundColor FFCE56 label yAxis
  • 错误:“类别”不是注册规模

    我正在尝试从以下位置迁移 Chart js2 9 3 to 3 3 0即使在应用更改之后 https www chartjs org docs latest getting started v3 migration html https w
  • Chart.js 响应式条形图标签大小调整

    所以我有一个使用 Chart js 的条形图 并且启用了响应式功能 它似乎适用于某些图表 但不适用于其他图表 例如 我的条形图标签似乎没有随窗口调整大小 但其他所有内容都会使整个图表在较小的窗口尺寸下看起来非常奇怪 如何重新调整标签大小以使
  • vue.js vue-chartjs 图表在更换、更新图表数据等时不会更新

    我正在尝试使用 vue chartjs 制作 vue 我已遵循所有有关在更新 ChartData 属性时重新渲染图表的相关文档 我的图表只会在调整浏览器窗口大小后更新 我的parenttestchart vue 文件
  • 使图表 js 中的标签响应式

    我很难使 y 轴上的标签响应 我希望标签移动到多行 并在空间不足时具有响应式字体大小 我正在使用 Chart js 数据标签库进行标签在水平条形图的顶部 由于外部图表容器 标签也被隐藏 var chart new Chart ctx typ
  • 如何在 ChartJS 2.0 中隐藏超出 x 轴的值?

    如何在 ChartJS 2 0 中隐藏超出 x 轴的值 您会注意到图表突出超过了 60 标记 x 轴使用时间刻度 我设置了最大值和最小值 这是我的图表配置 type line data datasets label Scatter Data
  • 如何在 Chart.js 中将 Y 轴值从数字更改为字符串?

    我在用Chart js http www chartjs org 我正在尝试更改 y 轴 请参见下面的屏幕截图 我尝试填写yLabels具有字符串数组的属性 但这没有用 任何帮助 将不胜感激 jQuery document ready fu
  • 使用chartJS显示带有连接点的折线图

    我想使用 ChartJS 绘制这样的图表 但我找不到连接第一个和最后一个点并在该连接区域内显示单个唯一点的解决方案 我还需要用不同的颜色设置每个点的样式 我尝试探索 ChartJS 文档但找不到解决方案 是否有任何图表绘制库具有这些功能或如
  • Chart.js 没有显示在我的视图中

    我有一个使用 angular js 运行的应用程序 我的视图之一应该加载图表 我正在使用 Chart js 但由于某种原因它不起作用 并且我的控制台上没有显示错误 这是我创建图表的函数 scope writeBatteryChart fun
  • Chartjs刻度标签位置

    尝试让 Y 轴刻度标签看起来像image https i stack imgur com XgoxX png 位于秤顶部且不旋转 缩放选项当前如下所示 scales yAxes id temp scaleLabel display true

随机推荐

  • 使用文本框和自定义词典进行拼写会减慢我在 C# WPF 中的应用程序的速度

    我在 WinForm 应用程序中使用 WPF 文本框进行拼写检查 每次创建一个文件时 我都会将相同的文件作为 CustomDictionary 加载 直到最近一切都很好 现在 它们需要很长时间才能加载 最多一秒钟 有些表格有 30 个或更多
  • 如何强制 Facebook JS-SDK 渲染动态添加的小部件?

    应用程序内的内容正在使用 XHR 进行更新 这涉及到更改评论框的 URL div class fb comments div 页面完全加载后创建新的 Facebook 小部件占位符时 如何请求 Facebook JS SDK 在页面上呈现新
  • 如何使用最小起订量模拟控制器上下文

    我正在尝试最小起订量框架 但现在我遇到了障碍 以下单元测试失败 因为 ViewName 属性的实际值是空字符串 有人能指出我正确的方向吗 为什么这没有通过测试 TestMethod public void Can Navigate To A
  • 在 xUnit.net 中的所有测试之前和之后运行代码一次

    TL DR 我正在寻找 xUnit 的 MSTest 等效项AssemblyInitialize 又名我喜欢的唯一功能 具体来说 我正在寻找它 因为我有一些硒烟雾测试 我希望能够在没有其他依赖项的情况下运行这些测试 我有一个 Fixture
  • Oracle 存储过程、SYS_REFCURSOR 和 NHibernate

    我正在连接一个旧版 Oracle 10 2g 数据库 我想使用 NHibernate 2 0 1 从存储过程返回对象 相关存储过程使用 SYS REFCURSOR 返回结果 根据文档这应该是可行的 但我找到了few posts互联网上另有建
  • 我应该使用什么 JavaScript 库来解析 URL 参数?

    如何解析 JavaScript 中的 URL 参数 这些参数我通常会称为 GET 参数或 CGI 参数 但在这种情况下 页面基本上是提交给自身 而不是服务器 因此没有 GET 请求 也绝对没有 CGI 程序 我在网上看到了许多可以复制的例程
  • Angular 2 http 服务。获取详细的错误信息

    对离线服务器执行 Angular2 http 调用并不会在我在 Observable 的 catch error 运算符或订阅错误委托中获取的 错误响应 对象中提供太多信息 它们实际上都共享相同的信息 但正如您在控制台的屏幕截图中看到的那样
  • 如何在 Windows 应用商店应用程序中使用 C# 计算大文件的哈希值(MD5 或 SHA)

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 PROBLEM 如果您尝试在 Windows 8 Metro 应用程序中使用 HashD
  • 异步函数返回 Promise { }?

    我有以下异步函数 async function readFile let content await new Promise resolve reject gt fs readFile file txt function err conte
  • cv2.videoCapture.release() 的含义是什么?

    我正在使用树莓派来捕获视频的前 20 帧 现在这更多的是一个概念问题 但是在浏览有关 videoCapture 的 openCV 文档时 他们强调了在此代码中释放捕获的重要性 如其网站上发布的 import numpy as np impo
  • 如何在 ASP.NET Core 2.2 中使用来自不同托管项目的共享 SignalR Hub

    我正在处理一个使用 ASP NET Core 2 2 构建的项目 主要解决方案包含多个项目 其中包括API Web和其他类库 我们使用 SignalR 来显示 API 项目和 Web 项目之间的共享消息 通知 例如 从 API 添加新员工记
  • SMLoginItemSetEnabled 有时会默默地无法启动沙盒 UI 帮助程序

    我有一个沙盒应用程序 其中包含一个呈现一些 UI 的帮助程序 作为全屏窗口 但也可以是状态项或类似项 这在大多数情况下都有效 但有时却并非如此 它只是默默地无法启动助手 由于助手有 UI 我使用SMLoginItemSetEnabled加载
  • Google Cloud Vision API:“请求的身份验证范围不足。”

    你好 我正在尝试使用谷歌的云视觉 API 特别是这个例子 https cloud google com vision docs label tutorial label tutorial 1 我按照这个教程进行操作 https cloud
  • 在 Three.js 中创建 2 点之间的样条曲线

    我正在尝试使用 Three js 将点与样条线链接起来 以实现我想要制作的可视化效果 据我所知 我将点添加到数组中 将其传递给 THREE SplineCurve3 逐步遍历样条线点以获取几何坐标并进行渲染 如果我只将起点 终点添加到数组中
  • Html.HiddenFor 是做什么的?

    虽然我已经阅读了 Html HiddenFor 的文档 但我还没有掌握它的用途 有人可以解释它的用途并举一个简短的例子吗 这些助手应该放在代码中的哪里 它在表单上为您传递的字段 来自模型 创建隐藏输入 对于模型 视图模型中需要保留在页面上并
  • VSTS 中 Android 应用程序的 Gradle 构建在内存不足后失败

    我在 VSTS 中有一个 gradle 构建 正在构建 Android 应用程序 但它失败并出现以下错误 构建机器真的只有很少的内存吗 还是我应该更改一些设置gradle properties 例如这org gradle jvmargs设置
  • WebBrowser DocumentCompleted 事件多次触发

    我一直在研究这个东西 每个人似乎都同意解决方案是检查ReadyState直到设置为 完成 但实际上该事件有时会被触发ReadyState多次设置为 完成 我认为对于那个蹩脚的 NET WebBrowser 没有解决方案 但如果我使用底层 D
  • Java 中抛出异常

    我有一个关于在 Java 中抛出异常的问题 这似乎是我这边的一种误解 我想自己澄清一下 我一直在读到处理异常代码的两种基本方法是 1 在 try 块中使用 throw new 抛出异常 并立即在 catch 块中捕获它 所谓的 try th
  • 所有者绘制的进度条中的动画“发光”(ListView/DataGridView)

    我注意到 NET 2 0 Winforms 中的沼泽标准 ProgressBar 在 Vista 中确实显示为精美的动画发光条 但是 使用 ProgressBarRenderer 通常在尝试在所有者绘制的列表视图 网格视图或其他此类控件中绘
  • ChartJS 折线图 - 多条线,在工具提示上显示一个值

    我正在尝试制作一个图表 该图表必须显示每个客户的帐户变动 我正在尝试做什么 我有树线 第一行 最低余 额 如果客户的余额低于最低余额 余额 他的余额将从他的银行帐户自动加载 第二行 当前余额 第三行 最大余额 如果客户的余额超过最大余额 他