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;
}
}
}
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();
date = DateTime.Now;
}
int dayCounter;
Random rnd = new Random();
DateTime date;
Timer timer = new Timer();
protected override void OnLoad(EventArgs e)
{
base.OnLoad(e);
LineSeries lineSeria = new LineSeries();
DateTimeContinuousAxis continuousAxis = new DateTimeContinuousAxis();
continuousAxis.LabelFormat = "{0:dd}";
lineSeria.HorizontalAxis = continuousAxis;
radChartView1.Series.Add(lineSeria);
for (int i = 0; i < 500; i++)
{
radChartView1.Series[0].DataPoints.Add(new CategoricalDataPoint(rnd.Next(1000), date.AddDays(dayCounter++)));
}
timer.Tick += timer_Tick;
timer.Interval = 200;
timer.Start();
}
void timer_Tick(object sender, EventArgs e)
{
foreach (CategoricalDataPoint point in radChartView1.Series[0].DataPoints)
{
// point.Value = rnd.Next(1000);
point.Category = date.AddDays(dayCounter++);
}
}
Workaround:
void timer_Tick(object sender, EventArgs e)
{
DateTimeContinuousAxis continuousAxis = ((LineSeries)radChartView1.Series[0]).HorizontalAxis as DateTimeContinuousAxis;
HybridDictionary hashSet = typeof(Axis).GetField("hashSet", BindingFlags.NonPublic | BindingFlags.Instance).GetValue(continuousAxis) as HybridDictionary;
hashSet.Clear();
}
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);
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
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
To reproduce: - Set the position like this: this.radChartView1.ChartElement.LegendElement.Alignment = ContentAlignment.TopCenter; - Export the chart to an image, the position is not the same as in the application. Workaround: - Set the position manually: this.radChartView1.ChartElement.LegendPosition = LegendPosition.Float; this.radChartView1.ChartElement.LegendOffset = new Point(400, 0);
To reproduce:
radChartView1.AreaType = ChartAreaType.Pie;
PieSeries series = new PieSeries();
series.DataPoints.Add(new PieDataPoint(50, "Germany"));
series.Children.LastOrDefault().BackColor = Color.Red;
series.Children.LastOrDefault().BorderColor = Color.Green;
series.DataPoints.Add(new PieDataPoint(70, "United States"));
series.Children.LastOrDefault().BackColor = Color.Green;
series.Children.LastOrDefault().BorderColor = Color.Red;
series.DataPoints.Add(new PieDataPoint(40, "France"));
series.Children.LastOrDefault().BackColor = Color.Blue;
series.Children.LastOrDefault().BorderColor = Color.Yellow;
series.DataPoints.Add(new PieDataPoint(25, "United Kingdom"));
series.Children.LastOrDefault().BackColor = Color.Yellow;
series.Children.LastOrDefault().BorderColor = Color.Blue;
this.radChartView1.Series.Add(series);
radChartView1.ShowLegend = true;
Workaround:
for (int i = 0; i < radChartView1.ChartElement.LegendElement.Items.Count; i++)
{
PieDataPoint point = ((PieDataPoint)series.DataPoints[i]);
radChartView1.ChartElement.LegendElement.Items[i].Element.BackColor = Color.Red;
radChartView1.ChartElement.LegendElement.Items[i].Element.BorderColor = Color.Yellow;
}
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);
}
}
To reproduce:
- Set the palette from the default context menu.
- Try to get the palette name.
Workaround:
class MyChartDataPointElementController : ChartDataPointElementController
{
protected override RadContextMenu CreatePaletteMenu()
{
//return base.CreatePaletteMenu();
RadContextMenu menu = new RadContextMenu();
RadChartLocalizationProvider localizationProvider = RadChartLocalizationProvider.CurrentProvider;
RadMenuItem paletteItem = new RadMenuItem(localizationProvider.GetLocalizedString(RadChartStringId.Palette));
menu.Items.Add(paletteItem);
RadMenuItem item = new RadMenuItem(localizationProvider.GetLocalizedString(RadChartStringId.PaletteArctic));
item.Click += new System.EventHandler(item_Click);
paletteItem.Items.Add(item);
item = new RadMenuItem(localizationProvider.GetLocalizedString(RadChartStringId.PaletteAutumn));
item.Click += new System.EventHandler(item_Click);
paletteItem.Items.Add(item);
item = new RadMenuItem(localizationProvider.GetLocalizedString(RadChartStringId.PaletteCold));
item.Click += new System.EventHandler(item_Click);
paletteItem.Items.Add(item);
item = new RadMenuItem(localizationProvider.GetLocalizedString(RadChartStringId.PaletteFlower));
item.Click += new System.EventHandler(item_Click);
paletteItem.Items.Add(item);
item = new RadMenuItem(localizationProvider.GetLocalizedString(RadChartStringId.PaletteForest));
item.Click += new System.EventHandler(item_Click);
paletteItem.Items.Add(item);
item = new RadMenuItem(localizationProvider.GetLocalizedString(RadChartStringId.PaletteGrayscale));
item.Click += new System.EventHandler(item_Click);
paletteItem.Items.Add(item);
item = new RadMenuItem(localizationProvider.GetLocalizedString(RadChartStringId.PaletteGround));
item.Click += new System.EventHandler(item_Click);
paletteItem.Items.Add(item);
item = new RadMenuItem(localizationProvider.GetLocalizedString(RadChartStringId.PaletteLilac));
item.Click += new System.EventHandler(item_Click);
paletteItem.Items.Add(item);
item = new RadMenuItem(localizationProvider.GetLocalizedString(RadChartStringId.PaletteMetro));
item.Click += new System.EventHandler(item_Click);
paletteItem.Items.Add(item);
item = new RadMenuItem(localizationProvider.GetLocalizedString(RadChartStringId.PaletteNatural));
item.Click += new System.EventHandler(item_Click);
paletteItem.Items.Add(item);
item = new RadMenuItem(localizationProvider.GetLocalizedString(RadChartStringId.PalettePastel));
item.Click += new System.EventHandler(item_Click);
paletteItem.Items.Add(item);
item = new RadMenuItem(localizationProvider.GetLocalizedString(RadChartStringId.PaletteRainbow));
item.Click += new System.EventHandler(item_Click);
paletteItem.Items.Add(item);
item = new RadMenuItem(localizationProvider.GetLocalizedString(RadChartStringId.PaletteSpring));
item.Click += new System.EventHandler(item_Click);
paletteItem.Items.Add(item);
item = new RadMenuItem(localizationProvider.GetLocalizedString(RadChartStringId.PaletteSummer));
item.Click += new System.EventHandler(item_Click);
paletteItem.Items.Add(item);
item = new RadMenuItem(localizationProvider.GetLocalizedString(RadChartStringId.PaletteWarm));
item.Click += new System.EventHandler(item_Click);
paletteItem.Items.Add(item);
item = new RadMenuItem(localizationProvider.GetLocalizedString(RadChartStringId.PaletteWindows8));
item.Click += new System.EventHandler(item_Click);
paletteItem.Items.Add(item);
item = new RadMenuItem(localizationProvider.GetLocalizedString(RadChartStringId.PaletteSun));
item.Click += new System.EventHandler(item_Click);
paletteItem.Items.Add(item);
return menu;
}
void item_Click(object sender, System.EventArgs e)
{
RadMenuItem item = sender as RadMenuItem;
if (item != null)
{
this.Area.View.Palette = ChartPalette.FromKnownPalette(item.Text);
this.Area.View.Palette.Name = item.Text;
}
}
}
Change the controller like this:
radChartView1.Controllers.Add(new MyChartDataPointElementController());
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 = "";
}
}
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.
The Line Series cannot be clicked/selected and cannot be used in DrillDown scenarios.
To reproduce: - Add at least two series and zoom the chart so the point from one of the series are visible only - Move the TrackBall - The Track ball is not shown for some of the points.
To reproduce: populate RadChartView with data and try to export it to Emf
using (MemoryStream ms = new MemoryStream())
{
this.radChartView1.ExportToImage(ms, this.radChartView1.Size, System.Drawing.Imaging.ImageFormat.Emf);
}
Workaround: use some of the other ImageFormats.
How to reproduce:
Dim table As New DataTable()
table.Columns.Add("Name", GetType(String))
table.Columns.Add("X", GetType(Integer))
For i As Integer = 0 To 99
table.Rows.Add($"User {i}", i)
Next
Dim series As New BarSeries()
series.DataSource = table
series.CategoryMember = "Name"
series.ValueMember = "X"
RadChartView1.Series.Add(series)
CType(RadChartView1.Area, CartesianArea).Orientation = Orientation.Horizontal
Dim panZoomController As New ChartPanZoomController()
panZoomController.PanZoomMode = ChartPanZoomMode.Vertical
RadChartView1.Controllers.Add(panZoomController)
RadChartView1.Zoom(1, 8)
Workaround: create a custom ChartPanZoomController
Dim panZoomController As New MyChartPanZoomController()
panZoomController.PanZoomMode = ChartPanZoomMode.Vertical
RadChartView1.Controllers.Add(panZoomController)
Public Class MyChartPanZoomController
Inherits ChartPanZoomController
Protected Overrides Function OnMouseMove(e As MouseEventArgs) As ActionResult
Dim cartesianArea As CartesianArea = TryCast(Me.Area, CartesianArea)
If cartesianArea Is Nothing Then
Return MyBase.OnMouseMove(e)
End If
Dim panPoint As Point? = Me.GetType().BaseType.GetField("panPoint", BindingFlags.Instance Or BindingFlags.NonPublic).GetValue(Me)
If e.Button = MouseButtons.Left AndAlso panPoint.HasValue Then
Dim offsetX As Double = Me.GetType().BaseType.GetField("offsetX", BindingFlags.Instance Or BindingFlags.NonPublic).GetValue(Me)
Dim currentOffsetX As Double = offsetX
Dim defaultAxis As Axis = If(cartesianArea.Orientation = Orientation.Horizontal,
Me.Area.GetType().GetMethod("GetDefaultFirstAxis", BindingFlags.Instance Or BindingFlags.NonPublic).Invoke(Me.Area, New Object() {}),
Me.Area.GetType().GetMethod("GetDefaultSecondAxis", BindingFlags.Instance Or BindingFlags.NonPublic).Invoke(Me.Area, New Object() {}))
If Me.PanZoomMode = ChartPanZoomMode.Horizontal OrElse Me.PanZoomMode = ChartPanZoomMode.Both Then
currentOffsetX += (panPoint.Value.X - e.Location.X) * -1
If currentOffsetX > 0 Then
currentOffsetX = 0
End If
If currentOffsetX < defaultAxis.Model.LayoutSlot.Width * (DirectCast(cartesianArea.View, IChartView).ZoomWidth - 1) Then
currentOffsetX = -defaultAxis.Model.LayoutSlot.Width * (DirectCast(cartesianArea.View, IChartView).ZoomWidth - 1)
End If
End If
Dim offsetY As Double = Me.GetType().BaseType.GetField("offsetY", BindingFlags.Instance Or BindingFlags.NonPublic).GetValue(Me)
Dim currentOffsetY As Double = offsetY
If Me.PanZoomMode = ChartPanZoomMode.Vertical OrElse Me.PanZoomMode = ChartPanZoomMode.Both Then
currentOffsetY += (panPoint.Value.Y - e.Location.Y) * -1
If currentOffsetY > 0 Then
currentOffsetY = 0
End If
If currentOffsetY < -defaultAxis.Model.LayoutSlot.Height * (DirectCast(cartesianArea.View, IChartView).ZoomHeight - 1) Then
currentOffsetY = -defaultAxis.Model.LayoutSlot.Height * (DirectCast(cartesianArea.View, IChartView).ZoomHeight - 1)
End If
End If
cartesianArea.View.Pan(currentOffsetX, currentOffsetY)
End If
Return Controller.Empty
End Function
End Class
Use the attached project to reproduce. Workaround: Hide the panel after the form is shown.
The event should not be triggered when moving the mouse over the same data point, as we already asked for data for it. We can cache it and reuse it.
Introduce gantt like series as in RadChart: http://docs.telerik.com/devtools/winforms/chart/understanding-radchart-types/gantt-charts