2011-07-18 66 views
3

在下面的代碼中,當鼠標在網格,網格的Background預期爲紅色,但如預期它不執行的問題。使用觸發器在XAML

<Grid> 
    <Grid.Style> 
    <Style TargetType="{x:Type Grid}"> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="Background" Value="Red"/> 
      </Trigger> 
     </Style.Triggers> 
     </Style> 
    </Grid.Style> 
</Grid> 

但是,如果我加入了Setter使Background綠色,它會被正確執行。

<Grid> 
    <Grid.Style> 
    <Style TargetType="{x:Type Grid}"> 
     <Setter Property="Background" Value="Green"/><!-- at the former, added code--> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="Background" Value="Red"/> 
      </Trigger> 
     </Style.Triggers> 
     </Style> 
    </Grid.Style> 
</Grid> 

我不知道爲什麼要這樣,但你猜有用於設置Background,造成這一問題的優先級。這裏是來自MSDN的Dependency Property Value Precedence,我理解該引用的優先級,但我無法將此問題與優先級(MSDN)相關聯。

此外,在上面的代碼片段中,如果將Grid替換爲Button,則這兩個代碼將不會按預期執行。


更新:添加按鈕的情況下這個問題

<Button> 
    <Button.Style > 
     <Style TargetType="{x:Type Button}"> 
      <Setter Property="Background" Value="Transparent"/> 
      <Style.Triggers> 
       <Trigger Property="IsMouseOver" Value="True"> 
        <Setter Property="Background" Value="Red"/> 
       </Trigger> 
      </Style.Triggers> 
     </Style> 
    </Button.Style> 
</Button> 

回答

3

的問題是你的網格有一個空的背景,所以它是不可見的鼠標點擊測試。如果將背景設置爲透明,則將其設置爲綠色時可以進行檢測。

更多信息,可以發現here

我想你的按鈕,背景是正確初始化爲透明。紅色值僅顯示幾分之一秒。這是因爲在Aero主題中(我在Windows 7上),Button的ControlTemplate使用自定義鑲邊來提供動畫狀態轉換(即懸停等)。此自定義鑲邊元素使用內部畫筆,並忽略背景屬性。

此無關財產優先。對於網格來說,這只是你的網格不能被命中測試的問題。所以它的IsMouseOver不會被設置爲true,除非它具有非空背景(或者呈現某物的子節點)。

你可以看到在優先這裏的行動:

<Grid Background="Blue"> 
    <Grid.Style> 
     <Style TargetType="{x:Type Grid}"> 
      <Setter Property="Background" Value="Green"/> 
      <Style.Triggers> 
        <Trigger Property="IsMouseOver" Value="True"> 
         <Setter Property="Background" Value="Red"/> 
        </Trigger> 
       </Style.Triggers> 
     </Style> 
    </Grid.Style> 
</Grid> 

在上面,網格將永遠是藍作爲具有最高優先級(即本地或#3)。紅色(#6)優先於綠色(#8)。

在按鈕的情況下,你有這樣的事情:

<Button Background="Blue"> 
    <Button.Style> 
     <Style TargetType="{x:Type Button}"> 
      <Setter Property="Template"> 
       <Setter.Value> 
        <ControlTemplate TargetType="Button"> 
         <Border x:Name="border" Background="{TemplateBinding Background}"> 
          <ContentPresenter /> 
         </Border > 
         <ControlTemplate.Triggers> 
          <Trigger Property="IsMouseOver" Value="True"> 
           <Setter TargetName="border" Property="Background" Value="Red"/> 
          </Trigger> 
         </ControlTemplate.Triggers> 
        </ControlTemplate> 
       </Setter.Value> 
       </Setter> 
     </Style> 
    </Button.Style> 
</Button> 

在這種情況下,也有兩種遊戲背景屬性:此按鈕並在控制模板中的邊界。默認情況下,按鈕的背景屬性由邊框使用,但當鼠標懸停時,它使用紅色畫筆。此時,Button的Background屬性的值設置爲什麼並不重要。

+0

如果你有多餘的時間,請閱讀http://wangmo.wordpress.com/2008/12/12/pitfall-with-using-triggers-in-style-and-controltemplate/。對不起,煩人。他/她提到這個問題是「對FrameworkElement的屬性在樣式覆蓋setter方法或控件模板,因此,由制定者的任何變化不會帶來實際的任何變化。」我無法確定哪個是正確的。要清楚,你認爲Button Button有什麼用?我會盡快更新我的問題。 –

+0

@jwJung - 是的,如果你明確地在像 CodeNaked

+0

通過您的努力,我越來越好地解決了這個問題。你讓我保證嗎?在[MSDN](http://msdn.microsoft.com/en-us/library/ms743230.aspx)的優先順序中,「如果您明確指出...但這不適用於Grid。」意味着優先級3(本地值),因此由於優先級而改變顏色是不適用的。對於Button的情況,我的quetion的代碼片段是優先級6(樣式觸發器),但由於TemplatedParent模板(優先級4)定義了Button的顏色(默認顏色:灰色?),所以Button的背景將不會更改爲紅色,即使一隻老鼠在它上面。 –