I use dynamic numer of SplineSeries in my chart (so I use ChartSeriesProvider) and I want to display Chart Legend in the right upper corner of chart. But ChartSeriesProvider doesn't work with LegendSettings. An empty chart area is displayed. Please see 'EmptyChartArea.PNG' file attached. I did the following XAML markup:
<UserControl x:Class="DeviceReading.Views.AutomaticGainControlView" xmlns:telerik="http://schemas.telerik.com/2008/xaml/presentation" xmlns:prism="http://prismlibrary.com/" xmlns:local="clr-namespace:DeviceReading" xmlns:views="clr-namespace:DeviceReading.Views" prism:ViewModelLocator.AutoWireViewModel="True"> <UserControl.Resources> <!--Series colors--> <telerik:ChartPalette x:Key="customPalette"> <telerik:ChartPalette.SeriesEntries> <telerik:PaletteEntryCollection SeriesFamily="Line"> <telerik:PaletteEntry Fill="Blue" Stroke="Blue"/> <telerik:PaletteEntry Fill="Crimson" Stroke="Crimson"/> <telerik:PaletteEntry Fill="Green" Stroke="Green"/> <telerik:PaletteEntry Fill="DarkOrange" Stroke="DarkOrange"/> <telerik:PaletteEntry Fill="Purple" Stroke="Purple"/> <telerik:PaletteEntry Fill="DarkTurquoise" Stroke="DarkTurquoise"/> <telerik:PaletteEntry Fill="SaddleBrown" Stroke="SaddleBrown"/> <telerik:PaletteEntry Fill="SlateBlue" Stroke="SlateBlue"/> </telerik:PaletteEntryCollection> </telerik:ChartPalette.SeriesEntries> </telerik:ChartPalette> <local:StringToLegendSettingsConverter x:Key="StringToLegendSettingsConverter"/> </UserControl.Resources><telerik:RadCartesianChart Visibility="{Binding IsAbsoluteSplineChartVisible}" Palette="{StaticResource customPalette}"> <!--Turn scrollbars off--> <telerik:RadCartesianChart.Resources> <Style TargetType="telerik:PanZoomBar"> <Setter Property="Visibility" Value="Collapsed"/> </Style> </telerik:RadCartesianChart.Resources> <!-- X-axis --> <telerik:RadCartesianChart.HorizontalAxis> <telerik:DateTimeContinuousAxis MajorStepUnit="Second" LabelInterval="5" LabelFormat="hh:mm:ss" FontFamily="Segoe UI" PlotMode="OnTicks" TickOrigin="{Binding AlignmentDate}"/> </telerik:RadCartesianChart.HorizontalAxis> <!-- Y-axis --> <telerik:RadCartesianChart.VerticalAxis> <telerik:LinearAxis FontFamily="Segoe UI" Title="Децибелы [Дб]" /> </telerik:RadCartesianChart.VerticalAxis> <!--Coordinate grid--> <telerik:RadCartesianChart.Grid> <telerik:CartesianChartGrid MajorLinesVisibility="XY" MajorXLineDashArray="3,4" MajorYLineDashArray="3,4"/> </telerik:RadCartesianChart.Grid> <!--Series Provider used--> <telerik:RadCartesianChart.SeriesProvider> <telerik:ChartSeriesProvider Source="{Binding SeriesData}"> <telerik:ChartSeriesProvider.SeriesDescriptors> <telerik:CategoricalSeriesDescriptor CategoryPath="Category" ValuePath="Value" ItemsSourcePath="ChartPoints"> <telerik:CategoricalSeriesDescriptor.TypeConverter> <local:SeriesTypeConverter/> </telerik:CategoricalSeriesDescriptor.TypeConverter> <!--USE StringToLegendSettingsConverter--> <telerik:CategoricalSeriesDescriptor.Style> <Style TargetType="telerik:SplineSeries"> <Setter Property="LegendSettings" Value="{Binding SeriesName, Converter={StaticResource StringToLegendSettingsConverter}}"/> </Style> </telerik:CategoricalSeriesDescriptor.Style> </telerik:CategoricalSeriesDescriptor> </telerik:ChartSeriesProvider.SeriesDescriptors> </telerik:ChartSeriesProvider> </telerik:RadCartesianChart.SeriesProvider> <!--Zooming and Panning--> <telerik:RadCartesianChart.Behaviors> <telerik:ChartPanAndZoomBehavior DragMode="Pan" ZoomMode="Both" PanMode="Both"/> </telerik:RadCartesianChart.Behaviors></telerik:RadCartesianChart></UserControl>Below is StringToLegendSettingsConverter class:
public class StringToLegendSettingsConverter : IValueConverter{ public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return new SeriesLegendSettings { Title = "" + value }; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); }}Below is SeriesModel class (with Rusian remarks).
public class SeriesModel{ #region Constructors /// <summary> /// Создаёт экземпляр SeriesModel по умолчанию. /// </summary> public SeriesModel() { } /// <summary> /// Создаёт экземпляр SeriesModel по заданным параметрам /// </summary> /// <param name="chartPoints">Тип серии (вид графика).</param> /// <param name="seriesType">Коллекция точек, представляющая серию (кривую графика).</param> public SeriesModel(RadObservableCollection<ChartPoint> chartPoints, string seriesName, string seriesType = "Spline") { this.ChartPoints = chartPoints; this.SeriesName = seriesName; this.SeriesType = seriesType; } #endregion #region Properties /// <summary> /// Тип серии (вид графика). Т.е. состоит ли график кривой из отрезков, просто соединяющих точки (LineChart), /// либо места, в которых отрезки соединяются с точками, имеют закруглённую форму (SplineCahrt). /// </summary> public string SeriesType { get; set; } /// <summary> /// Имя серии. Например, "1-й луч", "2-й луч" и т.д. /// </summary> public string SeriesName { get; set; } /// <summary> /// Коллекция точек, представляющая серию (кривую графика). /// </summary> public RadObservableCollection<ChartPoint> ChartPoints { get; set; } #endregion}Below is using SeriesModel Instance in 'AutomaticGainControlViewModel' class (ViewModel of 'AutomaticGainControl' chart) constructor for asigning to SeriesName property (with Rusian remarks):
. . . . . . . . . . . . . . .// Создать и начать заполнять коллекцию точек для графиков кривых абсолютных значений.this.SeriesData = new RadObservableCollection<SeriesModel>();// Добавить точку для графика кривой коэффициента усиления на первом луче в прямом направлении.series = new SeriesModel();series.SeriesType = "Spline";series.SeriesName = "P1AB";series.ChartPoints = new RadObservableCollection<ChartPoint>();automaticGainControl = this.Data[0].Value;series.ChartPoints.Add(new ChartPoint(new DateTime(this._currentDate.Ticks), automaticGainControl));this.SeriesData.Add(series);// Добавить точку для графика кривой коэффициента усиления на первом луче в обратном направлении.series = new SeriesModel();series.SeriesType = "Spline";series.SeriesName = "P1BA";series.ChartPoints = new RadObservableCollection<ChartPoint>();automaticGainControl = this.Data[1].Value;series.ChartPoints.Add(new ChartPoint(new DateTime(this._currentDate.Ticks), automaticGainControl));this.SeriesData.Add(series);// Добавить точку для графика кривой коэффициента усиления на втором луче в прямом направлении.series = new SeriesModel();series.SeriesType = "Spline";series.SeriesName = "P2AB";series.ChartPoints = new RadObservableCollection<ChartPoint>();automaticGainControl = this.Data[2].Value;series.ChartPoints.Add(new ChartPoint(new DateTime(this._currentDate.Ticks), automaticGainControl));this.SeriesData.Add(series);// Добавить точку для графика кривой коэффициента усиления на втором луче в обратном направлении.series = new SeriesModel();series.SeriesType = "Spline";series.SeriesName = "P2BA";series.ChartPoints = new RadObservableCollection<ChartPoint>();automaticGainControl = (ushort)this.Data[3].Value;series.ChartPoints.Add(new ChartPoint(new DateTime(this._currentDate.Ticks), automaticGainControl));this.SeriesData.Add(series);. . . . . . . . . . . . . .And, just in case, I bring a 'SeriesTypeConverter' converter class source code here:
public class SeriesTypeConverter : IValueConverter{ public object Convert(object value, Type targetType, object parameter, CultureInfo culture) { SeriesModel seriesItem = value as SeriesModel; if (seriesItem.SeriesType == "Spline") { return typeof(SplineSeries); } else { return typeof(LineSeries); } } public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture) { throw new NotImplementedException(); }}What have I done wrong in my program that I have the empty chart. How to correct the error. Thank you very much in advance.
