在画布上设置矩形的z索引并没有将它带到前面

时间:2013-01-23 20:44:40

标签: c# wpf canvas z-index

我遇到了画布和矩形画的问题。 他们正在以相反的创造顺序获得事件(最新的是在顶部),而不是zindex的顺序......

我已经将ItemsControl与资源列表绑定在一起。

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

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

2 个答案:

答案 0 :(得分:3)

在DataTemplate中的Rectangle上设置Canvas.ZIndex(或WPF中的实际Panel.ZIndex)无效,因为这些Rectangle不是ItemsPanelTemplate中Canvas的直接子项。换句话说,矩形不是兄弟,但ZIndex是一个相对值,它只影响同一容器控件的兄弟。

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

为了让事情顺利进行,您可以将DataTriggers移动到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>

答案 1 :(得分:0)

您的问题与您的触发器有关。 Style仅支持EventTrigger,而不支持任何其他类型,因此永远不会执行触发器。你在DataTemplate中,并且那些支持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>