ZOrder Expander с Canvas внутри списка
У меня есть список, который содержит некоторые элементы управления, в том числе Expander
, В экспандере есть еще один список, который я хочу наложить на внешний список. Вот простое воспроизведение:
<Page.Resources>
<x:Array x:Key="array1" Type="sys:String">
<sys:String>item 1</sys:String>
<sys:String>item 2</sys:String>
<sys:String>item 3</sys:String>
</x:Array>
<DataTemplate x:Key="buttonTemplate">
<Button Content="{Binding}"/>
</DataTemplate>
<DataTemplate x:Key="expanderItem">
<StackPanel>
<Expander Header="Options">
<Canvas>
<StackPanel Panel.ZIndex="999" Background="Red">
<Label>A1</Label>
<Label>A2</Label>
<Label>A3</Label>
<Label>A4</Label>
</StackPanel>
</Canvas>
</Expander>
<Label BorderBrush="Black" BorderThickness="2" Content="{Binding}"/>
</StackPanel>
</DataTemplate>
</Page.Resources>
<Grid>
<ListBox ItemsSource="{StaticResource array1}" ItemTemplate="{StaticResource expanderItem}"/>
</Grid>
Когда Expander
открывается, внутренние метки отображаются на том же уровне, что и метка в том же DataTemplate
и содержание более поздних пунктов в списке. Я пытался переместить Panel.ZIndex
до панели без изменений.
Если я добавлю следующий стиль:
<Style TargetType="{x:Type Expander}">
<Style.Triggers>
<Trigger Property="IsExpanded" Value="True">
<Setter Property="Panel.ZIndex" Value="999"/>
</Trigger>
</Style.Triggers>
</Style>
Он будет правильно перекрывать элементы в одном и том же элементе списка, но все равно будет отображаться с содержимым из более поздних элементов списка.
(Я подозреваю, что это довольно очевидная проблема макета, но я не смог ее найти.)
1 ответ
Вы можете попробовать написать конвертер, который устанавливает ZIndex в табличке данных на основе индекса элемента в списке. Интересно, что все будет правильно обновляться при добавлении / удалении элементов.
Вам нужен расширитель, чтобы быть независимым от макета?