编辑:添加代码
此外,由于 DateTimes 不是真正的 Datetimes(hh:mm:ss 格式的 sStrings),我决定只使用字符串并使用 TimeSpan 来检索总分钟数。
<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>
Fill 实际上给出了条形图本身的大小。
项目控制:
<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;
}
另一个问题实际上是宽度(条的大小)。我实际上必须做 * 10000 才能获得酒吧本身的任何视觉效果。
我使用的ItemsControl的样式看起来像条形图。
例如,一个包含 5 个值从 1 到 5 的数组会创建 5 个具有不同大小且每个颜色不同的条。与以下示例非常相似http://www.c-sharpcorner.com/uploadfile/mahesh/bar-chart-in-wpf/
问题:
我的问题是条的比例大小(在这种情况下为 width 属性,因此需要 int/double 值)。
- 我的程序以 HH:mm:ss 格式记录了几个 DateTimes
- 条形图应在这些日期时间进行缩放
例如,我可以有一个 01:22:11 的条形图或一个 00:01:11 的条形图,最大数量为 6。
将这些 DateTime 值缩放到某个 double 值的最佳方法是什么?该值将用于给出图表上条形的大小。
猜猜我正在寻找某种计算方法来计算我所有的值都一样,所以我不会突然得到一个非常大的值并超出我的 UI。
最干净的解决方案是将所有条相互比较,当一个改变时,另一个会增长/缩小,但这不是必需的,除非它不像听起来那么复杂。
条形字符本身不需要过于精确,它仅用于大致了解情况。确切的值将写入数据库。
欢迎任何建议!
谢谢彼得P。