【发布时间】:2017-07-09 23:16:59
【问题描述】:
有没有办法获取stackcolumn图表栏的矩形?
这段代码 sn-p 是如何工作的,但它非常难看:
var points = new List<Point>();
for (int x = 0; x < chart.Size.Width; x++)
{
for (int y = 0; y < chart.Size.Height; y++)
{
var hp = chart.HitTest(x, y, false, ChartElementType.DataPoint);
var result = hp.Where(h => h.Series?.Name == "Cats");
if (result.Count() > 0)
{
points.Add(new Point(x, y));
}
}
}
var bottomright = points.First();
var topleft = points.Last();
我将尝试描述我的目的: 我想从各种测试结果创建一个图表,并将其作为 HTML 文件提供。此生成的图表作为图像文件插入 HTML 文档中。现在,我想将图表中的条形区域的每个部分链接到外部文档。由于图形是静态的,我只能使用“MAP 区域”元素将任何区域作为 HTML 的链接。 “地图”元素需要一个“矩形”或这些坐标。这就是为什么我需要酒吧每个部分的协调员的原因。 不得不提一下,我对 Chart 控件还不是很熟悉。
图形是测试生成的。
[已解决] 我得到了解决方案:
var stackedColumns = new List<Tuple<string,string,Rectangle>>();
for (int p = 0; p < chart.Series.Select(sm => sm.Points.Count).Max(); p++)
{
var totalPoints = 0;
foreach (var series in chart.Series)
{
var width = int.Parse(series.GetCustomProperty("PixelPointWidth"));
var x = (int)area.AxisX.ValueToPixelPosition(p + 1) - (width / 2);
int y = (int)area.AxisY.ValueToPixelPosition(totalPoints);
totalPoints += series.Points.Count > p ? (int)series.Points[p].YValues[0] : 0;
int y_total = (int)area.AxisY.ValueToPixelPosition(totalPoints);
var rect = new Rectangle(x, y_total, width, Math.Abs(y - y_total));
stackedColumns.Add(new Tuple<string, string, Rectangle>(series.Name, series.Points.ElementAtOrDefault(p)?.AxisLabel, rect));
}
}
此解决方法适用于stackedcolumn,点从x 轴=0 开始。 只需手动设置 PixelPointWidth 属性以获得正确的宽度。我还没有找到获得默认条宽的方法..
【问题讨论】:
-
这是一个简单的问题,但恐怕没有简单的答案。我已经测试了您的技巧并对其进行了优化,但是对于 最后一个系列的数据点的宽度,它总是 偏离 1-2 个像素。 - 你能告诉我们你需要矩形做什么吗?也许我的优化解决方案会做..