Как контролировать выравнивание текста легенды winform mschart С#?

Как установить выравнивание текста в объекте легенды диаграммы? Я пробовал использовать:

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

Без эффекта. Я также пытался создать пользовательские элементы легенды, но опять же безрезультатно. Текст ВСЕГДА располагается по центру (вместе с маркером серии) в «коробке» легенды. Единственный текст, который мне удалось выровнять, — это заголовок, но мне не нужны заголовки в моем приложении.

Мое исследование на сегодняшний день говорит, что объект легенды в основном представляет собой таблицу с (по умолчанию) двумя ячейками. Если это так, должен быть способ получить доступ к этим ячейкам и манипулировать ими как ячейками таблицы. Итак, что дает? Почему я не могу получить доступ к свойствам выравнивания текста объекта легенды? Ясно, что мне чего-то не хватает, но хоть убей, я не могу этого понять. Довольно неприятно.


person user1750310    schedule 16.10.2012    source источник


Ответы (3)


Проблема решена. Подход 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;

Вероятно, это не самый эффективный способ сделать это, но он работает. Технически символ легенды и текст по-прежнему располагаются по центру объекта, но поскольку я задаю ширину двух столбцов, создается впечатление, что они выровнены по левому краю.

Надеюсь, это поможет другому новичку вроде меня избежать дней страха.

person user1750310    schedule 17.10.2012

Насколько я понимаю, выравнивание 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 примеров.

person zeFrenchy    schedule 16.10.2012
comment
Спасибо за ответ. Позиционирование объекта легенды на диаграмме не является проблемой. Проблема заключается в позиционировании текста внутри объекта легенды. По умолчанию текст легенды располагается по центру объекта легенды. Я хочу иметь возможность выравнивать текст по левому краю. Это то, что я не могу понять. - person user1750310; 16.10.2012
comment
chartSel.Legends.Add(ySeries.Name); - person user1750310; 17.10.2012

Продолжая пытаться понять это, я наткнулся на этот лакомый кусочек информации со следующей страницы библиотеки MSDN:

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

«ПРИМЕЧАНИЕ. Вы не можете настроить отдельные элементы легенды и ячейки в коллекции Chart.Legends. Чтобы настроить их, используйте пользовательские элементы легенды».

Итак, вернемся к маршруту CustomItem. Я получил этот код из нескольких источников (включая вас, Доминик, спасибо):

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);

Из того, что я могу найти, это должно работать, но это не так. В результате получается объект легенды с двумя ячейками; первый пуст, а второй имеет выровненный по левому краю текст. Я пытался разместить его изображение, но система говорит, что я еще не достоин.

Почему нет строки для символа серии, тоже загадка, но это еще одна проблема, которую нужно решить. В настоящее время меня больше всего беспокоит проблема выравнивания текста. Похоже, что текст в ячейках выровнен по левому краю по желанию, но сами ячейки центрированы в объекте легенды; не то, что я хотел. Я хочу, чтобы эти ячейки также были выровнены по левому краю в объекте, поэтому первая ячейка находилась напротив левого края объекта легенды.

Идеи?

person user1750310    schedule 16.10.2012