When setting the border color of the axis the labels are showing a border with the same color. The color is inherited from the axis element. One should be able to easily disable this, or it should not happen.
How to reproduce:
public partial class RadForm1 : Telerik.WinControls.UI.RadForm
{
LineSeries lineSeries;
public RadForm1()
{
InitializeComponent();
this.lineSeries = new LineSeries();
this.lineSeries.DataPoints.Add(new CategoricalDataPoint(20, "Jan"));
this.lineSeries.DataPoints.Add(new CategoricalDataPoint(22, "Apr"));
this.lineSeries.DataPoints.Add(new CategoricalDataPoint(25, "Jul"));
this.lineSeries.DataPoints.Add(new CategoricalDataPoint(19, "Oct"));
this.radChartView1.Series.Add(this.lineSeries);
this.lineSeries.HorizontalAxis.BorderColor = Color.Green;
this.lineSeries.VerticalAxis.BorderColor = Color.Blue;
}
}
Workaround: iterate each of the axis labels and set their border color to Transparent
public partial class RadForm1 : Telerik.WinControls.UI.RadForm
{
LineSeries lineSeries;
public RadForm1()
{
InitializeComponent();
this.lineSeries = new LineSeries();
this.lineSeries.DataPoints.Add(new CategoricalDataPoint(20, "Jan"));
this.lineSeries.DataPoints.Add(new CategoricalDataPoint(22, "Apr"));
this.lineSeries.DataPoints.Add(new CategoricalDataPoint(25, "Jul"));
this.lineSeries.DataPoints.Add(new CategoricalDataPoint(19, "Oct"));
this.radChartView1.Series.Add(this.lineSeries);
this.lineSeries.HorizontalAxis.BorderColor = Color.Green;
this.lineSeries.VerticalAxis.BorderColor = Color.Blue;
}
protected override void OnShown(EventArgs e)
{
base.OnShown(e);
foreach (var item in this.lineSeries.VerticalAxis.Children)
{
AxisLabelElement label = item as AxisLabelElement;
if (label != null)
{
label.BorderColor = Color.Transparent;
}
}
foreach (var item in this.lineSeries.HorizontalAxis.Children)
{
AxisLabelElement label = item as AxisLabelElement;
if (label != null)
{
label.BorderColor = Color.Transparent;
}
}
}
}
I have use following code to use Both Scrollbar in RadChartView While Zoom. but it not scroll my chart . radchart1.HorizontalScroll.Enabled = true; radchart1.HorizontalScroll.Visible = true; radchart1.VerticalScroll.Enabled = true; radchart1.VerticalScroll.Visible = true; Please help me. Hello Kalpesh, Currently panning in RadChartView cannot be performed using the scrollbars. We have a feature request logged here: https://feedback.telerik.com/Project/154/Feedback/Details/111013-add-radchartview-add-a-scrollbar-that-controls-the-pan-and-zoom Please subscribe to the item so that you be updated when its status changes. For the time being I can suggest using a RadRangeSelector control to zoom and pan the chart. More information is available here: https://docs.telerik.com/devtools/winforms/rangeselector/overview Regards, Hristo
To reproduce: - Set the title and the offset: radChartView1.Title = "Test Title"; radChartView1.ShowTitle = true; radChartView1.ChartElement.TitleElement.PositionOffset = new SizeF(100, 100); - Export the chart.
To reproduce: Add stacked series with equal category that has negative values as well.
Workaround:
CartesianRenderer renderer = null;
public RadForm1()
{
InitializeComponent();
this.radChartView1.CreateRenderer += new ChartViewCreateRendererEventHandler(radChartView1_CreateRenderer);
LineSeries lineSeries = new LineSeries();
lineSeries.LegendTitle = "Line 1";
lineSeries.DataPoints.Add(new CategoricalDataPoint(20, "Jan"));
lineSeries.DataPoints.Add(new CategoricalDataPoint(22, "Apr"));
lineSeries.DataPoints.Add(new CategoricalDataPoint(12, "Jul"));
lineSeries.DataPoints.Add(new CategoricalDataPoint(19, "Oct"));
this.radChartView1.Series.Add(lineSeries);
LineSeries lineSeries2 = new LineSeries();
lineSeries2.LegendTitle = "Line 2";
lineSeries2.DataPoints.Add(new CategoricalDataPoint(18, "Jan"));
lineSeries2.DataPoints.Add(new CategoricalDataPoint(15, "Apr"));
lineSeries2.DataPoints.Add(new CategoricalDataPoint(17, "Jul"));
lineSeries2.DataPoints.Add(new CategoricalDataPoint(22, "Oct"));
this.radChartView1.Series.Add(lineSeries2);
this.radChartView1.ShowLegend = true;
this.radChartView1.ChartElement.LegendPosition = LegendPosition.Float;
this.radChartView1.ChartElement.LegendOffset = new Point(200, 95);
CartesianArea area = this.radChartView1.GetArea<CartesianArea>();
area.ShowGrid = true;
}
private void radChartView1_CreateRenderer(object sender, ChartViewCreateRendererEventArgs e)
{
renderer = new CartesianRenderer(e.Area as CartesianArea);
e.Renderer = renderer;
}
private void radButton1_Click(object sender, EventArgs e)
{
string filePath = @"..\..\..\exportedChart" + DateTime.Now.ToLongTimeString().Replace(":", "_") + ".png";
using (MemoryStream stream = new MemoryStream())
{
ExportToImage(this.radChartView1, stream, new Size(1000 ,500), ImageFormat.Png, filePath);
}
Process.Start(filePath);
}
public void ExportToImage(RadChartView chart, Stream stream, Size size, ImageFormat imageFormat, string filePath)
{
if (!this.IsLoaded)
{
this.LoadElementTree();
}
size = Telerik.WinControls.TelerikDpiHelper.ScaleSize(size, chart.ChartElement.DpiScaleFactor);
Bitmap bmp = new Bitmap(size.Width, size.Height);
Graphics graphics = Graphics.FromImage(bmp);
graphics.Clear(Color.White);
SizeF titleSize = graphics.MeasureString(chart.Title, chart.ChartElement.TitleElement.Font, this.Width);
if (chart.ChartElement.TitleElement.TextOrientation == Orientation.Vertical)
{
float swap = titleSize.Height;
titleSize.Height = titleSize.Width;
titleSize.Width = swap;
}
RadRect titleRect = new RadRect(0, 0, titleSize.Width, titleSize.Height);
RadRect legendRect = new RadRect(0, 0, size.Width, size.Height);
RadRect chartRect = legendRect;
switch (chart.ChartElement.TitlePosition)
{
case TitlePosition.Top:
case TitlePosition.Bottom:
titleRect.Width = size.Width;
break;
case TitlePosition.Right:
case TitlePosition.Left:
titleRect.Height = size.Height;
break;
}
chartRect.X += chart.View.Margin.Left;
chartRect.Y += chart.View.Margin.Top;
chartRect.Width -= chart.View.Margin.Horizontal;
chartRect.Height -= chart.View.Margin.Vertical;
if (chart.ShowTitle)
{
switch (chart.ChartElement.TitlePosition)
{
case TitlePosition.Top:
legendRect.Y += titleRect.Height;
chartRect.Y += titleRect.Height;
legendRect.Height -= titleRect.Height;
chartRect.Height -= titleRect.Height;
break;
case TitlePosition.Right:
titleRect.X = size.Width - chart.ChartElement.TitleElement.Size.Width;
titleRect.Height = size.Height;
legendRect.Width -= titleRect.Width;
chartRect.Width -= titleRect.Width;
break;
case TitlePosition.Bottom:
titleRect.Y = size.Height - chart.ChartElement.TitleElement.Size.Height;
titleRect.Width = size.Width;
legendRect.Height -= titleRect.Height;
chartRect.Height -= titleRect.Height;
break;
case TitlePosition.Left:
titleRect.Height = size.Height;
legendRect.X += titleRect.Width;
chartRect.X += titleRect.Width;
legendRect.Width -= titleRect.Width;
chartRect.Width -= titleRect.Width;
break;
}
}
chart.View.Layout(chartRect);
renderer.Draw(graphics);
if (chart.ShowLegend)
{
switch (chart.ChartElement.LegendPosition)
{
case LegendPosition.Right:
if (chart.ChartElement.TitlePosition == TitlePosition.Right)
{
legendRect.X = titleRect.X - chart.ChartElement.LegendElement.Size.Width;
}
else
{
legendRect.X = size.Width - chart.ChartElement.LegendElement.Size.Width;
}
legendRect.Width = chart.ChartElement.LegendElement.Size.Width;
chartRect.Width -= legendRect.Width;
break;
case LegendPosition.Bottom:
if (chart.ChartElement.TitlePosition == TitlePosition.Bottom)
{
legendRect.Y = titleRect.Y - chart.ChartElement.LegendElement.Size.Height;
}
else
{
legendRect.Y = size.Height - chart.ChartElement.LegendElement.Size.Height;
}
legendRect.Height = chart.ChartElement.LegendElement.Size.Height;
chartRect.Height -= legendRect.Height;
break;
case LegendPosition.Left:
legendRect.Width = chart.ChartElement.LegendElement.Size.Width;
chartRect.X += legendRect.Width;
chartRect.Width -= legendRect.Width;
break;
case LegendPosition.Top:
legendRect.Height = chart.ChartElement.LegendElement.Size.Height;
chartRect.Y += legendRect.Height;
chartRect.Height -= legendRect.Height;
break;
case LegendPosition.Float:
legendRect.Width = chart.ChartElement.LegendElement.Size.Width;
legendRect.Height = chart.ChartElement.LegendElement.Size.Height;
double xRatio = size.Width / this.Size.Width;
double yRatio = size.Height / this.Size.Height;
legendRect.X = (chart.ChartElement.LegendOffset.X * xRatio) + ((chart.ChartElement.TitlePosition == TitlePosition.Left)
? titleRect.Right : 0d);
legendRect.Y = (chart.ChartElement.LegendOffset.Y * yRatio) + ((chart.ChartElement.TitlePosition == TitlePosition.Top)
? titleRect.Bottom : 0f);
break;
}
}
if (chart.ShowLegend)
{
float xTransform = (float)legendRect.X - chart.ChartElement.LegendElement.ControlBoundingRectangle.X +
((float)legendRect.Width - chart.ChartElement.LegendElement.ControlBoundingRectangle.Width) / 2f;
float yTransform = (float)legendRect.Y - chart.ChartElement.LegendElement.ControlBoundingRectangle.Y +
((float)legendRect.Height - chart.ChartElement.LegendElement.ControlBoundingRectangle.Height) / 2f;
graphics.TranslateTransform(xTransform, yTransform);
chart.ChartElement.LegendElement.Paint(new RadGdiGraphics(graphics), chart.ChartElement.LegendElement.ControlBoundingRectangle, 0f,
new SizeF(1f, 1f), true);
graphics.ResetTransform();
}
RadGdiGraphics radGraphics = new RadGdiGraphics(graphics);
if (chart.ShowTitle)
{
radGraphics.DrawString(chart.Title, GetTitleDrawRectangle(ChartRenderer.ToRectangleF(titleRect), titleSize,
chart.ChartElement.TitleElement.TextAlignment), chart.ChartElement.TitleElement.Font,
chart.ChartElement.TitleElement.ForeColor, chart.ChartElement.TitleElement.TextParams.CreateStringFormat(),
chart.ChartElement.TitleElement.TextOrientation, chart.ChartElement.TitleElement.FlipText);
}
if (imageFormat == ImageFormat.Emf ||
imageFormat == ImageFormat.Wmf)
{
Metafile metafile = new Metafile(stream, graphics.GetHdc()); // file is created here
using (Graphics g = Graphics.FromImage(metafile))
{
g.DrawImage(bmp, Point.Empty);
}
metafile.Dispose();
graphics.ReleaseHdc();
}
else
{
bmp.Save(stream, imageFormat);
}
chart.View.Layout();
Image img = Image.FromStream(stream);
graphics.DrawImage(img, new Point(0, 0));
img.Save(filePath);
}
private RectangleF GetTitleDrawRectangle(RectangleF drawArea, SizeF textRect, ContentAlignment textAlignment)
{
switch (textAlignment)
{
case ContentAlignment.BottomCenter:
return new RectangleF(new PointF(drawArea.X + (drawArea.Width - textRect.Width) / 2f, drawArea.Bottom - textRect.Height), textRect);
case ContentAlignment.BottomLeft:
return new RectangleF(new PointF(drawArea.X, drawArea.Bottom - textRect.Height), textRect);
case ContentAlignment.BottomRight:
return new RectangleF(new PointF(drawArea.Right - textRect.Width, drawArea.Bottom - textRect.Height), textRect);
case ContentAlignment.MiddleCenter:
return new RectangleF(new PointF(drawArea.X + (drawArea.Width - textRect.Width) / 2f, drawArea.Y + (drawArea.Height - textRect.Height) / 2f),
textRect);
case ContentAlignment.MiddleLeft:
return new RectangleF(new PointF(drawArea.X, drawArea.Y + (drawArea.Height - textRect.Height) / 2f), textRect);
case ContentAlignment.MiddleRight:
return new RectangleF(new PointF(drawArea.Right - textRect.Width, drawArea.Y + (drawArea.Height - textRect.Height) / 2f), textRect);
case ContentAlignment.TopCenter:
return new RectangleF(new PointF(drawArea.X + (drawArea.Width - textRect.Width) / 2, drawArea.Y), textRect);
case ContentAlignment.TopLeft:
return new RectangleF(drawArea.Location, textRect);
case ContentAlignment.TopRight:
return new RectangleF(new PointF(drawArea.Right - textRect.Width, drawArea.Y), textRect);
default:
return new RectangleF(drawArea.Location, textRect);
}
}
Use the attached project to reproduce. Workaround: Check for zero values.
Use LogarithmicAxis and set the Minimum to 0.1 Workaround is availble in the atched project.
How to reproduce:
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
this.radChartView1.ShowLegend = true;
LineSeries lineSeries = new LineSeries();
lineSeries.DataPoints.Add(new CategoricalDataPoint(20, "Jan"));
lineSeries.DataPoints.Add(new CategoricalDataPoint(22, "Apr"));
lineSeries.DataPoints.Add(new CategoricalDataPoint(12, "Jul"));
lineSeries.DataPoints.Add(new CategoricalDataPoint(19, "Oct"));
this.radChartView1.Series.Add(lineSeries);
LineSeries lineSeries2 = new LineSeries();
lineSeries2.DataPoints.Add(new CategoricalDataPoint(18, "Jan"));
lineSeries2.DataPoints.Add(new CategoricalDataPoint(15, "Apr"));
lineSeries2.DataPoints.Add(new CategoricalDataPoint(17, "Jul"));
lineSeries2.DataPoints.Add(new CategoricalDataPoint(22, "Oct"));
this.radChartView1.Series.Add(lineSeries2);
ChartPanZoomController panZoomController = new ChartPanZoomController();
panZoomController.PanZoomMode = ChartPanZoomMode.Horizontal;
radChartView1.Controllers.Add(panZoomController);
}
private void radButton1_Click(object sender, EventArgs e)
{
this.radChartView1.ExportToImage(@"..\..\image.png", this.radChartView1.Size, System.Drawing.Imaging.ImageFormat.Png);
}
}
Workaround: use a custom export to image method
public void ExportChartToImage(string filePath, Size size, ImageFormat imageFormat)
{
using (FileStream fs = new FileStream(filePath, FileMode.Create, FileAccess.Write))
{
if (!this.radChartView1.IsLoaded)
{
this.radChartView1.LoadElementTree();
}
Bitmap bmp = new Bitmap(size.Width, size.Height);
Graphics graphics = Graphics.FromImage(bmp);
graphics.Clear(Color.White);
SizeF titleSize = graphics.MeasureString(this.radChartView1.Title, this.radChartView1.ChartElement.TitleElement.Font, this.Width);
if (this.radChartView1.ChartElement.TitleElement.TextOrientation == Orientation.Vertical)
{
float swap = titleSize.Height;
titleSize.Height = titleSize.Width;
titleSize.Width = swap;
}
RadRect titleRect = new RadRect(0, 0, titleSize.Width, titleSize.Height);
RadRect legendRect = new RadRect(0, 0, size.Width, size.Height);
RadRect chartRect = legendRect;
switch (this.radChartView1.ChartElement.TitlePosition)
{
case TitlePosition.Top:
case TitlePosition.Bottom:
titleRect.Width = size.Width;
break;
case TitlePosition.Right:
case TitlePosition.Left:
titleRect.Height = size.Height;
break;
}
chartRect.X += this.radChartView1.View.Margin.Left;
chartRect.Y += this.radChartView1.View.Margin.Top;
chartRect.Width -= this.radChartView1.View.Margin.Horizontal;
chartRect.Height -= this.radChartView1.View.Margin.Vertical;
if (this.radChartView1.ShowTitle)
{
switch (this.radChartView1.ChartElement.TitlePosition)
{
case TitlePosition.Top:
legendRect.Y += titleRect.Height;
chartRect.Y += titleRect.Height;
legendRect.Height -= titleRect.Height;
chartRect.Height -= titleRect.Height;
break;
case TitlePosition.Right:
titleRect.X = size.Width - this.radChartView1.ChartElement.TitleElement.Size.Width;
titleRect.Height = size.Height;
legendRect.Width -= titleRect.Width;
chartRect.Width -= titleRect.Width;
break;
case TitlePosition.Bottom:
titleRect.Y = size.Height - this.radChartView1.ChartElement.TitleElement.Size.Height;
titleRect.Width = size.Width;
legendRect.Height -= titleRect.Height;
chartRect.Height -= titleRect.Height;
break;
case TitlePosition.Left:
titleRect.Height = size.Height;
legendRect.X += titleRect.Width;
chartRect.X += titleRect.Width;
legendRect.Width -= titleRect.Width;
chartRect.Width -= titleRect.Width;
break;
}
}
if (this.radChartView1.ShowLegend)
{
switch (this.radChartView1.ChartElement.LegendPosition)
{
case LegendPosition.Right:
if (this.radChartView1.ChartElement.TitlePosition == TitlePosition.Right)
{
legendRect.X = titleRect.X - this.radChartView1.ChartElement.LegendElement.Size.Width;
}
else
{
legendRect.X = size.Width - this.radChartView1.ChartElement.LegendElement.Size.Width;
}
legendRect.Width = this.radChartView1.ChartElement.LegendElement.Size.Width;
chartRect.Width -= this.radChartView1.View.Margin.Right;
break;
case LegendPosition.Bottom:
if (this.radChartView1.ChartElement.TitlePosition == TitlePosition.Bottom)
{
legendRect.Y = titleRect.Y - this.radChartView1.ChartElement.LegendElement.Size.Height;
}
else
{
legendRect.Y = size.Height - this.radChartView1.ChartElement.LegendElement.Size.Height;
}
legendRect.Height = this.radChartView1.ChartElement.LegendElement.Size.Height;
chartRect.Height -= legendRect.Height;
break;
case LegendPosition.Left:
legendRect.Width = this.radChartView1.ChartElement.LegendElement.Size.Width;
chartRect.X += legendRect.Width + this.radChartView1.View.Margin.Left;
chartRect.Width -= legendRect.Width + this.radChartView1.View.Margin.Left;
break;
case LegendPosition.Top:
legendRect.Height = this.radChartView1.ChartElement.LegendElement.Size.Height;
chartRect.Y += legendRect.Height;
chartRect.Height -= legendRect.Height;
break;
case LegendPosition.Float:
legendRect.Width = this.radChartView1.ChartElement.LegendElement.Size.Width;
legendRect.Height = this.radChartView1.ChartElement.LegendElement.Size.Height;
double xRatio = size.Width / this.Size.Width;
double yRatio = size.Height / this.Size.Height;
legendRect.X = (this.radChartView1.ChartElement.LegendOffset.X * xRatio) + ((this.radChartView1.ChartElement.TitlePosition == TitlePosition.Left) ? titleRect.Right : 0d);
legendRect.Y = (this.radChartView1.ChartElement.LegendOffset.Y * yRatio) + ((this.radChartView1.ChartElement.TitlePosition == TitlePosition.Top) ? titleRect.Bottom : 0f);
break;
}
}
if (this.radChartView1.ShowLegend)
{
float xTransform = (float)legendRect.X - this.radChartView1.ChartElement.LegendElement.ControlBoundingRectangle.X + ((float)legendRect.Width - this.radChartView1.ChartElement.LegendElement.ControlBoundingRectangle.Width) / 2f;
float yTransform = (float)legendRect.Y - this.radChartView1.ChartElement.LegendElement.ControlBoundingRectangle.Y + ((float)legendRect.Height - this.radChartView1.ChartElement.LegendElement.ControlBoundingRectangle.Height) / 2f;
graphics.TranslateTransform(xTransform, yTransform);
this.radChartView1.ChartElement.LegendElement.Paint(new RadGdiGraphics(graphics), this.radChartView1.ChartElement.LegendElement.ControlBoundingRectangle, 0f, new SizeF(1f, 1f), true);
graphics.ResetTransform();
}
RadGdiGraphics radGraphics = new RadGdiGraphics(graphics);
if (this.radChartView1.ShowTitle)
{
object[] miParams = new object[] { ChartRenderer.ToRectangleF(titleRect), titleSize, this.radChartView1.ChartElement.TitleElement.TextAlignment };
radGraphics.DrawString(this.radChartView1.Title, (RectangleF)typeof(RadChartView).GetMethod("GetTitleDrawRectangle", BindingFlags.Instance | BindingFlags.NonPublic).Invoke(this.radChartView1, miParams), this.radChartView1.ChartElement.TitleElement.Font,
this.radChartView1.ChartElement.TitleElement.ForeColor, this.radChartView1.ChartElement.TitleElement.TextParams.CreateStringFormat(), this.radChartView1.ChartElement.TitleElement.TextOrientation, this.radChartView1.ChartElement.TitleElement.FlipText);
}
this.radChartView1.View.Layout(chartRect);
IChartRenderer renderer = (IChartRenderer)typeof(ChartArea).GetProperty("Renderer", BindingFlags.Instance | BindingFlags.NonPublic).GetValue(this.radChartView1.Area);//
renderer.Draw(graphics);
if (imageFormat == ImageFormat.Emf ||
imageFormat == ImageFormat.Wmf)
{
Metafile metafile = new Metafile(fs, graphics.GetHdc());
using (Graphics g = Graphics.FromImage(metafile))
{
g.DrawImage(bmp, Point.Empty);
}
metafile.Dispose();
graphics.ReleaseHdc();
}
else
{
bmp.Save(fs, imageFormat);
}
this.radChartView1.View.Layout();
}
How to reproduce: explicitly set the border color of the series
Workaround:
public partial class Form1 : Form
{
private RangeSelectorViewElement chartElement;
public Form1()
{
InitializeComponent();
LineSeries lineSeries = new LineSeries();
lineSeries.Name = "Line";
lineSeries.BorderColor = Color.Green;
lineSeries.DataPoints.Add(new CategoricalDataPoint(20, "Jan"));
lineSeries.DataPoints.Add(new CategoricalDataPoint(22, "Apr"));
lineSeries.DataPoints.Add(new CategoricalDataPoint(12, "Jul"));
lineSeries.DataPoints.Add(new CategoricalDataPoint(19, "Oct"));
this.radChartView1.Series.Add(lineSeries);
this.chartElement = this.radRangeSelector1.RangeSelectorElement.AssociatedElement as RangeSelectorViewElement;
this.chartElement.SeriesInitialized += ChartElement_SeriesInitialized;
}
private void ChartElement_SeriesInitialized(object sender, SeriesInitializedEventArgs e)
{
if (e.Series.Name == "Line")
{
e.Series.BorderColor = this.radChartView1.Series.Where(s => s.Name == "Line").First().BorderColor;
}
}
}
Workaround:
Sub New()
InitializeComponent()
AddHandler Me.RadChartView1.CreateRenderer, AddressOf CreateRenderer
AddHandler Me.RadChartView1.LabelFormatting, AddressOf LabelFormatting
Dim barSeries As New Telerik.WinControls.UI.BarSeries("Performance", "RepresentativeName")
barSeries.ShowLabels = True
barSeries.DataPoints.Add(New CategoricalDataPoint(177, "Harley"))
barSeries.DataPoints.Add(New CategoricalDataPoint(128, "White"))
barSeries.DataPoints.Add(New CategoricalDataPoint(143, "Smith"))
barSeries.DataPoints.Add(New CategoricalDataPoint(111, "Jones"))
barSeries.DataPoints.Add(New CategoricalDataPoint(118, "Marshall"))
Me.RadChartView1.Series.Add(barSeries)
Dim barSeries2 As New Telerik.WinControls.UI.BarSeries("Performance", "RepresentativeName")
barSeries2.ShowLabels = True
barSeries2.DataPoints.Add(New CategoricalDataPoint(153, "Harley"))
barSeries2.DataPoints.Add(New CategoricalDataPoint(141, "White"))
barSeries2.DataPoints.Add(New CategoricalDataPoint(130, "Smith"))
barSeries2.DataPoints.Add(New CategoricalDataPoint(88, "Jones"))
barSeries2.DataPoints.Add(New CategoricalDataPoint(109, "Marshall"))
Me.RadChartView1.Series.Add(barSeries2)
End Sub
Private Sub LabelFormatting(sender As Object, e As Telerik.WinControls.UI.ChartViewLabelFormattingEventArgs)
Dim dataPoint As CategoricalDataPoint = TryCast(e.LabelElement.DataPoint, CategoricalDataPoint)
e.LabelElement.Text = "Value: " & Environment.NewLine & dataPoint.Value
e.LabelElement.BackColor = Color.Yellow
End Sub
Private Sub CreateRenderer(sender As Object, e As ChartViewCreateRendererEventArgs)
e.Renderer = New CustomCartesianRenderer(TryCast(e.Area, CartesianArea))
End Sub
Public Class CustomCartesianRenderer
Inherits CartesianRenderer
Public Sub New(area As CartesianArea)
MyBase.New(area)
End Sub
Protected Overrides Sub Initialize()
MyBase.Initialize()
For i As Integer = 0 To Me.DrawParts.Count - 1
Dim labelPart As BarLabelElementDrawPart = TryCast(Me.DrawParts(i), BarLabelElementDrawPart)
If labelPart IsNot Nothing Then
Me.DrawParts(i) = New CustomLabelElementDrawPart(DirectCast(labelPart.Element, BarSeries), Me)
End If
Next
End Sub
End Class
Public Class CustomLabelElementDrawPart
Inherits BarLabelElementDrawPart
Public Sub New(owner As ChartSeries, renderer As IChartRenderer)
MyBase.New(owner, renderer)
End Sub
Public Overrides Sub Draw()
For Each dataPointElement As DataPointElement In Me.Element.Children
For Each label As LabelElement In dataPointElement.Children
label.ForeColor = Color.Transparent
Next
Next
MyBase.Draw()
Dim graphics As Graphics = TryCast(Me.Renderer.Surface, Graphics)
Dim radGraphics As New RadGdiGraphics(graphics)
Dim slot As RadRect
Dim rect As Rectangle
Dim stringFormat As New StringFormat()
stringFormat.Alignment = StringAlignment.Center
stringFormat.LineAlignment = StringAlignment.Center
For Each dataPointElement As DataPointElement In Me.Element.Children
For Each label As LabelElement In dataPointElement.Children
label.ForeColor = Color.Transparent
slot = label.GetLayoutSlot()
slot = AdjustLayoutSlot(slot, label.DataPointElement)
rect = ChartRenderer.ToRectangle(slot)
Using brush As Brush = New SolidBrush(Color.Red)
Dim drawLocation As New PointF()
drawLocation.X = rect.X + label.Padding.Left
drawLocation.Y = rect.Y + label.Padding.Top
graphics.DrawString(label.Text, label.Font, brush, rect, stringFormat)
End Using
Next
Next
End Sub
End Class
To reproduce:
public RadForm1()
{
InitializeComponent();
Random rand = new Random();
LineSeries lineSeria = new LineSeries();
lineSeria.ValueMember = "WorkingHours";
lineSeria.CategoryMember = "Date";
lineSeria.ShowLabels = true;
lineSeria.PointSize = new System.Drawing.SizeF(10, 10);
lineSeria.BackColor = Color.Red;
LinearAxis verticalAxis2 = new LinearAxis();
verticalAxis2.AxisType = AxisType.Second;
verticalAxis2.HorizontalLocation = AxisHorizontalLocation.Right ;
lineSeria.VerticalAxis = verticalAxis2;
DataTable table = new DataTable();
table.Columns.Add("Value", typeof(double));
table.Columns.Add("Name", typeof(string));
table.Rows.Add(rand.Next(1, 20), "John");
table.Rows.Add(rand.Next(1, 20), "Adam");
table.Rows.Add(rand.Next(1, 20), "Peter");
table.Rows.Add(rand.Next(1, 20), "Sam");
table.Rows.Add(rand.Next(1, 20), "Paul");
lineSeria.ValueMember = "Value";
lineSeria.CategoryMember = "Name";
lineSeria.DataSource = table;
BarSeries barSeria = new BarSeries();
barSeria.ValueMember = "Finished";
barSeria.CategoryMember = "Date";
barSeria.ShowLabels = true;
barSeria.BackColor = Color.Aqua;
LinearAxis verticalAxis1 = new LinearAxis();
verticalAxis1.AxisType = AxisType.Second;
verticalAxis1.HorizontalLocation = AxisHorizontalLocation.Left;
barSeria.VerticalAxis = verticalAxis1;
table = new DataTable();
table.Columns.Add("Value", typeof(double));
table.Columns.Add("Name", typeof(string));
table.Rows.Add(rand.Next(1, 20), "John");
table.Rows.Add(rand.Next(1, 20), "Adam");
table.Rows.Add(rand.Next(1, 20), "Peter");
table.Rows.Add(rand.Next(1, 20), "Sam");
table.Rows.Add(rand.Next(1, 20), "Paul");
barSeria.ValueMember = "Value";
barSeria.CategoryMember = "Name";
barSeria.DataSource = table;
this.radChartView1.ChartElement.View.Series.Add(lineSeria);
this.radChartView1.ChartElement.View.Series.Add(barSeria);
this.radChartView1.ChartElement.Margin = new System.Windows.Forms.Padding(10);
(this.radChartView1.ChartElement.View.Axes[0] as CategoricalAxis).LabelFitMode =
Telerik.Charting.AxisLabelFitMode.MultiLine;
SmartLabelsController c = new SmartLabelsController();
this.radChartView1.ChartElement.View.Controllers.Add(c);
}
Workaround: change the strategy:
SmartLabelsController c = new SmartLabelsController();
c.Strategy = new FourPositionsLabelsStrategy();
this.radChartView1.ChartElement.View.Controllers.Add(c);
Workaround: use a custom ChartPanZoomController
public class MyChartPanZoomController : ChartPanZoomController
{
protected override ActionResult OnMouseWheel(MouseEventArgs e)
{
if (!(this.Area is CartesianArea))
{
return base.OnMouseWheel(e);
}
if ((Control.ModifierKeys & Keys.Control) == Keys.Control)
{
IChartView chartView = this.Area.View;
double zoomWidth = chartView.ZoomWidth;
if (this.PanZoomMode == ChartPanZoomMode.Horizontal || this.PanZoomMode == ChartPanZoomMode.Both)
{
zoomWidth += ((double)e.Delta / 1200d);
}
double zoomHeight = chartView.ZoomHeight;
if (this.PanZoomMode == ChartPanZoomMode.Vertical || this.PanZoomMode == ChartPanZoomMode.Both)
{
zoomHeight += ((double)e.Delta / 1200d);
}
zoomWidth = this.ClampValue(zoomWidth, 1d, 100d);
zoomHeight = this.ClampValue(zoomHeight, 1d, 100d);
double virtualHorizontalPosition = e.X - this.Area.AreaModel.LayoutSlot.X - chartView.PlotOriginX;
double plotAreaVirtualWidth = this.Area.AreaModel.LayoutSlot.Width * chartView.ZoomWidth;
double relativeHorizontalPosition = virtualHorizontalPosition / plotAreaVirtualWidth;
double newPlotAreaVirtualWidth = this.Area.AreaModel.LayoutSlot.Width * zoomWidth;
double newPanOffsetX = (newPlotAreaVirtualWidth * relativeHorizontalPosition) - (e.X - this.Area.AreaModel.LayoutSlot.X);
newPanOffsetX = this.ClampValue(newPanOffsetX, 0, this.Area.AreaModel.LayoutSlot.Width * (zoomWidth - 1d));
double virtualVerticalPosition = e.Y - this.Area.AreaModel.LayoutSlot.Y - chartView.PlotOriginY;
double plotAreaVirtualHeight = this.Area.AreaModel.LayoutSlot.Height * chartView.ZoomHeight;
double relativeVerticalPosition = virtualVerticalPosition / plotAreaVirtualHeight;
double newPlotAreaVirtualHeight = this.Area.AreaModel.LayoutSlot.Height * zoomHeight;
double newPanOffsetY = (newPlotAreaVirtualHeight * relativeVerticalPosition) - (e.Y - this.Area.AreaModel.LayoutSlot.Y);
newPanOffsetY = this.ClampValue(newPanOffsetY, 0, this.Area.AreaModel.LayoutSlot.Height * (zoomHeight - 1d));
this.Area.View.Zoom(zoomWidth, zoomHeight);
this.Area.View.Pan(-newPanOffsetX, -newPanOffsetY);
}
return Controller.Empty;
}
private double ClampValue(double value, double minValue, double maxValue)
{
return Math.Max(minValue, Math.Min(value, maxValue));
}
}
To reproduce:
- Add polar series and selection controller
Workaround:
private void RadChartView1_CreateRenderer(object sender, ChartViewCreateRendererEventArgs e)
{
e.Renderer = new MyPolarRenderer(e.Area as PolarArea);
}
class MyPolarRenderer : PolarRenderer
{
public MyPolarRenderer(PolarArea area) : base(area)
{ }
public override DataPoint HitTest(int x, int y)
{
for (int i = 0; i < this.DrawParts.Count; i++)
{
DataPoint dataPoint = this.DrawParts[i].HitTest(new Point(x, y));
if (dataPoint != null)
{
return dataPoint;
}
}
return base.HitTest(x, y);
}
protected override void Initialize()
{
base.Initialize();
for (int i = 0; i < this.DrawParts.Count; i++)
{
PolarPointSeriesDrawPart linePart = this.DrawParts[i] as PolarPointSeriesDrawPart;
if (linePart != null)
{
this.DrawParts[i] = new MyDrawpart((PolarPointSeries)linePart.Element, this);
}
}
}
}
class MyDrawpart : PolarPointSeriesDrawPart
{
public MyDrawpart(PolarPointSeries series, IChartRenderer renderer) : base(series, renderer)
{ }
public override DataPoint HitTest(Point location)
{
if (this.Element.PointSize.Width == 0 || this.Element.PointSize.Height == 0)
{
return null;
}
for (int i = 0; i < this.Element.DataPoints.Count; i++)
{
RadRect slot = this.Element.DataPoints[i].LayoutSlot;
float pointHalfWidth = this.Element.PointSize.Width / 2;
float pointHalfHeight = this.Element.PointSize.Height / 2;
RectangleF dataPointBounds = new RectangleF((float)(slot.X - pointHalfWidth), (float)(slot.Y - pointHalfHeight), this.Element.PointSize.Width, this.Element.PointSize.Height);
if (dataPointBounds.Contains(location.X, location.Y))
{
return this.Element.DataPoints[i];
}
}
return base.HitTest(location);
}
}
The new functionality should allow a display similar to the one in the WPF pie series: http://docs.telerik.com/devtools/wpf/controls/radchartview/features/labels/smart-labels#using-smart-labels-in-radpiechart
To reproduce:
private void RadChartView1_LabelFormatting(object sender, ChartViewLabelFormattingEventArgs e)
{
var dataPoint = e.LabelElement.DataPoint as CategoricalDataPoint;
if (dataPoint != null)
{
e.LabelElement.IsVisible = false;
}
}
Workaround:
private void RadChartView1_LabelFormatting(object sender, ChartViewLabelFormattingEventArgs e)
{
var dataPoint = e.LabelElement.DataPoint as CategoricalDataPoint;
if (dataPoint != null)
{
e.LabelElement.Text = "";
}
}
How to reproduce:
Public Class Form1
Sub New()
InitializeComponent()
Dim barSeries As New Telerik.WinControls.UI.BarSeries("Performance", "RepresentativeName")
barSeries.Name = "Q1"
barSeries.LegendTitle = "LegendTitle1" + vbCrLf + "LegendTitle1" + vbCrLf + "LegendTitle1" + vbCrLf + "LegendTitle1" + vbCrLf + "Leg
barSeries.DataPoints.Add(New CategoricalDataPoint(177, "Harley"))
barSeries.DataPoints.Add(New CategoricalDataPoint(128, "White"))
barSeries.DataPoints.Add(New CategoricalDataPoint(143, "Smith"))
barSeries.DataPoints.Add(New CategoricalDataPoint(111, "Jones"))
barSeries.DataPoints.Add(New CategoricalDataPoint(118, "Marshall"))
Me.RadChartView1.Series.Add(barSeries)
Dim barSeries2 As New Telerik.WinControls.UI.BarSeries("Performance", "RepresentativeName")
barSeries2.Name = "Q2"
barSeries2.LegendTitle = "LegendTitle1" + vbCrLf + "LegendTitle1" + vbCrLf + "LegendTitle1" + vbCrLf + "LegendTitle1" + vbCrLf + "Le
barSeries2.DataPoints.Add(New CategoricalDataPoint(153, "Harley"))
barSeries2.DataPoints.Add(New CategoricalDataPoint(141, "White"))
barSeries2.DataPoints.Add(New CategoricalDataPoint(130, "Smith"))
barSeries2.DataPoints.Add(New CategoricalDataPoint(88, "Jones"))
barSeries2.DataPoints.Add(New CategoricalDataPoint(109, "Marshall"))
Me.RadChartView1.Series.Add(barSeries2)
Me.RadChartView1.ShowTitle = True
Me.RadChartView1.ShowLegend = True
Me.RadChartView1.LegendTitle = "Legend"
Me.RadChartView1.Size = New Size(500, 150)
Me.RadChartView1.ShowPanZoom = True
'Me.SetupLineSeries()
End Sub
Private Sub RadButton1_Click(sender As Object, e As EventArgs) Handles RadButton1.Click
Dim filePath As String = "..\..\exprotedChart2.png"
Me.RadChartView1.ExportToImage(filePath, New Size(1000, 800), System.Drawing.Imaging.ImageFormat.Png)
End Sub
End Class
Workaround: increase the size of the chart
Public Class Form1
Sub New()
InitializeComponent()
Dim barSeries As New Telerik.WinControls.UI.BarSeries("Performance", "RepresentativeName")
barSeries.Name = "Q1"
barSeries.LegendTitle = "LegendTitle1" + vbCrLf + "LegendTitle1" + vbCrLf + "LegendTitle1" + vbCrLf + "LegendTitle1" + vbCrLf + "LegendTitle1" + vbCrLf + "LegendTitle1"
barSeries.DataPoints.Add(New CategoricalDataPoint(177, "Harley"))
barSeries.DataPoints.Add(New CategoricalDataPoint(128, "White"))
barSeries.DataPoints.Add(New CategoricalDataPoint(143, "Smith"))
barSeries.DataPoints.Add(New CategoricalDataPoint(111, "Jones"))
barSeries.DataPoints.Add(New CategoricalDataPoint(118, "Marshall"))
Me.RadChartView1.Series.Add(barSeries)
Dim barSeries2 As New Telerik.WinControls.UI.BarSeries("Performance", "RepresentativeName")
barSeries2.Name = "Q2"
barSeries2.LegendTitle = "LegendTitle1" + vbCrLf + "LegendTitle1" + vbCrLf + "LegendTitle1" + vbCrLf + "LegendTitle1" + vbCrLf + "LegendTitle1" + vbCrLf + "LegendTitle1"
barSeries2.DataPoints.Add(New CategoricalDataPoint(153, "Harley"))
barSeries2.DataPoints.Add(New CategoricalDataPoint(141, "White"))
barSeries2.DataPoints.Add(New CategoricalDataPoint(130, "Smith"))
barSeries2.DataPoints.Add(New CategoricalDataPoint(88, "Jones"))
barSeries2.DataPoints.Add(New CategoricalDataPoint(109, "Marshall"))
Me.RadChartView1.Series.Add(barSeries2)
Me.RadChartView1.ShowTitle = True
Me.RadChartView1.ShowLegend = True
Me.RadChartView1.LegendTitle = "Legend"
Me.RadChartView1.Size = New Size(500, 150)
Me.RadChartView1.ShowPanZoom = True
'Me.SetupLineSeries()
End Sub
Dim size As Size
Private Sub RadButton1_Click(sender As Object, e As EventArgs) Handles RadButton1.Click
AddHandler Me.RadChartView1.SizeChanged, AddressOf RadChartView1_SizeChanged
size = Me.RadChartView1.Size
Me.RadChartView1.Size = New Size(1000, 800)
End Sub
Private Sub RadChartView1_SizeChanged(sender As Object, e As EventArgs)
RemoveHandler Me.RadChartView1.SizeChanged, AddressOf RadChartView1_SizeChanged
Dim filePath As String = "..\..\exprotedChart2.png"
Me.RadChartView1.ExportToImage(filePath, Me.RadChartView1.Size, System.Drawing.Imaging.ImageFormat.Png)
Me.RadChartView1.Size = size
End Sub
End Class
How to reproduce:
Public Class Form1
Sub New()
InitializeComponent()
Me.SetupLineSeries()
End Sub
Private Sub SetupLineSeries()
Dim splitContainer = New RadSplitContainer()
splitContainer.SplitPanels.Add(New SplitPanel())
splitContainer.SplitPanels.Add(New SplitPanel())
splitContainer.SplitPanels(0).Controls.Add(Me.RadChartView1)
Me.RadChartView1.Dock = DockStyle.Fill
splitContainer.Orientation = Orientation.Horizontal
splitContainer.Parent = Me
splitContainer.Dock = DockStyle.Fill
Dim lineSeries As New Telerik.WinControls.UI.LineSeries("2014")
lineSeries.LegendTitle = "2014"
lineSeries.ShowLabels = True
lineSeries.DataPoints.Add(New CategoricalDataPoint(8000, "Jan"))
lineSeries.DataPoints.Add(New CategoricalDataPoint(8700, "Feb"))
lineSeries.DataPoints.Add(New CategoricalDataPoint(8500, "Mar"))
lineSeries.DataPoints.Add(New CategoricalDataPoint(8900, "Apr"))
lineSeries.DataPoints.Add(New CategoricalDataPoint(8400, "May"))
lineSeries.DataPoints.Add(New CategoricalDataPoint(8300, "Jun"))
lineSeries.DataPoints.Add(New CategoricalDataPoint(8600, "Jul"))
lineSeries.DataPoints.Add(New CategoricalDataPoint(8800, "Aug"))
lineSeries.DataPoints.Add(New CategoricalDataPoint(8400, "Sep"))
lineSeries.DataPoints.Add(New CategoricalDataPoint(8300, "Oct"))
lineSeries.DataPoints.Add(New CategoricalDataPoint(8500, "Nov"))
lineSeries.DataPoints.Add(New CategoricalDataPoint(8100, "Dec"))
Me.RadChartView1.Series.Add(lineSeries)
Dim lineSeries2 As New Telerik.WinControls.UI.LineSeries("2015")
lineSeries2.LegendTitle = "2015"
lineSeries2.ShowLabels = True
lineSeries2.DataPoints.Add(New CategoricalDataPoint(5800, "Jan"))
lineSeries2.DataPoints.Add(New CategoricalDataPoint(5900, "Feb"))
lineSeries2.DataPoints.Add(New CategoricalDataPoint(5700, "Mar"))
lineSeries2.DataPoints.Add(New CategoricalDataPoint(5500, "Apr"))
lineSeries2.DataPoints.Add(New CategoricalDataPoint(5300, "May"))
lineSeries2.DataPoints.Add(New CategoricalDataPoint(5600, "Jun"))
lineSeries2.DataPoints.Add(New CategoricalDataPoint(5800, "Jul"))
lineSeries2.DataPoints.Add(New CategoricalDataPoint(5800, "Aug"))
lineSeries2.DataPoints.Add(New CategoricalDataPoint(5900, "Sep"))
lineSeries2.DataPoints.Add(New CategoricalDataPoint(6100, "Oct"))
lineSeries2.DataPoints.Add(New CategoricalDataPoint(7900, "Nov"))
lineSeries2.DataPoints.Add(New CategoricalDataPoint(7600, "Dec"))
Me.RadChartView1.Series.Add(lineSeries2)
Me.RadChartView1.ShowSmartLabels = True
Me.RadChartView1.ShowTitle = True
Me.RadChartView1.ShowLegend = True
Me.RadChartView1.LegendTitle = "Legend"
Dim verticalAxis As LinearAxis = RadChartView1.Axes.[Get](Of LinearAxis)(1)
verticalAxis.Minimum = 4000
verticalAxis.Maximum = 20000
verticalAxis.MajorStep = 4000
Me.RadChartView1.ShowPanZoom = True
End Sub
End Class