在画布上为矩形设置 zindex 不会将其置于前台

本文关键字:于前台 前台 zindex 设置 | 更新日期: 2023-09-27 17:55:24

我在画布上绘制的矩形有问题。他们以相反的创建顺序(最新在顶部)获得事件,而不是 zindex 的顺序......

我已将项目控件与资源列表绑定。

然后有一个画布作为项目面板:

<ItemsControl.ItemsPanel>
    <ItemsPanelTemplate>
        <Canvas x:Name="BitmapCanvas"/>
    </ItemsPanelTemplate>
</ItemsControl.ItemsPanel>

所有资源都绑定为矩形:

<ItemsControl.ItemTemplate>
    <DataTemplate DataType="interfaces:IResourceView">
        <Rectangle ...>

并且有一种风格:

<Rectangle.Style>
    <Style TargetType="{x:Type Rectangle}">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsSelected}" Value="true">
                <Setter Property="Canvas.ZIndex" Value="0"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=IsSelected}" Value="false">
                <Setter Property="Canvas.ZIndex" Value="15"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
    ...</Rectangle.Style></Rectangle></DataTemplate></ItemsControl.ItemTemplate>

如您所见,当选择矩形时,我将其 Zindex 设置为 0,然后其他人的 zindex 值更大。我也在尝试使用交换的值,但仍然矩形以同样的方式获得焦点。有没有人知道为什么会这样?

在画布上为矩形设置 zindex 不会将其置于前台

在 DataTemplate 中的矩形上设置Canvas.ZIndex(或实际上是 WPF 中的 Panel.ZIndex)不起作用,因为这些矩形不是 ItemsPanelTemplate 中画布的直接子级。换句话说,矩形不是同级,但ZIndex相对值,则仅影响同一容器控件的同级。

实际上,每个矩形都放入 ContentPresenter 的内容中(这是 ItemsControl 的项容器类型)。然后将这些内容演示器放入画布中。

为了使事情正常工作,您可以将 DataTrigger 移动到 ItemContainerStyle:

<ItemsControl.ItemContainerStyle>
    <Style TargetType="ContentPresenter">
        <Style.Triggers>
            <DataTrigger Binding="{Binding Path=IsSelected}" Value="true">
                <Setter Property="Panel.ZIndex" Value="0"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=IsSelected}" Value="false">
                <Setter Property="Panel.ZIndex" Value="15"/>
            </DataTrigger>
        </Style.Triggers>
    </Style>
</ItemsControl.ItemContainerStyle>

您的问题是触发器。样式仅支持事件触发器,不支持任何其他类型,因此您的触发器永远不会被执行。不过,您在数据模板中,并且这些模板确实支持 DataTrigger,因此您可以移动一些内容来解决问题:

<ItemsControl.ItemTemplate>
    <DataTemplate>
        <Rectangle x:Name="Rect"/>
        <DataTemplate.Triggers>
            <DataTrigger Binding="{Binding Path=IsSelected}" Value="true">
                <Setter TargetName="Rect" Property="Canvas.ZIndex" Value="0"/>
            </DataTrigger>
            <DataTrigger Binding="{Binding Path=IsSelected}" Value="false">
                <Setter TargetName="Rect" Property="Canvas.ZIndex" Value="15"/>
            </DataTrigger>
        </DataTemplate.Triggers>
    </DataTemplate>
</ItemsControl.ItemTemplate>