也许你们可以帮我弄清楚这一点:我有一个字典和一个绑定到该字典的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