也許你們可以幫我弄清楚這一點:我有一個字典和一個綁定到該字典的ItemsControl。每個條目的關鍵字確定ItemsControl中每個條目的內容,該值確定每個條目的寬度。這是一個大問題:寬度是一個百分比值,所以它告訴我,例如,我的項目需要是其父項大小的20%。WPF中基於動態百分比的寬度
我該如何做到這一點? 我知道網格能夠使用基於星號的寬度,但由於我必須在網格的開始處定義GridDefinition,因此我無法在ItemsControl.ItemTemplate中執行此操作。
當前代碼:
<ItemsControl ItemsSource="{Binding Distribution}" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<Grid IsItemsHost="True" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<!-- I NEED THIS TO BE A CERTAIN PERCENTAGE IN WIDTH -->
<Label Content="{Binding Key.Text}" Foreground="{Binding Key.Color}"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
在這個任何想法?有沒有什麼優雅的方法來解決這個問題?
謝謝!
說明:百分比應該是基於ItemControls父!
而另一個:每個項目應該是網格的一列,而不是一行。所以我需要所有的項目在同一行中彼此相鄰。
解決方案:
感謝您的幫助,這個問題可以通過使用Multibinding並綁定到ItemsControl的的ActualWidth的解決。這樣,每當ItemsControl改變大小,項目也會改變。一個網格是不需要的。此解決方案僅創建相對寬度,但當然可以將相同的解決方案應用於項目的高度。這是一個短版,爲更全面的解釋見樓下:
XAML:
<ItemsControl ItemsSource="{Binding Distribution}" Name="itemsControl" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
<ItemsControl.ItemsPanel>
<ItemsPanelTemplate>
<StackPanel IsItemsHost="True" Orientation="Horizontal" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" />
</ItemsPanelTemplate>
</ItemsControl.ItemsPanel>
<ItemsControl.ItemTemplate>
<DataTemplate>
<Label Content="{Binding Key.Text}"
Foreground="{Binding Key.Color}">
<Label.Width>
<MultiBinding Converter="{StaticResource myConverter}">
<Binding Path="Value"/>
<Binding Path="ActualWidth" ElementName="itemsControl"/>
</MultiBinding>
</Label.Width>
</Label>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
轉換:
class MyConverter : IMultiValueConverter
{
public object Convert(object[] value, Type targetType, object parameter, CultureInfo culture)
{
//[1] contains the ItemsControl.ActualWidth we binded to, [0] the percentage
//In this case, I assume the percentage is a double between 0 and 1
return (double)value[1] * (double)value[0];
}
public object[] ConvertBack(object value, Type[] targetTypes, object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
這應該做的伎倆!
父母的20%? ItemsControl,Label或其他的父項? – jtimperley 2012-08-08 13:03:45
你是什麼意思?「我必須在網格開始時定義GridDefinition?」你可以在'DataTemplate'中定義你的網格 - 它不需要在'ItemsPanelTemplate'中。 – 2012-08-08 13:03:53
嗨。看到我的編輯,20%應該是ItemControls父級(或標籤父級)的20%。因爲我可以使標籤父級拉伸在兩個方向上都是相同的。至於網格的開始:是的,我可以在DataTemplate中定義我的網格,但每個項目都有自己的網格,這是行不通的,還是我在這裏監督某些東西? – BlackWolf 2012-08-08 13:12:10