2010-11-23 39 views
0

我有一個用戶cotrol,它包含一個包含一個橢圓和一個viewbox的畫布。橢圓是背景,並且視圖框在運行時用從另一個程序集加載的圖形填充。我在爲控件創建一個「熱」行爲時遇到了問題,因此當鼠標移動到其上時,橢圓會改變顏色。在父元素的觸發器上設置子元素的屬性

如果我在橢圓上放置了一個觸發器,那麼顏色會發生變化,但當鼠標移過視圖框中的圖形時,它會變回,因爲視框不是橢圓的子節點。

從我讀過的,應該可以從父元素上的觸發器設置子元素的屬性。但是,我無法得到這個工作。我的代碼如下所示:

<Viewbox Margin="5" > 
     <Viewbox.Resources> 
      <SolidColorBrush x:Key="HotColor" Color="Blue"/> 
      <SolidColorBrush x:Key="ColdColor" Color="Red"/> 
      <Style TargetType="Canvas" x:Key="BackgroundStyle"> 
       <Setter Property="Ellipse.Fill" Value="{StaticResource ColdColor}"/> 
       <Style.Triggers> 
        <Trigger Property="IsMouseOver" Value="true"> 
         <Setter Property="Ellipse.Fill" Value="{StaticResource HotColor}"/> 
        </Trigger> 
       </Style.Triggers> 
      </Style> 
     </Viewbox.Resources> 
     <Canvas Width="44.000" Height="44.000" Style="{StaticResource BackgroundStyle}"> 
      <Ellipse Width="44" Height="44"/> 
      <Viewbox Name="ButtonGraphics"/> 
     </Canvas> 
    </Viewbox> 

結果是我的橢圓上根本沒有顏色。有趣的是,如果我嘗試設置Ellipse.Opacity,它會起作用,但會影響橢圓和圖形!所以它看起來像被應用到畫布上,而不是橢圓?

回答

1

當您使用具有ClassName.PropertyName屬性的Setter時,您沒有在所有ClassName對象上設置PropertyName。相反,您正在設置樣式化對象類型上的ClassName.PropertyName(在您的案例中爲Canvas)。給一個ClassName.PropertyName只是該屬性的一個類合格路徑。對於不透明度,Canvas.Opacity == Ellipse.Opacity == UIElement.Opacity。

現在,爲了實現您想要的,在ButtonGraphics ViewBox上設置IsHitTestVisible=False將防止圖形攔截鼠標事件。

+0

感謝您的解釋!這只是我WPF編碼的第二週,所以還有很多東西需要學習。這是否意味着在觸發器中設置子元素的屬性是不可能的? – NPVN 2010-11-23 19:51:50

1

只需在您的ViewBox上設置IsHitTestVisible=False怎麼辦?這將完全從命中測試中移除它,並且鼠標事件將註冊到您的橢圓。

相關問題