2013-08-27 73 views
1

這個問題與another question有關,我剛剛在SO上也沒有提到。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上時,它將作爲路由事件觸發,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> 
+0

感謝您的幫助。我在各種網站上看到了IsHitTestVisible,但我還沒有研究過它的功能。看起來我需要稍微閱讀一下。 :) – Jagd

+1

當您想讓控件對Interaction透明時,IsHitTestVisible非常有用。 – coldjokelife

相關問題