1

我有一个带有 Canvas ItemsPanel 的 ListBox,它显示 2 种不同类型的对象:NodeVM 和 LinkLineVM(使用 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>

有人曾经说过一张照片值一千字。绿色矩形 == NodeVM,Line+小方框 == NetworkLinkVM。A 可以,因为链接 [-30] 通过其他链接但 B 是一个问题,因为链接 [-31] 框隐藏在链接 [-32] 下方 在此处输入图像描述

4

1 回答 1

1

设置您的 ZIndex 索引ListBox.ItemContainerStyle而不是您的 DataTemplate。

这样做的原因是所有项目都包装在 a 中ListBoxItem,因此您需要将 ZIndex 设置ListBoxItemDataTemplate

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

您将需要一个转换器来检查typeof您的数据绑定对象,并根据它是否为 aNodeVM或返回正确的 ZIndex NetworkLinkVM

这只会为您的 DataTemplates 设置 ZIndex,但是一旦将它们整理好,您就可以设置NetworkLinkVM's内部的 ZIndexLineTextBlock

于 2011-10-28T15:31:48.517 回答