您真正需要做的就是根据您需要填充的空间生成一个列表,每个箭头对应一个项目。让我们从转换器开始
public void MakeArrowListConverter : IValueConverter
{
public double ArrowHeight {get;set;}
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
var verticalSpace = (double) value;
int numberOfArrows = (int)(verticalSpace/ArrowHeight);
return Enumerable.Range(0, numberOfArrows);
}
}
这需要转换我们有高度的东西,在这种情况下,我只需使用 ContentPresenter 并将其绑定到您的视图。
<ContentPresenter x:Name="content" Content="{Binding}"/>
那么我们只需要获取高度并将其转换为您的列表
<xxx.Resources>
<convertors:MakeArrowListConverter x:Key="makeArrowListConverter" />
</xxx.Resources>
<ListBox ItemsSource="{Binding ElementName=content, Path=ActualHeight, Converter={StaticResource makeArrowListConverter}}">
<ItemTemplate>
<DataTemplate>
<!-- Image or Shape, this is your red arrow-->
<YourArrow/>
</DataTemplate>
</ItemTemplate>
</ListBox>
事实上,我们可以将这两个元素组合成一个dataTemplate,以便在列表中使用时将您的每一项数据转换为其显示形式
<DataTemplate DataType="{x:Type MyView}">
<!--This is your blue box-->
<StackPanel Orientation="Horizontal" HorizontalAlignment="Stretch">
<ContentPresenter x:Name="content" Content="{Binding}"/>
<ListBox ItemsSource="{Binding ElementName=content, Path=ActualHeight, Converter={StaticResource makeArrowListConverter}}">
<ItemTemplate>
<DataTemplate>
<!-- Image or Shape, this is your red arrow-->
<YourArrow/>
</DataTemplate>
</ItemTemplate>
</ListBox>
</StackPanel>
</DataTemplate>
<!-- And this is your orange box-->
<ListBox ItemsSource="{Binding YourListOfViews}"/>