有以下标记:
<ItemsControl ItemsSource="{Binding Items}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Grid Margin="2.5">
<Grid.ColumnDefinitions>
<ColumnDefinition/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock Padding="5"
Text="{Binding Name}"/>
<TextBlock Grid.Column="1"
Padding="5"
Text="{Binding Weight}"/>
<Rectangle Grid.ColumnSpan="2" Panel.ZIndex="-1"
Fill="LightGreen" HorizontalAlignment="Left"
Width="..."/>
</Grid>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Here Items
- 特定的元素集合,按降序排列Weight
。我想要的:放在TextBlock'и
绿色矩形下方,但使其宽度与 value 成正比Weight
,并且 100% 取一个更大的值(它将是第一个)。Width
我草拟了模板,但我不知道要在属性中输入什么。这里有必要首先考虑到这 100% 显然是未知的,其次,宽度Grid
可以是任意的。
我画了我想要得到的:
如果VM中单独提供最大权重,则得到如下代码:
在 Windows 7 上它看起来像这样:
如果想要风格一致,最简单的方法就是适配矩形。为此,使用转换器在概念上是最简单的。
例如,是的。矩形的宽度等于网格的可用宽度乘以 的
Weight
比率MaxWeight
。让我们以转换器的形式来做。我们制作以下标记:
结果:
对于不想生产转换器的美学家,可以使用两个转换来变态和实现除法,其中一个需要反转。像这样:
图片是一样的。
@Pavel Mayorov 在评论中建议的另一个选项:
(我通过转换器尝试了其他选项
GradientBrush
,RenderTransform
它们也有效。)