我有一个带有Canvas ItemsPanel的ListBox,它显示了2种不同类型的对象:NodeVMs和LinkLineVMs(使用CompositeCollection)。每个VM对象都有一个DataTemplate:
NodeVMs DataTemplate有一个TextBlock
(A)
LinkLineVMs DataTemplate有一个Line
(B)和一个TextBlock
(C)
如何获得以下绝对z顺序:A(顶部),C,B(底部)。
<ListBox>
<ListBox.Resources>
<DataTemplate DataType="{x:Type p:NodeVM}">
<StackPanel>
<TextBlock ... />
...
</StackPanel>
</DataTemplate>
<DataTemplate DataType="{x:Type p:NetworkLinkVM}">
<Grid>
<Line ... />
<TextBlock ... />
</Grid>
</DataTemplate>
</ListBox.Resources>
<ListBox.ItemsPanel>
<ItemsPanelTemplate>
<Canvas IsItemsHost="True" PreviewMouseUp="network_visualization_list_PreviewMouseUp" />
</ItemsPanelTemplate>
</ListBox.ItemsPanel>
<ListBox>
有人曾经说过一张图片值1000字。绿色矩形== NodeVM,Line +小方框== NetworkLinkVM。 A是正常的,因为链接[-30]通过其他链接但是B是一个问题,因为链接[-31]框被隐藏在链接下面[-32]
答案 0 :(得分:1)
将您的ZIndex索引设置为ListBox.ItemContainerStyle
而不是DataTemplate。
原因是所有项目都包含在ListBoxItem
中,因此您需要在ListBoxItem
而不是DataTemplate
上设置ZIndex
<Style TargetType="{x:Type ListBoxItem}">
<Setter Property="Canvas.ZIndex"
Value="{Binding Converter={StaticResource GetObjectZIndexConverter}}" />
</Style>
您需要一个转换器来检查您的数据绑定对象typeof
,并根据它是NodeVM
还是NetworkLinkVM
返回正确的ZIndex。
这只会为您的DataTemplates设置ZIndex,但一旦这些ZIndex被整理出来,您可以设置NetworkLinkVM's
内部Line
和TextBlock