2

我的画布和画在上面的矩形有问题。他们以相反的创建顺序获取事件(最新的在顶部),而不是 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 值更大。我也在尝试使用交换值,但矩形仍然以同样的方式获得焦点。有人知道为什么会这样吗?

4

2 回答 2

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>
于 2013-01-23T21:02:29.450 回答
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>
于 2013-01-23T21:45:27.097 回答