更改ListBox元素的ZIndex

时间:2017-07-28 13:40:16

标签: c# wpf listbox

我的问题

当我在ListBox中创建新元素时,较新的元素会覆盖旧元素,因为它们不具有相同的ZIndex因此会阻止选择。在我的ListBox中,我在Rectangles上使用透明的Canvas作为ItemTemplateItemsPanelTemplate

我想将所有Elements的ZIndex更改为相同的值,以便用户可以用鼠标选择他悬停的元素。

截图

屏幕截图1:当ZIndex正确时它应该如何工作和当前的工作

enter image description here

屏幕截图2:当ZIndex不正确时会发生什么

enter image description here

我的XAML代码如下所示:

<cc:ListBoxNoDragSelection ItemsSource="{Binding Rectangles}" Background="{DynamicResource  BG}" SelectedItem="{Binding Selected}"
                               BorderThickness="0">
        <ListBox.ItemsPanel>
            <ItemsPanelTemplate>
                <Canvas x:Name="MockupCanvas" Background="Transparent">
                    <Canvas.ContextMenu>
                        <ContextMenu>
                            <MenuItem Header="New rectangle" Command="{Binding AddNewRectangleToCollectionCommand}"/>
                            <MenuItem Header="Delete selected rectangle" Command="{Binding TryDeleteRectangleFromCollectionCommand}"/>
                        </ContextMenu>
                    </Canvas.ContextMenu>
                </Canvas>
            </ItemsPanelTemplate>
        </ListBox.ItemsPanel>
        <ListBox.ItemContainerStyle>
            <Style TargetType="ListBoxItem">
                <Setter Property="Canvas.Left" Value="{Binding Rectangle.X}"></Setter>
                <Setter Property="Canvas.Top" Value="{Binding Rectangle.Y}"></Setter>
                <Setter Property="Canvas.ZIndex" Value="1"/>
            </Style>
        </ListBox.ItemContainerStyle>
        <ListBox.ItemTemplate>
            <DataTemplate>
                <DockPanel Height="Auto" Width="{Binding Rectangle.Width}">
                    <Label DockPanel.Dock="Top" Content="{Binding Rectangle.Name}" Foreground="{DynamicResource Foreground}" IsHitTestVisible="False"/>
                    <Rectangle Width="{Binding Rectangle.Width}" Height="{Binding Rectangle.Height}"  DockPanel.Dock="Bottom"
                               Fill="Transparent" Stroke="White" StrokeThickness="3" RadiusX="10" RadiusY="10" />
                </DockPanel>
            </DataTemplate>
        </ListBox.ItemTemplate>
    </cc:ListBoxNoDragSelection>

正如您所看到的,我尝试将ZIndex设置为每个矩形的相同值,但这似乎根本不起作用。

非常感谢帮助!

1 个答案:

答案 0 :(得分:2)

这是您MSDN

的问题
  

具有相同ZIndex值的Children集合的成员将按照它们在可视树中的显示顺序呈现。

设置Z-Index只能做这么多。默认情况下,集合中较新的项目将呈现在较旧的元素之上。如果您正在寻找使用鼠标位置来选择元素,可以考虑使用Hit Tests来确定您想要的元素