我正在.NET Windows窗体项目上使用DataVisualizations Charting控件。 我遇到的问题是,当我打印图表时,图例并没有显示系列标记(实际上它是一种显示,但它看起来像线上较暗的像素)。 当在表单上查看图表时,标记是可见的,尽pipe它们不是很大,并且与系列的MarkerSize值相比似乎没有改变。 但是当图表打印时(在纸上或PDF上),标记不在那里。
此图显示了在表单上查看图表的视图。 正如你所看到的,图例标记是可见的,但仍然没有接近实际系列标记的位置。
该图显示了同一图表的PDF版本。 如果你眯起眼睛,你可以在图例中心看到较暗的像素。
如何修复图例标记,以便在印刷时实际显示并使其变大?
由于似乎无法控制传奇标记,因此您可能需要创建自定义传奇。 下面是一个如何在Form
和PDF
查看的例子:
我不得不缩小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
颜色所必需的。 NamedImage
和Chart.Images
。 这是必要的,因为设置Chart
任何图像需要一个字符串! LegendCells
。 有关示例, 请参阅此处 ! ChartType
( Line
)和只有两个MarkerStyles
。 CustomItems
。 查看更多信息 Series.MarkerSize
但通过设置ir = S.MarkerSize;
等循环里面! Font
..