2015-12-28 4 views
1

Я использую элемент управления DataVisualizations Charting в проекте формы .NET Windows. Проблема, с которой я сталкиваюсь, заключается в том, что когда я печатаю диаграмму, легенда не показывает маркер сериала (на самом деле это своего рода показ, но он просто выглядит как более темный пиксель на линии). Когда диаграмма просматривается в форме, маркеры видны, хотя они не очень большие и, похоже, не изменяются относительно значения MarkerSize для серии. Но когда график печатается (на бумаге или в формате PDF), маркеров нет..NET Charting Legend Размер маркера

На этом рисунке показан вид графика, если смотреть на форме. Поскольку вы можете видеть, что метки легенды видны, но все же нет, где рядом с маркерами серии.

Viewing chart on form

Это изображение показывает PDF версию той же самой схеме. Если вы сильно усмехнулись, вы можете увидеть более темный пиксель в центре линии легенды.

PDF printed chart

Как исправить маркеры легенды, чтобы они на самом деле показывают при печати и сделать их больше по размеру?

+0

У меня есть сомнения, что вы можете сделать это любым прямым способом.Размер маркеров легенд действительно растет с маркерами, но намного медленнее. Таким образом, одним из способов было бы заменить настоящую легенду одним из ваших, где вы используете изображение, которое вы рисуете на лету. Если вам интересно, я могу, может быть, показать вам пример позже сегодня. – TaW

+0

Было бы здорово, если бы вы могли показать пример. Любопытно посмотреть, как это будет выглядеть. –

ответ

1

Поскольку, похоже, нет возможности управлять маркерами легенд, вам может понадобиться создать пользовательскую легенду. Вот пример того, как это может выглядеть в Form и в PDF:

enter image description hereenter image description here

Я должен был уменьшить масштаб 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. Для примера see here!
  • Я закодировал рисунок изображения только для одного ChartType (Line) и только два MarkerStyles.
  • Существует множество способов настройки этих CustomItems. См. here для получения дополнительной информации ..
  • Я использовал Series.MarkerSize, но легко адаптировать код, установив ir = S.MarkerSize; и т. Д. Внутри цикла!
  • Возможно, вам понадобится скопировать еще несколько настроек из вашей оригинальной легенды в пользовательскую легенду, чем 3, которые я сделал. Я только заметил, что вы установили Font ..
+0

Это абсолютно идеально и мне нужно. Спасибо. –

Смежные вопросы