2011-10-28 24 views
0

伊夫用帆布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] enter image description here

回答

1

设置你的Z-索引指数ListBox.ItemContainerStyle,而不是你的DataTemplate。

这样做的原因是,所有项目都被包裹在一个ListBoxItem,所以你需要设置Z-索引在ListBoxItem而不是在DataTemplate

<Style TargetType="{x:Type ListBoxItem}"> 
    <Setter Property="Canvas.ZIndex" 
      Value="{Binding Converter={StaticResource GetObjectZIndexConverter}}" /> 
</Style> 

你需要的是检查typeof转换器您的数据绑定对象,并返回基于正确Z-索引,如果它是一个NodeVMNetworkLinkVM

这将只设置Z-索引你的DataTemplates,但一旦这些整理出来,你可以设置Z-索引的NetworkLinkVM's内部LineTextBlock

+0

感谢输入 - 我认为您的解决方案是好的 - 但遗憾的是仍然是一个问题。我发布了一张图片,有助于更好地解释情况。我有你的转换器,把所有的NodeVM(绿色)ontop - 这很好。但是,影响zorder的列表框中的项目顺序仍然存在问题。尽管在DataTemplate中,链接框位于链接线之上,但列表中稍后的一行+框仍然位于列表中早一行的一个框中。任何想法最赞赏! – Ricibob

+0

@Ricibob Hrrm我明白你在说什么了。任何机会,你可以分离出你的线条对象到不同的层,使你的对象(绿框,蓝色框和线)的所有3个同一收集存在,而不是具有蓝色框和线条的集合中分享的地方? – Rachel

+0

是的,可能的解决方案,但不幸的是不太实际。该集合是节点和链接 - 它只会让事情打破链接强度(箱子)出来NetworkLinksVM的只是z顺序一个烂摊子。我认为有可能的清洁解决方案 - 只需要找到它! – Ricibob