To reproduce: - Add line series with large point size and null points. - Hover a near a point which is close to null point (the line break). Workaround: public class MyChartTooltipController : ChartTooltipController { protected override ActionResult OnMouseMove(MouseEventArgs e) { for (int i = 0; i < this.Area.Series.Count; i++) { DataPoint point = this.Area.Series[i].HitTest(e.X, e.Y); DataPoint hoveredPoint = typeof(ChartTooltipController).GetField("hoveredPoint", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(this) as DataPoint; ToolTip toolTip = typeof(ChartTooltipController).GetField("toolTip", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(this) as ToolTip; if (point != null && hoveredPoint != point) { hoveredPoint = point; var result = typeof(CategoricalDataPoint).GetMethod("GetTooltipValue", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).Invoke(hoveredPoint, null); if (result == null) { return new ChartRefreshResult(); } } } return base.OnMouseMove(e); } }
To reproduce - Add step-line series with two data points. Workaround: public class CustomCartesianRenderer : CartesianRenderer { public CustomCartesianRenderer(CartesianArea area) : base(area) { } protected override void Initialize() { base.Initialize(); for (int i = 0; i < this.DrawParts.Count; i++) { SteplineDrawPart linePart = this.DrawParts[i] as SteplineDrawPart; if (linePart != null) { this.DrawParts[i] = new CustomDrawPart((SteplineSeries)linePart.Element, this); } } } } public class CustomDrawPart : SteplineDrawPart { public CustomDrawPart(LineSeriesBase series, IChartRenderer renderer) : base(series, renderer) { } protected override System.Drawing.Drawing2D.GraphicsPath GetLinePaths(PointF[] points) { //return base.GetLinePaths(points); GraphicsPath path = new GraphicsPath(); if (points.Length > 1) { if (this.Element is LineSeries && ((LineSeries)this.Element).Spline) { path.AddCurve(points, ((LineSeries)this.Element).SplineTension); } else { bool isVertical = this.Element.View.GetArea<CartesianArea>().Orientation == System.Windows.Forms.Orientation.Vertical; for (int i = 1; i < points.Length; i++) { PointF x = points[i - 1]; PointF y = points[i]; if (isVertical) { path.AddLine(x.X, x.Y, y.X, x.Y); path.AddLine(y.X, x.Y, y.X, y.Y); } else { path.AddLine(x.X, x.Y, x.X, y.Y); path.AddLine(x.X, y.Y, y.X, y.Y); } } } } else { return null; } return path; } } //change like this void radChartView1_CreateRenderer(object sender, ChartViewCreateRendererEventArgs e) { e.Renderer = new CustomCartesianRenderer((CartesianArea)e.Area); }
To reproduce: Enable the smart labels and export the chart using custom size: this.radChartView1.ExportToImage(@"C:\df.png", new Size(1100,1100), System.Drawing.Imaging.ImageFormat.Png); Workaround: class MyPieRenderer : PieRenderer { public MyPieRenderer(PieArea area) : base(area) { } protected override void Initialize() { base.Initialize(); var area = this.View; SmartLabelsController smartController = null; for (int i = 0; i < area.View.Controllers.Count; i++) { smartController = area.View.Controllers[i] as SmartLabelsController; if (smartController != null) { RadRect viewport = area.View.Viewport; viewport.X -= area.View.Margin.Left; viewport.Y -= area.View.Margin.Top; viewport.Width += area.View.Margin.Horizontal; viewport.Height += area.View.Margin.Vertical; Rectangle plotArea = new Rectangle((int)viewport.X, (int)viewport.Y, (int)viewport.Width, (int)viewport.Height); smartController.CalculateLabelsPositions(area.View.Series, plotArea); break; } } } } // change like this void radChartView1_CreateRenderer(object sender, ChartViewCreateRendererEventArgs e) { e.Renderer = new MyPieRenderer((PieArea)e.Area); }
To reproduce: protected override void OnLoad(EventArgs e) { base.OnLoad(e); radChartView1 = new RadChartView(); radChartView1.Parent = this; this.radChartView1.AreaType = ChartAreaType.Pie; PieSeries series = new PieSeries(); series.DataPoints.Add(new PieDataPoint(50, "Germany")); series.DataPoints.Add(new PieDataPoint(70, "United States")); series.DataPoints.Add(new PieDataPoint(40, "France")); series.DataPoints.Add(new PieDataPoint(25, "United Kingdom")); series.ShowLabels = true; this.radChartView1.Series.Add(series); (series.Children[0] as PiePointElement).RadiusAspectRatio = 1.2f; } Workaround: protected override void OnLoad(EventArgs e) { base.OnLoad(e); radChartView1 = new RadChartView(); radChartView1.Parent = this; this.radChartView1.AreaType = ChartAreaType.Pie; PieSeries series = new PieSeries(); series.DataPoints.Add(new PieDataPoint(50, "Germany")); series.DataPoints.Add(new PieDataPoint(70, "United States")); series.DataPoints.Add(new PieDataPoint(40, "France")); series.DataPoints.Add(new PieDataPoint(25, "United Kingdom")); series.ShowLabels = true; this.radChartView1.Series.Add(series); (series.Children[0] as PiePointElement).RadiusAspectRatio = 1.2f; this.radChartView1.CreateRenderer += new ChartViewCreateRendererEventHandler(radChartView1_CreateRenderer); } void radChartView1_CreateRenderer(object sender, ChartViewCreateRendererEventArgs e) { e.Renderer = new CustomPieRenderer(e.Area as PieArea); } public class CustomPieRenderer : PieRenderer { public CustomPieRenderer(PieArea area) : base(area) { } protected override void Initialize() { base.Initialize(); for (int i = 0; i < this.DrawParts.Count; i++) { PieSeriesDrawPart piePart = this.DrawParts[i] as PieSeriesDrawPart; if (piePart != null) { this.DrawParts[i] = new CustomPieSeriesDrawPart((PieSeries)piePart.Element, this); } } } } class CustomPieSeriesDrawPart : PieSeriesDrawPart { public CustomPieSeriesDrawPart(PieSeries series, IChartRenderer renderer) : base(series, renderer) { } public override void DrawSeriesParts() { //base.DrawSeriesParts(); PieSeriesModel model = this.Element.Model as PieSeriesModel; float diameter = CalculateDiameter(); if (diameter > 0) { DrawPieSegments(model, diameter); } } private float CalculateDiameter() { PieSeriesModel model = this.Element.Model as PieSeriesModel; double diameter = Math.Min((float)model.LayoutSlot.Width, (float)model.LayoutSlot.Height) * ((PieSeries)Element).RadiusFactor; return (float)diameter; } private void DrawPieSegments(PieSeriesModel model, float diameter) { Graphics gr = ((PieRenderer)this.Renderer).Graphics; RadGdiGraphics radGraphics = new RadGdiGraphics(gr); for (int i = 0; i < model.DataPoints.Count; i++) { PiePointElement childElement = (PiePointElement)this.Element.Children[i]; PieDataPoint piePoint = (PieDataPoint)childElement.DataPoint; float finalDiameter = diameter * childElement.RadiusAspectRatio; GraphicsPath path = ConstructGraphicsPath(piePoint, model.LayoutSlot, finalDiameter); UpdatePointPaths(piePoint, path); System.Drawing.RectangleF rect = GetPieSectionRect(piePoint, model.LayoutSlot, finalDiameter); childElement.GradientAngle = (float)(piePoint.StartAngle + piePoint.SweepAngle / 2); FillPrimitiveImpl fill = new FillPrimitiveImpl(childElement, null); fill.PaintFill(radGraphics, path, rect); BorderPrimitiveImpl border = new BorderPrimitiveImpl(childElement, null); border.PaintBorder(radGraphics, null, path, rect); } } protected System.Drawing.RectangleF GetPieSectionRect(PieDataPoint point, RadRect modelLayoutSlot, float diameter) { System.Drawing.RectangleF result; float x = (float)(modelLayoutSlot.X + (modelLayoutSlot.Width - diameter) / 2); float y = (float)(modelLayoutSlot.Y + (modelLayoutSlot.Height - diameter) / 2); result = new System.Drawing.RectangleF(x, y, Math.Max(diameter, 1f), Math.Max(diameter, 1f)); if (point.OffsetFromCenter > 0) { System.Drawing.PointF offset = GetOffset(point.StartAngle + (point.SweepAngle / 2), (diameter / 2) * (point.OffsetFromCenter)); result.X += offset.X; result.Y += offset.Y; } return result; } private System.Drawing.PointF GetOffset(double angle, double radius) { double angleInRad = angle * RadMath.DegToRadFactor; double x = (Math.Cos(angleInRad) * radius); double y = (Math.Sin(angleInRad) * radius); return new System.Drawing.PointF((float)x, (float)y); } }
How to reproduce: create a drill down chart with different area types on the different levels. The issue seems to be related to some series not implementing the ILegendInfoProvider interface. Workaround: A similar result as having a drill-down chart with series having different area types can be achieved manually using the ChartSelectionController. Please check the attached project and video file.
To reproduce: public RadForm1() { InitializeComponent(); LineSeries lineSeries = new LineSeries(); lineSeries.DataPoints.Add(new CategoricalDataPoint(40, "Jan")); lineSeries.DataPoints.Add(new CategoricalDataPoint(22, "Apr")); lineSeries.DataPoints.Add(new CategoricalDataPoint(12, "Jul")); lineSeries.DataPoints.Add(new CategoricalDataPoint(19, "Oct")); lineSeries.ShowLabels = true; this.radChartView1.Series.Add(lineSeries); LineSeries lineSeries2 = new LineSeries(); lineSeries2.DataPoints.Add(new CategoricalDataPoint(13, "Jan")); lineSeries2.DataPoints.Add(new CategoricalDataPoint(15, "Apr")); lineSeries2.DataPoints.Add(new CategoricalDataPoint(17, "Jul")); lineSeries2.DataPoints.Add(new CategoricalDataPoint(22, "Oct")); lineSeries2.ShowLabels = true; this.radChartView1.Series.Add(lineSeries2); ((CartesianArea)this.radChartView1.View.Area).ShowGrid = true; int i = 1; foreach (DataPointElement dpe in this.radChartView1.Series[0].Children) { dpe.IsVisible = false; AnimatedPropertySetting setting = new AnimatedPropertySetting(); setting.StartValue = false; setting.EndValue = true; setting.Property = UIChartElement.IsVisibleProperty; setting.ApplyDelay = 40 + 40 * i; setting.NumFrames = 2; setting.ApplyValue(dpe); i++; }i = 1; foreach (DataPointElement dpe in this.radChartView1.Series[1].Children) { dpe.IsVisible = false; AnimatedPropertySetting setting = new AnimatedPropertySetting(); setting.StartValue = false; setting.EndValue = true; setting.Property = UIChartElement.IsVisibleProperty; setting.ApplyDelay = 60 + 60 * i; setting.NumFrames = 2; setting.ApplyValue(dpe); i++; } } Workaround: Perform the animation in the Shown event.
To reproduce: - Enable the Trackball. - Add 2 series to the chart. - Remove and add back the first one. - Move the mouse over the chart. Workaround: class MyChartTrackballController : ChartTrackballController { protected override string GetPointText(DataPoint point) { if (point.Presenter != null) { return base.GetPointText(point); } else { CategoricalDataPoint p = point as CategoricalDataPoint; if (p!= null) { return p.Value.ToString(); } } return ""; } }
To reproduce: public Form1() { InitializeComponent(); Random rand = new Random(); for (int i = 0; i < 3; i++) { LineSeries lineSeries = new LineSeries(); lineSeries.DataPoints.Add(new CategoricalDataPoint(rand.Next(-50, 50), "Jan")); lineSeries.DataPoints.Add(new CategoricalDataPoint(rand.Next(-50, 50), "Apr")); lineSeries.DataPoints.Add(new CategoricalDataPoint(rand.Next(-50, 50), "Jul")); lineSeries.DataPoints.Add(new CategoricalDataPoint(rand.Next(-50, 50), "Oct")); this.radChartView1.Series.Add(lineSeries); } this.radChartView1.ShowLegend = true; this.radChartView1.ChartElement.LegendPosition = LegendPosition.Bottom; ((LineSeries)this.radChartView1.Series[0]).LegendTitle = "S&P 500"; ((LineSeries)this.radChartView1.Series[1]).LegendTitle = "MSCI Emerging Markets TR Index"; ((LineSeries)this.radChartView1.Series[2]).LegendTitle = "Great ETF"; } Workaround: Font f = new Font("Times New Roman", 10f, FontStyle.Regular); private void Form1_Load(object sender, EventArgs e) { foreach (LegendItemElement item in this.radChartView1.ChartElement.LegendElement.StackElement.Children) { item.Font = f; } }
public Form1() { InitializeComponent(); AreaSeries areaSeries = new AreaSeries(); areaSeries.DataPoints.Add(new CategoricalDataPoint(13, "Jan")); areaSeries.DataPoints.Add(new CategoricalDataPoint(20, "Apr")); areaSeries.DataPoints.Add(new CategoricalDataPoint(15, "Jul")); areaSeries.DataPoints.Add(new CategoricalDataPoint(16, "Oct")); this.radChartView1.Series.Add(areaSeries); AreaSeries areaSeries2 = new AreaSeries(); areaSeries2.DataPoints.Add(new CategoricalDataPoint(15, "Jan")); areaSeries2.DataPoints.Add(new CategoricalDataPoint(25, "Apr")); areaSeries2.DataPoints.Add(new CategoricalDataPoint(27, "Jul")); areaSeries2.DataPoints.Add(new CategoricalDataPoint(18, "Oct")); this.radChartView1.Series.Add(areaSeries2); this.radChartView1.ShowTrackBall = true; this.radChartView1.Series.First().IsVisible = false; } Please refer to the attached sample video. Workaround 1: remove the series instead of hiding it. Workaround 2: private void radChartView1_CreateRenderer(object sender, ChartViewCreateRendererEventArgs e) { e.Renderer = new CustomCartesianRenderer(e.Area as CartesianArea); } public class CustomCartesianRenderer : CartesianRenderer { public CustomCartesianRenderer(CartesianArea area) : base(area) { } private int renderPass = 0; public override void Draw(object context) { if (renderPass < 2) { if (this.Area.View.Owner.Control.Site == null) { for (int i = 0; i < this.Area.Series.Count; i++) { if (this.Area.Series[i].IsVisible && !this.Area.Series[i].Model.IsArrangeValid) { this.Area.View.Layout(); renderPass++; return; } } } } FieldInfo fi = typeof(ChartRenderer).GetField("surface", BindingFlags.Instance | BindingFlags.NonPublic); if (context != null) { fi.SetValue(this, context); } Initialize(); for (int i = 0; i < this.DrawParts.Count; i++) { this.DrawParts[i].Draw(); } } }
To reproduce: public Form1() { InitializeComponent(); this.radChartView1.AreaType = ChartAreaType.Polar; Random rand = new Random(); for (int i = 0; i < 80; i++) { RadarLineSeries s = new RadarLineSeries(); s.ShowLabels = true; for (int j = 0; j < 8; j++) { s.DataPoints.Add(new CategoricalDataPoint(rand.Next(1, 100), "X" + j)); } this.radChartView1.Series.Add(s); } this.radChartView1.ShowSmartLabels = true; }
To reproduce: public Form1() { InitializeComponent(); this.radChartView1.ShowPanZoom = true; Random rand = new Random(); this.radChartView1.AreaType = ChartAreaType.Polar; for (int i = 0; i < 85; i++) { RadarLineSeries radarPointSeries = new RadarLineSeries(); for (int j = 0; j < 8; j++) { radarPointSeries.DataPoints.Add(new CategoricalDataPoint(rand.Next(1, 100), "X" + j)); } this.radChartView1.Series.Add(radarPointSeries); } } Workaround: set the ShowPanZoom property after the chart is populated with data.
To reproduce: this.radChartView1.AreaType = Telerik.WinControls.UI.ChartAreaType.Polar; RadarLineSeries series = new RadarLineSeries(new SizeF(8f, 8f)); series.DataPoints.Add(new CategoricalDataPoint(0.0, "Coding")); series.LegendTitle = String.Format("Coding"); series.BorderWidth = 2; radChartView1.Series.Add(series); series.PolarAxis.Minimum = 0d; series.PolarAxis.Maximum = 0.0; series.PolarAxis.TickLength = 4;
Workaround: public Form1() { InitializeComponent(); StringFormat.GenericTypographic.Alignment = StringAlignment.Near; }
To reproduce: Add horizontal bar series bind to the following data: myList = new BindingList<MyCustomObject>(); myList.Add(new MyCustomObject(1, "Outdoor")); myList.Add(new MyCustomObject(0, "Hardware")); myList.Add(new MyCustomObject(0, "Tools")); myList.Add(new MyCustomObject(1, "Books")); myList.Add(new MyCustomObject(1, "Appliances")); Workaround: LinearAxis verticalAxis = new LinearAxis(); verticalAxis.LabelFitMode = AxisLabelFitMode.Rotate; verticalAxis.LabelRotationAngle = 0.1; verticalAxis.Minimum = 0; verticalAxis.Maximum = 2;
To reproduce: LineSeries dailySeries = new LineSeries(); dailySeries.BorderColor = Color.DarkBlue; dailySeries.BorderWidth = 1; dailySeries.PointSize = new SizeF(5, 5); dailySeries.ShowLabels = true; for (int i = 0; i < 100; i++) { dailySeries.DataPoints.Add(new CategoricalDataPoint(rnd.Next(100), DateTime.Now.AddMonths(i)) { Label = "old" }); } DateTimeCategoricalAxis categoricalAxis = new DateTimeCategoricalAxis(); categoricalAxis.DateTimeComponent = DateTimeComponent.Date; categoricalAxis.MajorTickInterval = 10; categoricalAxis.PlotMode = AxisPlotMode.OnTicks; categoricalAxis.LabelFormat = "{0:MMM-yy}"; categoricalAxis.ClipLabels = false; categoricalAxis.LastLabelVisibility = AxisLastLabelVisibility.Visible; CartesianArea area = this.radChart.GetArea<CartesianArea>(); area.ShowGrid = true; CartesianGrid grid = area.GetGrid<CartesianGrid>(); grid.DrawHorizontalFills = true; grid.BorderDashStyle = System.Drawing.Drawing2D.DashStyle.DashDot; //First assign the axis to the VerticalAxis property and then add the series to the chart dailySeries.HorizontalAxis = categoricalAxis; this.radChart.Series.Add(dailySeries); Workaround: Use different value for the MajorTickInterval.
Steps to reproduce: 1. Add a chart to a form. 2. Add and remove series continuously. 3. The memory of the project will only raise and memory will not be freed. WORKAROUND*: Clear the data points of the series that is/are removed from the chart. *Although this will significantly reduce the memory consumption it will not eliminate the memory leak. There will still be a small portion of retained memory.
To reproduce: BarSeries barSeries = new BarSeries("Performance", "RepresentativeName"); barSeries.Name = "Q1"; barSeries.DataPoints.Add(new CategoricalDataPoint(1000000, "Harley Harley Harley Harley Smith")); barSeries.DataPoints.Add(new CategoricalDataPoint(2000000, "White")); barSeries.DataPoints.Add(new CategoricalDataPoint(3000000, "Smith Smith Smith Smith Smith mith Smith Harley")); barSeries.DataPoints.Add(new CategoricalDataPoint(4000000, "Jones")); barSeries.DataPoints.Add(new CategoricalDataPoint(5000000, "Marshall")); this.radChartView1.Series.Add(barSeries); this.radChartView1.GetArea<CartesianArea>().Orientation = Orientation.Horizontal; LinearAxis horizontalAxis = radChartView1.Axes.Get<LinearAxis>(1); horizontalAxis.ClipLabels = false; Workaround: void radChartView1_CreateRenderer(object sender, ChartViewCreateRendererEventArgs e) { e.Renderer = new CustomCartesianRenderer(e.Area as CartesianArea); } // public class CustomCartesianRenderer : CartesianRenderer { public CustomCartesianRenderer(CartesianArea area) : base(area) { } protected override void Initialize() { base.Initialize(); for (int i = 0; i < this.DrawParts.Count; i++) { AxisLabelDrawPart part = this.DrawParts[i] as AxisLabelDrawPart; if (part != null) { this.DrawParts[i] = new CustomDrawPart((Axis)part.Element, this); } } } } public class CustomDrawPart : AxisLabelDrawPart { public CustomDrawPart(Axis axis, IChartRenderer renderer) :base( axis, renderer) {} protected override void DrawNoneAndMultiLineLabelElements() { //base.DrawNoneAndMultiLineLabelElements(); if (!this.Element.ShowLabels || this.Element.Children.Count == 0) { return; } Graphics graphics = this.Renderer.Surface as Graphics; RadGdiGraphics radGraphics = new RadGdiGraphics(graphics); RadRect plotRect = this.Element.Model.LayoutSlot; plotRect.X += this.ViewportOffsetX; plotRect.Y += this.ViewportOffsetY; CartesianAxis axis = this.Element as CartesianAxis; SizeF offset = SizeF.Empty; if (axis != null) { offset = ((CartesianRenderer)this.Renderer).GetAxisOffset(axis); if (axis.ClipLabels) { SizeF size = graphics.MeasureString("W", this.Element.Font); RectangleF clipRect = ChartRenderer.ToRectangleF(plotRect); clipRect.Y -= size.Height / 2f; clipRect.Height += size.Height; clipRect.X -= size.Width; clipRect.Width += size.Width * 2f; clipRect.Offset(offset.ToPointF()); graphics.SetClip(clipRect); } } using (SolidBrush brush = new SolidBrush(Color.Empty)) { foreach (UIChartElement element in this.Element.Children) { AxisLabelElement labelElement = element as AxisLabelElement; if (labelElement == null || !labelElement.IsVisible) { continue; } string text = labelElement.Text; if (string.IsNullOrEmpty(text)) { continue; } labelElement.OnAxisLabelFormatting(new ChartAxisLabelFormattingEventArgs(labelElement)); RadRect slot = labelElement.GetLayoutSlot(); if (this.Element is CartesianAxis) { slot.X += this.ViewportOffsetX; slot.Y += this.ViewportOffsetY; } if (this.Element.AxisType == AxisType.First) { slot.X += (float)((IChartView)this.Element.View).PlotOriginX; } else { slot.Y += (float)((IChartView)this.Element.View).PlotOriginY; } RectangleF rect = ChartRenderer.ToRectangleF(slot); if (axis != null) { rect.Offset(offset.ToPointF()); } if (labelElement.BackgroundShape != null) { labelElement.BackgroundShape.Paint((Graphics)radGraphics.UnderlayGraphics, rect); } FillPrimitiveImpl fill = new FillPrimitiveImpl(labelElement, null); fill.PaintFill(radGraphics, 0, Size.Empty, rect); BorderPrimitiveImpl border = new BorderPrimitiveImpl(labelElement, null); border.PaintBorder(radGraphics, 0, Size.Empty, rect); if (brush.Color != labelElement.ForeColor) { brush.Color = labelElement.ForeColor; } StringFormat sf = StringFormat.GenericTypographic; sf.Alignment = StringAlignment.Near; graphics.DrawString(text, labelElement.Font, Brushes.Black, rect.Location, sf); } } } }
Workaround: public class CustomLassoZoomController : LassoZoomController { protected override ActionResult OnMouseUp(MouseEventArgs e) { if (this.MouseDownLocation == Point.Empty || this.MouseMoveLocation == Point.Empty) { return Controller.Empty; } return base.OnMouseUp(e); } } public Form1() { InitializeComponent(); BarSeries barSeries = new BarSeries("Performance", "RepresentativeName"); barSeries.Name = "Q1"; 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")); this.radChartView1.Series.Add(barSeries); BarSeries barSeries2 = new BarSeries("Performance", "RepresentativeName"); barSeries2.Name = "Q2"; 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")); this.radChartView1.Series.Add(barSeries2); CustomLassoZoomController lassoZoomController = new CustomLassoZoomController(); radChartView1.Controllers.Add(lassoZoomController); }
If one adds a RadChartView to a form and set its Visibility property to false or creates a chart in memory and tries to export it to an image the result would not look as expected.
Steps to reproduce: 1. Add a chart with bar series to a form 2. Set the border of the bars to be larger than 2px You will see that bars are taller/longer with the border applied than they are without a border.