伊夫用帆布ItemsPanel列表框显示2种不同类型的对象:(使用CompositeCollection)NodeVMs和LinkLineVMs。每个VM对象有一个DataTemplate:
NodeVMs DataTemplate中有一个TextBlock
(A)
LinkLineVMs DataTemplate中有一个Line
(B)和TextBlock
(C) 如何得到以下绝对Z顺序:A(顶部),C, B(底部)。绝对z顺序(跨若干的DataTemplates)
<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>
曾有人说,一张图片胜过一千个词。绿色矩形== NodeVM,Line +小盒子== NetworkLinkVM。 A是确定作为连结[-30]经过其他链接,但B是作为连结[-31]盒的一个问题是隐藏下面的链接[-32]
感谢输入 - 我认为您的解决方案是好的 - 但遗憾的是仍然是一个问题。我发布了一张图片,有助于更好地解释情况。我有你的转换器,把所有的NodeVM(绿色)ontop - 这很好。但是,影响zorder的列表框中的项目顺序仍然存在问题。尽管在DataTemplate中,链接框位于链接线之上,但列表中稍后的一行+框仍然位于列表中早一行的一个框中。任何想法最赞赏! – Ricibob
@Ricibob Hrrm我明白你在说什么了。任何机会,你可以分离出你的线条对象到不同的层,使你的对象(绿框,蓝色框和线)的所有3个同一收集存在,而不是具有蓝色框和线条的集合中分享的地方? – Rachel
是的,可能的解决方案,但不幸的是不太实际。该集合是节点和链接 - 它只会让事情打破链接强度(箱子)出来NetworkLinksVM的只是z顺序一个烂摊子。我认为有可能的清洁解决方案 - 只需要找到它! – Ricibob