Как да контролирам подравняването на текста на легендата на winform mschart c#?

Как се задава подравняването на текста в обект на легенда на диаграма? Опитах да използвам:

 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 на Близо означава позициониране на полето с легенда близо до посоката Docking.

Много е трудно да се обясни това текстово. Примерите на MS Chart имат подсекция, наречена 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