1

NodeVM と LinkLineVM (CompositeCollection を使用) の 2 種類のオブジェクトを表示する Canvas ItemsPanel を持つ ListBox があります。各 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、線 + 小さなボックス == NetworkLinkVM。A はリンク [-30] が他のリンクを通過するため問題ありませんが、リンク [-31] ボックスがリンク [-32] の下に隠されているため、B は問題です。 ここに画像の説明を入力

4

1 に答える 1

1

ListBox.ItemContainerStyleDataTemplate の代わりにZIndex インデックスを設定します。

この理由は、すべてのアイテムが でラップされているため、 ZIndex をではなく にListBoxItem設定する必要があるためです。ListBoxItemDataTemplate

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

データバインドされたオブジェクトをチェックし、それがまたはtypeofであるかどうかに基づいて正しい ZIndex を返すコンバーターが必要です。NodeVMNetworkLinkVM

これは DataTemplate の ZIndex のみを設定しますが、それらが整理されたら、NetworkLinkVM's内部の ZIndex を設定しLineTextBlock

于 2011-10-28T15:31:48.517 に答える