【发布时间】:2012-04-18 14:10:01
【问题描述】:
编辑:添加代码
此外,由于 DateTimes 不是真正的 Datetimes(hh:mm:ss 格式的 sStrings),我决定只使用 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>
Fill 实际上给出了条形图本身的大小。
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;
}
另一个问题实际上是宽度(条的大小)。我实际上必须做 * 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。
最干净的解决方案是将所有条形图相互比较,当一个条形图发生变化时,另一个条形图会增长/缩小,但目前还不需要这样做,除非它不像听起来那么复杂。
bar char 本身不需要过于精确,它只是用来大致了解情况。确切的值将写入数据库。
欢迎提出任何建议!
谢谢彼得P。
【问题讨论】:
标签: c# wpf charts itemscontrol