Back to Devexpress

ITimeSpanMeasureUnitsCalculator.CalculateMeasureUnit(IEnumerable<Series>, Double, Int32, Double, Double, Double, Double) Method

wpf-devexpress-dot-xpf-dot-charts-dot-itimespanmeasureunitscalculator-dot-calculatemeasureunit-x28-ienumerable-series-double-int32-double-double-double-double-x29.md

latest8.2 KB
Original Source

ITimeSpanMeasureUnitsCalculator.CalculateMeasureUnit(IEnumerable<Series>, Double, Int32, Double, Double, Double, Double) Method

Calculates the date-time measurement unit that an axis should use for display.

Namespace : DevExpress.Xpf.Charts

Assembly : DevExpress.Xpf.Charts.v25.2.dll

NuGet Package : DevExpress.Wpf.Charts

Declaration

csharp
TimeSpanMeasureUnit CalculateMeasureUnit(
    IEnumerable<Series> series,
    double axisLength,
    int pixelsPerUnit,
    double visualMin,
    double visualMax,
    double wholeMin,
    double wholeMax
)
vb
Function CalculateMeasureUnit(
    series As IEnumerable(Of Series),
    axisLength As Double,
    pixelsPerUnit As Integer,
    visualMin As Double,
    visualMax As Double,
    wholeMin As Double,
    wholeMax As Double
) As TimeSpanMeasureUnit

Parameters

NameTypeDescription
seriesIEnumerable<Series>

All Series associated with the axis.

| | axisLength | Double |

The length of the axis’s visual range in pixels.

| | pixelsPerUnit | Int32 |

The minimum count of pixels that series require to draw their points correctly.

| | visualMin | Double |

The visual range’s minimum value in milliseconds.

| | visualMax | Double |

The visual range’s maximum value in milliseconds.

| | wholeMin | Double |

The whole range’s minimum value in milliseconds.

| | wholeMax | Double |

The whole range’s maximum value in milliseconds.

|

Returns

TypeDescription
TimeSpanMeasureUnit

The calculated measurement unit.

|

Remarks

Bars can overlap each other if the calculated measurement unit covers fewer pixels on the axis than the pixelPerUnit parameter specifies.

Example

The automatic time-span scale options allow you to create a measurement unit calculator to determine the current measurement unit if the predefined one does not fit your requirements. Create a class that implements the ITimeSpanMeasureUnitsCalculator interface and assign it to the AutomaticMeasureUnitsCalculator property to use a custom measurement units calculation algorithm:

xaml
<Window
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
        xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
        xmlns:local="clr-namespace:TimeSpanExample"
        xmlns:dxc="http://schemas.devexpress.com/winfx/2008/xaml/charts" 
        x:Class="TimeSpanExample.MainWindow"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Window.DataContext>
        <local:ChartViewModel/>
    </Window.DataContext>
    <Grid>
        <dxc:ChartControl>
            <dxc:XYDiagram2D>
                <dxc:XYDiagram2D.AxisX>
                    <dxc:AxisX2D>
                        <dxc:AxisX2D.TimeSpanScaleOptions>
                            <dxc:AutomaticTimeSpanScaleOptions AggregateFunction="Average">
                                <dxc:AutomaticTimeSpanScaleOptions.AutomaticMeasureUnitsCalculator>
                                    <local:CustomAutomaticTimeSpanMeasureUnitsCalculator/>
                                </dxc:AutomaticTimeSpanScaleOptions.AutomaticMeasureUnitsCalculator>
                            </dxc:AutomaticTimeSpanScaleOptions>
                        </dxc:AxisX2D.TimeSpanScaleOptions>
                    </dxc:AxisX2D>
                </dxc:XYDiagram2D.AxisX>
            </dxc:XYDiagram2D>
        </dxc:ChartControl>
    </Grid>
</Window>
csharp
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows;
using DevExpress.Xpf.Charts;

namespace TimeSpanExample {
    public class CustomAutomaticTimeSpanMeasureUnitsCalculator : ITimeSpanMeasureUnitsCalculator {
        public TimeSpanMeasureUnit CalculateMeasureUnit(IEnumerable<Series> series, 
            double axisLength, int pixelsPerUnit, 
            double visualMin, double visualMax, 
            double wholeMin, double wholeMax) {
            double rawMeasureUnit = (visualMax - visualMin) / axisLength * pixelsPerUnit;
            return PickTimeSpanMeasureUnit(rawMeasureUnit);
        }
        static int[] unitMultipliers = { 1, 1000, 60, 60, 24 };
        static TimeSpanMeasureUnit PickTimeSpanMeasureUnit(double milliseconds) {
            double valueStop = 1.0;
            for (int i = 0; i < unitMultipliers.Length; i++) {
                valueStop *= unitMultipliers[i];
                if (milliseconds <= valueStop)
                    return (TimeSpanMeasureUnit)i;
            }
            return TimeSpanMeasureUnit.Hour;
        }
    }
}
vb
Imports System
Imports System.Collections.Generic
Imports System.Linq
Imports System.Windows
Imports DevExpress.Xpf.Charts

Namespace TimeSpanExample
    Public Class CustomAutomaticTimeSpanMeasureUnitsCalculator
        Implements ITimeSpanMeasureUnitsCalculator

        Public Function CalculateMeasureUnit(ByVal series As IEnumerable(Of Series), ByVal axisLength As Double, ByVal pixelsPerUnit As Integer, ByVal visualMin As Double, ByVal visualMax As Double, ByVal wholeMin As Double, ByVal wholeMax As Double) As TimeSpanMeasureUnit Implements ITimeSpanMeasureUnitsCalculator.CalculateMeasureUnit
            Dim rawMeasureUnit As Double = (visualMax - visualMin) / axisLength * pixelsPerUnit
            Return PickTimeSpanMeasureUnit(rawMeasureUnit)
        End Function
        Private Shared unitMultipliers() As Integer = { 1, 1000, 60, 60, 24 }
        Private Shared Function PickTimeSpanMeasureUnit(ByVal milliseconds As Double) As TimeSpanMeasureUnit
            Dim valueStop As Double = 1.0
            For i As Integer = 0 To unitMultipliers.Length - 1
                valueStop *= unitMultipliers(i)
                If milliseconds <= valueStop Then
                    Return CType(i, TimeSpanMeasureUnit)
                End If
            Next i
            Return TimeSpanMeasureUnit.Hour
        End Function
    End Class
End Namespace

See Also

ITimeSpanMeasureUnitsCalculator Interface

ITimeSpanMeasureUnitsCalculator Members

DevExpress.Xpf.Charts Namespace