繁体   English   中英

如何控制Winform Mschart Legend文字对齐C#?

[英]How to control winform mschart legend text alignment c#?

如何设置图表图例对象中文本的对齐方式? 我试过使用:

 myChartName.Legends["mySeriesName"].Alignment = stringAlignment.Near 

没有效果。 我也尝试创建自定义图例项目,再次导致无效。 文本始终与图例“框”一起居中(以及系列标记)。 标题只能对齐,但我的应用程序中不需要标题。

到目前为止,我的研究表明,图例对象基本上是一个表(默认情况下)为两个单元格。 如果是这种情况,应该有一种方法可以访问这些单元格并将其作为表单元格进行操作。 那么,有什么用呢? 为什么无法访问图例对象的文本对齐属性? 显然,我缺少一些东西,但是对于我的一生,我似乎无法弄清楚。 相当令人沮丧。

问题解决了。 CustomItem方法也不起作用,因此我尝试使用LegendCellColumn类。

我将LegendStyle从Column更改为Row,然后添加了两个CellColumns,一个用于系列符号,一个用于图例文本。 设置对齐方式,边距和列宽(事实证明这是技巧),然后瞧瞧; 一个看起来像我想要的传说。 这是有类似问题的任何人的代码。

chartSel.Legends[ySeries.Name].CellColumns.Add(new LegendCellColumn("", LegendCellColumnType.SeriesSymbol, ""));
chartSel.Legends[ySeries.Name].CellColumns[0].Alignment = ContentAlignment.TopLeft;
chartSel.Legends[ySeries.Name].CellColumns[0].Margins = new System.Windows.Forms.DataVisualization.Charting.Margins(0, 0, 1, 1);
chartSel.Legends[ySeries.Name].CellColumns[0].MinimumWidth = 250;
chartSel.Legends[ySeries.Name].CellColumns[0].MaximumWidth = 250;

chartSel.Legends[ySeries.Name].CellColumns.Add(new LegendCellColumn("", LegendCellColumnType.Text, ySeries.Name));
chartSel.Legends[ySeries.Name].CellColumns[1].Alignment = ContentAlignment.MiddleLeft;
chartSel.Legends[ySeries.Name].CellColumns[1].Margins = new System.Windows.Forms.DataVisualization.Charting.Margins(0, 0, 1, 1);
chartSel.Legends[ySeries.Name].CellColumns[1].MinimumWidth = 1500;
chartSel.Legends[ySeries.Name].CellColumns[1].MaximumWidth = 1500;

这可能不是最有效的方法,但是可以。 从技术上讲,图例符号和文本仍然在对象中居中,但是由于我强制两列的宽度,因此看起来好像是左对齐的。

希望这可以帮助另一个像我这样的新手避免几天的困扰。

我的理解是, Legend对齐方式与Docking属性有关,而不是文本在图例中的对齐方式。 因此,将Alignment设置为Near意味着将图例框定位在Docking方向附近。

从文字上很难解释。 MS图表示例有一个名为“ Chart features -> Legends -> Style and Auto Positioning的小节,它将帮助您使用这两个属性并了解它们的工作原理。

对于内部图例对齐,您可能需要使用Legend.CustomItems并分别定义LegendCell

chart.Legends["Default"].CustomItems.Clear();
chart.Legends["Default"].CustomItems.Add(new LegendItem("LegendItem", Color.Red, ""));
chart.Legends["Default"].CustomItems[0].Cells.Add(new LegendCell(LegendCellType.Text, "My text", ContentAlignment.MiddleLeft));

在示例的“ Chart features -> Legends -> Legend Cells部分中对此进行了描述。

在继续尝试弄清楚这一点时,我偶然发现了以下MSDN库页面上的这一信息:

http://msdn.microsoft.com/en-us/library/dd456711(v=vs.100).aspx

“注意:您不能调整Chart.Legends集合中的单个图例项目和单元格。要调整它们,请使用自定义图例项目。”

因此,回到CustomItem路由。 我从几个来源(包括您,Dominique,谢谢)收集了此代码:

chartSel.Legends.Add(ySeries.Name);
chartSel.Series[ySeries.Name].IsVisibleInLegend = false;
chartSel.Legends[ySeries.Name].CustomItems.Clear();
LegendItem li = new LegendItem();
li.ImageStyle = LegendImageStyle.Line;
li.Cells.Add(LegendCellType.SeriesSymbol, "", ContentAlignment.TopLeft);
li.Cells[0].BackColor = Color.CornflowerBlue; //color is only to see the cell bounds
li.Cells.Add(LegendCellType.Text, ySeries.Name, ContentAlignment.TopLeft);
li.Cells[1].BackColor = Color.Aquamarine; //color is only to see the cell bounds
chartSel.Legends[ySeries.Name].CustomItems.Add(li);

根据我的发现,它应该起作用,但事实并非如此。 它产生带有两个单元格的图例对象。 第一个为空,第二个为左对齐文本。 我尝试发布它的图像,但是系统显示我还不值得。

为什么系列符号没有线条也是一个谜,但这是另一个要解决的问题。 文本对齐问题是我目前主要关心的问题。 看起来单元格中的文本根据需要左对齐,但是单元格本身位于图例对象的中心; 不是我想要的 我也希望这些单元格在对象中也左对齐,因此第一个单元格位于图例对象的左边缘。

想法?

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM