在Xamarin Form的HTML源中用JSON填充amCharts图表的方法
解决Xamarin Forms中amCharts无法注入自定义JSON数据的问题
问题根源
原代码存在两个关键错误:
- HTML字符串中的引号转义重复,导致JS里的元素ID、配置字段名变成无效的双引号包裹字符串(比如
""chartdiv"") - 自定义JSON数据未正确转义,无法被JS解析为合法的数组元素
修正步骤
- 修复引号转义:将所有
""xxx""替换为"xxx"(或在C#逐字字符串中用""替代单个双引号),确保JS能识别正确的ID和配置项。 - 正确注入JSON数据:在C#的逐字字符串(@开头)中,JSON的双引号需要用两个双引号转义,直接将JSON数据作为数组元素插入
data变量。
修正后的完整代码
htmlSource.Html = @"<html><head><style>#chartdiv {width: 100%;height: 500px;}</style></head><body><div id=""chartdiv""></div> </body><!-- Resources --><script src=""https://cdn.amcharts.com/lib/5/index.js""></script><script src=""https://cdn.amcharts.com/lib/5/xy.js""></script><script src=""https://cdn.amcharts.com/lib/5/themes/Animated.js""></script><!-- Chart code --><script>am5.ready(function() {var root = am5.Root.new(""chartdiv"");root.setThemes([ am5themes_Animated.new(root) ]);var chart = root.container.children.push(am5xy.XYChart.new(root, {panX: true,panY: true,wheelX: ""panX"",wheelY: ""zoomX"",pinchZoomX:true}));var cursor = chart.set(""cursor"", am5xy.XYCursor.new(root, {}));cursor.lineY.set(""visible"", false);var xRenderer = am5xy.AxisRendererX.new(root, { minGridDistance: 30 });xRenderer.labels.template.setAll({rotation: -90,centerY: am5.p50,centerX: am5.p100,paddingRight: 15});var xAxis = chart.xAxes.push(am5xy.CategoryAxis.new(root, {maxDeviation: 0.3,categoryField: ""country"",renderer: xRenderer, tooltip: am5.Tooltip.new(root, {})}));var yAxis = chart.yAxes.push(am5xy.ValueAxis.new(root, {maxDeviation: 0.3,renderer: am5xy.AxisRendererY.new(root, {})}));var series = chart.series.push(am5xy.ColumnSeries.new(root, {name: ""Series 1"",xAxis: xAxis,yAxis: yAxis,valueYField: ""value"", sequencedInterpolation: true, categoryXField: ""country"", tooltip: am5.Tooltip.new(root, { labelText:""{valueY}"" })}));series.columns.template.setAll({ cornerRadiusTL: 5, cornerRadiusTR: 5 });series.columns.template.adapters.add(""fill"", function(fill, target) {return chart.get(""colors"").getIndex(series.columns.indexOf(target));});series.columns.template.adapters.add(""stroke"", function(stroke, target) { return chart.get(""colors"").getIndex(series.columns.indexOf(target));});// Set datavar data = [{""country"":""31/08/2565"",""value"":42}];xAxis.data.setAll(data);series.data.setAll(data);series.appear(1000);chart.appear(1000, 100); }); // end am5.ready()</script></html>";
关键说明
- C#逐字字符串中,用
""表示单个双引号,确保最终输出到HTML的JS代码中引号格式合法。 - 自定义JSON数据直接以数组元素形式写入
data变量,完全符合JS语法要求,amCharts可正常解析。
内容的提问来源于stack exchange,提问作者A. WHY
相关产品推荐
相关产品推荐

