2015-09-07 5 views
11

Im Moment habe ich eine Datumszeitachse, wo das Datum in Linie mit den Punkten ist, gibt es trotzdem, um dieses Datum in der Mitte wie in einem Balkendiagramm erscheinen zu lassen.Positionierung der Achsenbeschriftung in einer DateTimeAxis

Chart 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}" /> 

Jede Hilfe wäre sehr dankbar.

+0

Ihre Frage nicht klar genug ist, möchten Sie in der X zeigen Achse das Datum zwischen jeweils zwei aufeinanderfolgenden Punkten (zusätzlich zu den Daten in jedem Diagrammpunkt)? – Usama

+0

Ich möchte nur das Etikett auf der X-Achse entlang (in die Mitte) verschieben, dies kann durch die Verwendung von Rändern erreicht werden, aber die X-Achse ist dynamisch, so dass hart codierte Ränder ist ein No-Go. Alle anderen Daten in der Grafik sollten statisch bleiben – Chris

+0

Es gibt keinen Code hinter den Charts itemsSource wird über eine sp eingebracht, was erwarten Sie zu sehen? – Chris

Antwort

0

Hier ist, was ich mit der WPF Toolkit Source als Referenz getan habe.

Ich habe eine benutzerdefinierte Klasse erstellt, die von DateTimeAxis abgeleitet ist, und dann die Methode "GetPlotAreaCoordinate" überschrieben. DateTimeAxis.Render() ruft diese Methode dreimal mit derselben Liste von "DateTime" -Werten auf, einmal für die MajorTickmarks, einmal für MinorTickmarks und einmal für die Datumsbezeichnung. Es gab keine kleinen Häkchen in der Liste, daher wurde die Methode nur zweimal aufgerufen. Ich behalte nur eine Liste der Werte, die ausgewertet wurden und nehme an, dass, wenn es in der Liste ist, es bereits die Häkchen gemacht hat und jetzt die Etiketten macht.

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(); 
    } 

} 

"27" ist nur eine Zahl, die ich ausprobierte. Vielleicht möchten Sie damit spielen, um zu sehen, was am besten für Sie funktioniert.

return new UnitValue(baseValue.Value + 27, baseValue.Unit); 
+0

Dies scheint nur die Pixellänge zu den Labels hinzuzufügen, was durch die Verwendung von im XAML erreicht werden kann. Gibt es trotzdem, um zu garantieren, dass der '27' Wert in der Mitte ist, unabhängig von der Größenänderung oder dem Datenkontext? – Chris

3

Hier ist, was ich habe:

XAML:

<Window.Resources> 
    <Style x:Key="DateTimeAxisLabelStyle1" TargetType="{x:Type chartingToolkit:DateTimeAxisLabel}"> 
     <Setter Property="DaysIntervalStringFormat" Value="{}{0:dd-MMM}"></Setter> 
     <Setter Property="RenderTransformOrigin" Value="0.80,0.20"></Setter> 
     <Setter Property="RenderTransform"> 
      <Setter.Value> 
       <RotateTransform Angle="-90"></RotateTransform> 
      </Setter.Value> 
     </Setter> 
    </Style> 
</Window.Resources> 
<Grid> 
    <chartingToolkit:Chart Margin="0" Title="Chart Title"> 
     <chartingToolkit:Chart.DataContext> 
      <local:MyDataCollection/> 
     </chartingToolkit:Chart.DataContext> 
     <chartingToolkit:Chart.Axes> 
      <chartingToolkit:DateTimeAxis Minimum="{Binding StartDate}" Maximum="{Binding EndDate}" Orientation="X" ShowGridLines="True" AxisLabelStyle="{DynamicResource DateTimeAxisLabelStyle1}"/> 
     </chartingToolkit:Chart.Axes> 
     <chartingToolkit:LineSeries DependentValuePath="Y" IndependentValuePath="X" ItemsSource="{Binding}"/> 
    </chartingToolkit:Chart> 
</Grid> 

Chart:

enter image description here

+0

Hallo, schätze die Antwort, aber das löst nicht das Problem, dass das Diagramm in der Größe geändert werden kann oder der Datenkontext viel größer sein kann. Siehe auch: [link] (https://gyazo.com/e5dd61efb2d74713876f05e878370aca) – Chris