編輯:添加代碼ItemsControl的條形圖縮放
而且由於DateTime是否是不是真的日期時間(在HH字符串:mm:ss格式),我決定只使用字符串來代替,而時間跨度檢索總分鐘。
<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給出了數據模板中的寬度值的值,它給出了一個條的大小。
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的是風格,所以它看起來像一個條形圖。
因此,例如,具有從1到5的5個值的數組創建5個具有不同條形尺寸和每個不同顏色的條形。 相像以下示例http://www.c-sharpcorner.com/uploadfile/mahesh/bar-chart-in-wpf/
問題:
我的問題是與杆的規模大小(在這種情況下,width屬性,因此需要INT /雙值)。
- 我的程序在HH記錄幾個DateTime是否:mm:ss格式
- 的酒吧應該在這些日期時間進行縮放
例如,我可以有一個酒吧,1時22分11秒或00:01:11,最高金額爲6.
將這些DateTime值縮放到某個double值的最佳方法是什麼? 該值將用於給出圖表上的小節大小。
猜猜我在尋找某種計算方式,它可以計算出所有我的數值,所以我不會突然得到一個非常大的值,並且不會出現在我的用戶界面中。
最乾淨的解決方案將是所有酒吧相互比較,當一個改變另一個增長/縮小,但這並不是必需的,除非它不像它聽起來那麼複雜。
酒吧本身並不需要過於精確,它只是爲了瞭解情況的一般情況。確切的值將寫入數據庫。
任何建議都非常歡迎!
謝謝PeterP。
感謝您的回覆,是否可以說明代碼中的一部分?我的程序運行一個計時器,它的值可能每5秒更新一次。幾秒鐘的時間也是可能的。 – PeterP 2012-04-18 14:27:09
@PeterP我會使用'ItemsSource'轉換器,它需要一個'ObservableCollection',以及一個基準日期時間參數。在轉換器中,我將從循環列表開始,找到最大日期。以基準日期和最大日期之間的分鐘數/天/小時數/秒爲單位,並將其存儲在某個地方作爲100%使用。現在創建一個新列表來保存你的返回值。循環顯示原始列表,獲取該日期和基準日期之間的分鐘數/天/小時/秒數,並將其除以100%數,然後將結果添加到返回列表中。返回新列表到IC –
Rachel
2012-04-18 14:57:58
@PeterP如果您使用'ObservableCollection'而不是'List ',計時器將不會成爲問題,因爲ObservableCollection會響應計時器可觸發的更改通知。 –
Rachel
2012-04-18 14:58:50