編集:追加されたコード
また、DateTimesは実際にはDatetimes(hh:mm:ss形式のsTrings)ではないため、代わりにStringsを使用し、TimeSpanを使用してtotalMinutesを取得することにしました。
<ObjectDataProvider x:Key="odpLbGrafiek" ObjectType="{x:Type myClasses:GrafiekBar}" MethodName="GetDataGrafiek"/>
<DataTemplate x:Key="GrafiekItemTemplate">
<Border Width="Auto" Height="Auto">
<Grid>
<Rectangle StrokeThickness="0" Height="30"
Margin="15"
HorizontalAlignment="Right"
VerticalAlignment="Bottom"
Width="{Binding Value}"
Fill="{Binding Fill}">
<Rectangle.LayoutTransform>
<ScaleTransform ScaleX="20" />
</Rectangle.LayoutTransform>
</Rectangle>
</Grid>
</Border>
</DataTemplate>
塗りつぶしは、実際には棒グラフiselfの棒のサイズを示します。
itemsControl:
<ItemsControl x:Name="icGrafiek"
Margin="20,3,0,0"
ItemsSource="{Binding Source={StaticResource odpLbGrafiek}}"
ItemTemplate="{DynamicResource GrafiekItemTemplate}"
RenderTransformOrigin="1,0.5" HorizontalAlignment="Left" VerticalAlignment="Top" Grid.RowSpan="6">
<ItemsControl.RenderTransform>
<TransformGroup>
<ScaleTransform ScaleY="-1" ScaleX="1"/>
<SkewTransform AngleY="0" AngleX="0"/>
<RotateTransform Angle="180"/>
<TranslateTransform/>
</TransformGroup>
</ItemsControl.RenderTransform>
</ItemsControl>
次のメソッドがデータバインディングで呼び出されます。ここでbar.Valueは、バーのサイズを示すデータテンプレートのWidth値の値を示します。
public ObservableCollection<GrafiekBar> GetDataGrafiek()
{
var converter = new System.Windows.Media.BrushConverter();
Double maxValueStilstanden = GetLargestValueStilstanden();
TimeSpan tsMaxValue = TimeSpan.Parse(maxValueStilstanden.ToString());
totalMinutesMaxValue = tsMaxValue.TotalMinutes;
//calculate % of stilstanden Values
foreach(String t in stilStandenList)
{
TimeSpan ts = TimeSpan.Parse(t);
Double totalMin = ts.TotalMinutes;
totalMin = totalMin / totalMinutesMaxValue * 100;
valuesChartPercentage.Add(totalMin);
}
for (int j = 0; j < valuesChartPercentage.Count; j++)
{
GrafiekBar bar = new GrafiekBar();
bar.Value = valuesChartPercentage[j];
bar.Fill = converter.ConvertFromString(kleuren[j]) as Brush;
listGrafiek.Add(bar);
}
return listGrafiek;
}
もう1つの問題は、実際には幅(バーのサイズ)です。バー自体を視覚化するには、実際に*10000を実行する必要があります。
棒グラフのように見えるようにスタイル設定されたItemsControlを使用しています。
したがって、たとえば、1から5までの5つの値を持つ配列は、異なるバーサイズとそれぞれ異なる色の5つのバーを作成します。次の例とよく似ていますhttp://www.c-sharpcorner.com/uploadfile/mahesh/bar-chart-in-wpf/
問題:
私の問題は、バーのスケールサイズにあります(この場合はwidthプロパティなので、int / double値が必要です)。
- 私のプログラムは、HH:mm:ss形式でいくつかのDateTimeを記録します
- バーはこれらの日時にスケーリングする必要があります
たとえば、01:22:11のバー、または00:01:11のバーを最大6まで持つことができます。
これらのDateTime値を特定のdouble値にスケーリングするための最良のアプローチは何でしょうか?この値は、チャート上のバーのサイズを示すために使用されます。
すべての値をまったく同じように計算するある種の計算を探していると思います。そのため、突然大きくなり、UIから外れる値を取得することはありません。
最もクリーンな解決策は、すべてのバーを相互に比較し、一方を変更するともう一方が拡大/縮小することですが、思ったほど複雑でない限り、現時点では必要ありません。
バーチャー自体は過度に正確である必要はなく、状況の全体像を把握するのに役立つだけです。正確な値はデータベースに書き込まれます。
どんな提案でも大歓迎です!
PeterPに感謝します。