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.