Axis标签在DateTimeAxis中的定位

Chr*_*ris 11 c# wpf charts xaml data-visualization

目前我有一个日期时间轴,其中日期与点一致,无论如何都要让这个日期出现在中心,例如条形图上.

图表Img

<Style x:Key="DateTimeAxisLabelStyle2" TargetType="chartingToolkit:DateTimeAxisLabel">
    <Setter Property="DaysIntervalStringFormat" Value="{}{0:dd-MMM}" />
    <Setter Property="HoursIntervalStringFormat" Value="{}{0:hh:mm tt}" />
    <!--<Setter Property="RenderTransformOrigin" Value="1,0.5" />
    <Setter Property="RenderTransform">
       <Setter.Value>
          <RotateTransform Angle="-45" />
       </Setter.Value>
    </Setter>-->
   <!--<Setter Property="Margin" Value="30,0,-10,0" />-->
</Style>

<chartingToolkit:DateTimeAxis IntervalType="Days"
                               Interval="1"
                               Minimum="{Binding StartDate}"
                               Maximum="{Binding EndDate}"
                               Orientation="X"
                               VerticalContentAlignment="Center"
                               Title="Day"
                               AxisLabelStyle="{StaticResource DateTimeAxisLabelStyle2}" />
Run Code Online (Sandbox Code Playgroud)

任何帮助将不胜感激.

Dru*_*eby 0

以下是我使用WPF Toolkit Source所做的操作以供参考。

我创建了一个派生自 DateTimeAxis 的自定义类,然后覆盖“GetPlotAreaCooperative”方法。DateTimeAxis.Render() 使用相同的“DateTime”值列表调用该方法三次,一次用于 MajorTickmarks,一次用于 MinorTickmarks,一次用于日期标签。列表中没有小标记,因此该方法实际上只被调用两次。我只是保留已评估值的列表,并假设如果它在列表中,则它已经完成了刻度线,并且现在正在执行标签。

class CustomDateTimeAxis : DateTimeAxis
{
    List<object> _valueList = new List<object>();
    UnitValue prevBaseValue;

    protected override UnitValue GetPlotAreaCoordinate(object value, Range<IComparable> currentRange, double length)
    {

        _valueList.Add(value);
        UnitValue baseValue = base.GetPlotAreaCoordinate(value, currentRange, length);


        int valueCount = _valueList.Count((x) => x.Equals(value));
        if (valueCount == 2)                       
            return new UnitValue(baseValue.Value + 27, baseValue.Unit);

        prevBaseValue = baseValue;
        return baseValue;

    }

    protected override void Render(Size availableSize)
    {
        base.Render(availableSize);
        _valueList.Clear();
    }

}
Run Code Online (Sandbox Code Playgroud)

“27”只是我尝试过的一个数字。您可能想尝试一下,看看什么最适合您。

return new UnitValue(baseValue.Value + 27, baseValue.Unit);
Run Code Online (Sandbox Code Playgroud)