2013-08-27 3 views
1

Этот вопрос связан с another question, который я только что спросил об этом.IsMouseOver не запускается

У меня есть холст с обоими Путями и 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

Причина заключается в том, что вы устанавливаете Свойство Триггера на Canvas.IsMouseOver, поэтому он срабатывает, когда Canvas Mouser Over. Но поскольку вы устанавливаете триггер в стиле пути, это будет ограничено в пределах области пути.

Я знаю, что IsMouseOver является свойством, но я хочу использовать MouseEnter в качестве примера. MouseEnter - это маршрутизируемое событие, поэтому, когда мышь наводит TextBlock, он будет запускаться как событие с маршрутом, событие MouseEnter TextBlock будет срабатывать, и, возможно, IsMouseOver TextBlock станет истинным, а не Path и Canvas. Потому что теперь ZIndex TextBlock является самым высоким.

Итак, нам нужно сделать, чтобы IsMouseOver TextBlock не менялся, когда он зависал.

Мы можем установить TextBlock's 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> 
+0

Спасибо за помощь. Я видел IsHitTestVisible на разных сайтах, но я не изучал, что он сделал. Похоже, мне нужно немного почитать об этом. :) – Jagd

+1

IsHitTestVisible очень полезен, если вы хотите, чтобы управление стало прозрачным для взаимодействия. – coldjokelife

Смежные вопросы