Абсолютный z-порядок (для нескольких шаблонов данных) - PullRequest
0 голосов
/ 28 октября 2011

Ive ListBox с Canvas ItemsPanel, которая отображает 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>

Кто-то однажды сказал, что картинка стоит 1000 слов.Зеленый прямоугольник == NodeVM, Line + small box == NetworkLinkVM.A в порядке, так как ссылка [-30] проходит по другой ссылке, НО B проблема, так как окно [-31] скрыто НИЖЕ ссылка [-32] enter image description here

1 Ответ

1 голос
/ 28 октября 2011

Установите индекс ZIndex в ListBox.ItemContainerStyle вместо вашего DataTemplate.

Причина этого в том, что все элементы обернуты в ListBoxItem, поэтому вам нужно установить ZIndex на ListBoxItem вместо DataTemplate

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

Вам понадобится конвертер, который проверяет typeof ваш объект с привязкой к данным и возвращает правильный ZIndex на основе того, является ли он NodeVM или NetworkLinkVM.

Это будет устанавливать ZIndex только для ваших DataTemplates, но как только они отсортированы, вы можете установить ZIndex: NetworkLinkVM's внутренний Line и TextBlock

...