.NET Charting图例标记大小

我正在.NET Windows窗体项目上使用DataVisualizations Charting控件。 我遇到的问题是,当我打印图表时,图例并没有显示系列标记(实际上它是一种显示,但它看起来像线上较暗的像素)。 当在表单上查看图表时,标记是可见的,尽pipe它们不是很大,并且与系列的MarkerSize值相比似乎没有改变。 但是当图表打印时(在纸上或PDF上),标记不在那里。

此图显示了在表单上查看图表的视图。 正如你所看到的,图例标记是可见的,但仍然没有接近实际系列标记的位置。

在表格上查看图表

该图显示了同一图表的PDF版本。 如果你眯起眼睛,你可以在图例中心看到较暗的像素。

PDF打印图表

如何修复图例标记,以便在印刷时实际显示并使其变大?

由于似乎无法控制传奇标记,因此您可能需要创建自定义传奇。 下面是一个如何在FormPDF查看的例子:

在这里输入图像说明 在这里输入图像说明

我不得不缩小PDF,所以看起来更薄/更轻。

这是一个返回CustomLegend的函数:

 Legend CustomCloneLegend(Chart chart, Legend oLeg) { Legend newL = new Legend(); newL.Position = oLeg.Position; // copy a few settings: newL.Docking = oLeg.Docking; newL.Alignment = oLeg.Alignment; // a few numbers for the drawing to play with; you may want to use floats.. int iw = 32; int iw2 = iw / 2; int ih = 18; int ih2 = ih / 2; int ir = 12; int ir2 = ir / 2; int lw = 3; // we want to access the series' colors! chart.ApplyPaletteColors(); foreach (Series S in chart.Series) { // the drawing code is only for linechart and markerstyles circle or square: Bitmap bmp = new Bitmap(iw, ih); using (Graphics G = Graphics.FromImage(bmp)) using (Pen pen = new Pen(S.Color, lw)) using (SolidBrush brush = new SolidBrush(S.Color)) { G.DrawLine(pen, 0, ih2, iw, ih2); if (S.MarkerStyle == MarkerStyle.Circle) G.FillEllipse(brush, iw2 - ir2, ih2 - ir2, ir, ir); else if (S.MarkerStyle == MarkerStyle.Square) G.FillRectangle(brush, iw2 - ir2, ih2 - ir2, ir, ir); } // add a new NamesImage NamedImage ni = new NamedImage(S.Name, bmp); chart.Images.Add(ni); // create and add the custom legend item LegendItem lit = new LegendItem( S.Name, Color.Red, S.Name); newL.CustomItems.Add(lit); } oLeg.Enabled = false; return newL; } 

这就是我所说的:

 Legend LC = CustomCloneLegend(chart3, L); chart1.Legends.Add(LC); 

一些注意事项:

  • 代码使用chart.ApplyPaletteColors() 这是访问Series颜色所必需的。
  • 它还利用了小知识类NamedImageChart.Images 这是必要的,因为设置Chart任何图像需要一个字符串!
  • 如果你想放大图片,你可能需要使用LegendCells 有关示例, 请参阅此处 !
  • 我已经编码图像绘制只有一个ChartTypeLine )和只有两个MarkerStyles
  • 有很多方法来定制这些CustomItems 查看更多信息
  • 我确实使用了Series.MarkerSize但通过设置ir = S.MarkerSize; 等循环里面!
  • 您可能需要从原来的图例中复制一些比我做的更多的设置。 我只是注意到你已经设置了一个Font ..