IsMouseOver没有触发

时间:2013-08-27 18:44:14

标签: wpf xaml triggers

这个问题与another question有关,我几乎没有问过这个问题。

我有一个Canvas,其中包含Path和TextBlock。

<Canvas>
    <Path Name="pathNodeType" StrokeThickness="1">
        <Path.Style>
            <Style>
                <Setter Property="Path.Stroke" Value="Black" />
                <Setter Property="Path.Fill" Value="LightGray" />
                <Style.Triggers>
                    <Trigger Property="Canvas.IsMouseOver" Value="True">
                        <Setter Property="Path.Stroke" Value="Blue" />
                        <Setter Property="Path.Fill" Value="LightBlue" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Path.Style>
        <Path.Data>
            <PathGeometry>
                <PathGeometry.Figures>
                    <PathFigureCollection>
                        <PathFigure IsClosed="True" StartPoint="20,40">
                            <PathFigure.Segments>
                                <PathSegmentCollection>
                                    <ArcSegment Size="10,10" RotationAngle="45" IsLargeArc="True"  SweepDirection="Clockwise"  Point="50,40" />
                                    <LineSegment Point="50,60" />
                                    <LineSegment Point="20,60" />
                                </PathSegmentCollection>
                            </PathFigure.Segments>
                        </PathFigure>
                    </PathFigureCollection>
                </PathGeometry.Figures>
            </PathGeometry>
        </Path.Data>
    </Path>
    <TextBlock HorizontalAlignment="Left" Margin="22,40,0,0" TextWrapping="Wrap" Text="AND" VerticalAlignment="Top" FontWeight="Bold"/>
  </Canvas>

当鼠标指针位于绘制路径上时,画布的IsMouseOver属性会触发路径样式。但是,当鼠标指针位于文本块上时(位于绘制路径中间的右侧),则路径样式不会像我预期的那样触发。

为什么不触发?文本块位于画布中,因此从技术上讲,它也不是画布上的鼠标指针吗?

提前感谢您提供任何帮助。

1 个答案:

答案 0 :(得分:2)

原因是,您将Trigger的属性设置为 Canvas.IsMouseOver ,因此当Canvas为Mouser Over时会触发。 但是当你在Path的样式中设置Trigger时,这将限制在Path的区域内。

我知道IsMouseOver是一个属性,但我想以MouseEnter为例。 MouseEnter是一个路由事件,因此当鼠标悬停在 TextBlock 时,它将作为路由事件触发,TextBlock的MouseEnter事件将触发,也许TextBlock的IsMouseOver变为true,而不是Path和Canvas 。因为现在TextBlock的ZIndex是最高的。

所以,我们需要做的是让TextBlock的IsMouseOver在被徘徊时不会改变。

我们可以设置TextBlock的 IsHitTestVisible =“False”;

代码可以是这样的: 我已经测试了这段代码,它确实有用!

<Canvas Background="Transparent">
    <Path Name="PathNodeType" StrokeThickness="1">
        <Path.Style>
            <Style TargetType="Path">
                <Setter Property="Stroke" Value="Black" />
                <Setter Property="Fill" Value="LightGray" />
                <Style.Triggers>
                    <Trigger Property="IsMouseOver" Value="True">
                        <Setter Property="Stroke" Value="Blue" />
                        <Setter Property="Fill" Value="LightBlue" />
                    </Trigger>
                </Style.Triggers>
            </Style>
        </Path.Style>
        <Path.Data>
            <PathGeometry>
                <PathGeometry.Figures>
                    <PathFigureCollection>
                        <PathFigure IsClosed="True" StartPoint="20,40">
                            <PathFigure.Segments>
                                <PathSegmentCollection>
                                    <ArcSegment IsLargeArc="True"
                                                Point="50,40"
                                                RotationAngle="45"
                                                Size="10,10"
                                                SweepDirection="Clockwise" />
                                    <LineSegment Point="50,60" />
                                    <LineSegment Point="20,60" />
                                </PathSegmentCollection>
                            </PathFigure.Segments>
                        </PathFigure>
                    </PathFigureCollection>
                </PathGeometry.Figures>
            </PathGeometry>
        </Path.Data>
    </Path>
    <TextBlock Margin="22,40,0,0"
               HorizontalAlignment="Left"
               VerticalAlignment="Top"
               FontWeight="Bold"
               Text="AND" IsHitTestVisible="False"
               TextWrapping="Wrap" />
</Canvas>