SciChart WPF 2D Charts > ChartModifier API > Cursors, Tooltips and legends > SeriesValueModifier
SeriesValueModifier

The SeriesValueModifier displays the last series value (or latest series value in the viewport) as a marker on the YAxis. This modifier automatically creates one AxisMarkerAnnotation per RenderableSeries and places it at the series latest Y-Value.

Declaring a SeriesValueModifier in XAML

To declare a SeriesValueModifier, simply add it to the collection of ChartModifiers on the SciChartSurface:

Declaring a SeriesValueModifier
Copy Code
<!-- where xmlns:s="http://schemas.abtsoftware.co.uk/scichart" -->
<s:SciChartSurface>

   <!-- XAxis, YAxis, RenderableSeries omitted for brevity -->
  
   <s:SciChartSurface.ChartModifier>
      <s:ModifierGroup>
            <s:SeriesValueModifier/>
         </s:ModifierGroup>
   </s:SciChartSurface.ChartModifier>
</s:SciChartSurface>

Declaring a SeriesValueModifier in Code

Declaring a SeriesValueModifier
Copy Code
// XAxis, YAxis, RenderableSeries omitted for brevity
var sciChartSurface = new SciChartSurface();
sciChartSurface.ChartModifier = new ModifierGroup(
  new SeriesValueModifier());

Excluding a Series from the SeriesValueModifier

By default, all RenderableSeries are included in the SeriesValueModifier and will have an axis marker. You can exclude a series by setting the attached property SeriesValueModifier.IncludeSeries = false on the RenderableSeries.

Excluding a Series from the SeriesValueModifier
Copy Code
<!-- where xmlns:s="http://schemas.abtsoftware.co.uk/scichart" -->
<s:SciChartSurface>

   <!-- XAxis, YAxis, RenderableSeries omitted for brevity -->
  
   <s:SciChartSurface.RenderableSeries>
      <s:FastLineRenderableSeries s:SeriesValueModifier.IncludeSeries="False"/>
   </s:SciChartSurface.RenderableSeries>
  
   <s:SciChartSurface.ChartModifier>
      <s:ModifierGroup>
            <s:SeriesValueModifier/>
         </s:ModifierGroup>
   </s:SciChartSurface.ChartModifier>
</s:SciChartSurface>

Styling the SeriesValueModifier Axis Markers

To customize look of SeriesValueModifier, you could set any of the BorderBrush, Background, Foreground properties. Also you can define a Style and apply it to AxisMarkerStyle property:

Styling the SeriesValueModifier Axis Markers
Copy Code
<SeriesValueModifier.AxisMarkerStyle>
   <Style BasedOn="{StaticResource AxisMarkerAnnotationStyle}"
            TargetType="a:AxisMarkerAnnotation">
      <!--  Assumes data context is the RenderableSeries  -->
      <Setter Property="BorderBrush" Value="{Binding Background,
              RelativeSource={RelativeSource Self}}" />
      <Setter Property="Background" Value="{Binding Stroke, Converter={StaticResource
              ColorToBrushConverter}}" />
      <Setter Property="YAxisId" Value="{Binding YAxisId}" />
      <Setter Property="IsHidden" Value="{Binding
              Path=(c:SeriesValueModifier.IncludeSeries), Converter={StaticResource
              InvertBooleanConverter}}" />
   </Style>
</SeriesValueModifier.AxisMarkerStyle>

The Style is applied to the AxisMarkerAnnotation. You can also template the AxisMarkerAnnotation by following the guidelines in Templating the AxisMarkerAnnotation

Configuring AxisMarkers with SeriesInfoProvider API

SeriesValueModifier shows more than one AxisMarkers for some RenderableSeries types. These include:

However, it is possible to configure number of AxisMarkers via SeriesInfoProvider API for any RenderableSeries.

Using SeriesInfoProvider API

SeriesInfoProvider API is called by SeriesValueModifier. It allows to return custom SeriesInfo objects that contain result of a single hit-test operation on a RenderableSeries. Also, it can be used to add multiple DataColumnInfo objects to the SeriesInfo. The DataColumnInfo objects are used to configure AxisMarkers, so a number of AxisMarkers will correspond to number of DataColumnInfo objects provided.

For example, this is how a custom SeriesInfoProvider can be created for a FastCandlestickRenderableSeries:

Creating a custom SeriesInfoProvider for a FastCandlestickRenderableSeries
Copy Code
public class CustomSeriesInfoProvider : DefaultSeriesInfoProvider
{
   public override void OnAppendDataColumnInfo(SeriesInfo seriesInfo, HitTestInfo hitTestInfo)
   {
      if (seriesInfo.RenderableSeries is FastCandlestickRenderableSeries candleSeries)
      {
         var dataSeries = candleSeries.DataSeries as IOhlcDataSeries;

         seriesInfo.DataColumnInfo.Add(new DataColumnInfo(candleSeries)
         {
            DataColumnName = "Open",
            ColorSource = candleSeries.StrokeDown,
            LastDataValue = DataColumnInfo.GetLastDataValue(dataSeries?.OpenValues),
            HitTestValue = hitTestInfo.OpenValue
         });

         seriesInfo.DataColumnInfo.Add(new DataColumnInfo(candleSeries)
         {
            DataColumnName = "Close",
            ColorSource = candleSeries.StrokeUp,
            LastDataValue = DataColumnInfo.GetLastDataValue(dataSeries?.CloseValues),
            HitTestValue = hitTestInfo.CloseValue
         });
      }
   }
}

Here CustomSeriesInfoProvider creates two DataColumnInfo instances that contains info about Open and Close value of the last Candlestick. Applying this SeriesInfoProvider to a FastCandlestickRenderableSeries via the SeriesInfoProvider property will make SeriesValueModifier show two AxisMarkers for this series instead of just one:

 

 

See Also