在画布上为矩形设置 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 值更大。我也在尝试使用交换的值,但仍然矩形以同样的方式获得焦点。有没有人知道为什么会这样?
在 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>