2013-06-29 248 views
6

我試圖改變懸停在xaml上的按鈕樣式的背景顏色 這是我目前的方法,但它不起作用。默認懸停顏色正在使用wpf按鈕背景懸停顏色

<Style x:Key="AtStyle" TargetType="Button"> 
     <Setter Property="Background"> 
      <Setter.Value> 
       <SolidColorBrush Color="{StaticResource AtBlue}" /> 
      </Setter.Value> 
     </Setter> 
     <Setter Property="Foreground" Value="White" /> 
     <Setter Property="Padding" Value="12,6" /> 
     <Setter Property="BorderThickness" Value="0" /> 
     <Setter Property="FontSize" Value="18.667" /> 
     <Style.Triggers> 
      <Trigger Property="IsMouseOver" Value="True"> 
       <Setter Property="Background"> 
        <Setter.Value> 
         <SolidColorBrush Color="Red" /> 
        </Setter.Value> 
       </Setter> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 

我見過其他的解決方案,說,你需要重寫控件模板來實現這一點,但這些解決方案還需要你定義的邊界和內容,以及這似乎不必要。在Xaml中定義懸停狀態的最簡單方法是什麼?

回答

1

讓我們來看看Aero主題默認的按鈕樣式的模板:

<ControlTemplate TargetType="{x:Type ButtonBase}"> 
    <theme:ButtonChrome Name="Chrome" 
      Background="{TemplateBinding Background}" 
      BorderBrush="{TemplateBinding BorderBrush}" 
      RenderDefaulted="{TemplateBinding Button.IsDefaulted}" 
      RenderMouseOver="{TemplateBinding IsMouseOver}" 
      RenderPressed="{TemplateBinding IsPressed}" 
      SnapsToDevicePixels="True"> 
     <ContentPresenter 
       Margin="{TemplateBinding Padding}" 
       SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
       VerticalAlignment="{TemplateBinding VerticalContentAlignment}" 
       HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
       RecognizesAccessKey="True"/> 
    </theme:ButtonChrome> 
    <ControlTemplate.Triggers> 
     <Trigger Property="IsKeyboardFocused" Value="True"> 
      <Setter TargetName="Chrome" Property="RenderDefaulted" Value="True"/> 
     </Trigger> 
     <Trigger Property="ToggleButton.IsChecked" Value="True"> 
      <Setter TargetName="Chrome" Property="RenderPressed" Value="True"/> 
     </Trigger> 
     <Trigger Property="IsEnabled" Value="False"> 
      <Setter Property="Foreground" Value="#ADADAD"/> 
     </Trigger> 
    </ControlTemplate.Triggers> 
</ControlTemplate> 

正如你可以看到,鼠標懸停和按下的顏色被定義爲在ButtonChrome的屬性RenderMouseOverRenderPressed綁定。 ButtonChrome的設計方式是,它們優先於Background屬性中的任何值。因此,不幸的是,覆蓋單擊或突出顯示的按鈕的背景顏色的唯一方法是覆蓋其模板。

+1

這個例子不工作...爲什麼你認爲這是比另一個更好的答案?那個正在工作... –

+5

@Bondye這個答案不應該「工作」,它應該回答「爲什麼」的問題,並指示如何徹底解決問題。被接受的答案「有效」,但是在數量非常有限的情況下,並且如果需要更復雜的話是沒有用的。更詳細的分析是在我對另一個問題的評論中。 TL; DR:不只是複製粘貼;試着去理解並自己去做。 – Athari

7

我已經創建根據您的需要簡約風格基於按鈕,

XAML

<Style TargetType="Button"> 
    <Setter Property="Background" 
      Value="Blue" /> 
    <Setter Property="HorizontalAlignment" 
      Value="Center" /> 
    <Setter Property="VerticalAlignment" 
      Value="Center" /> 
    <Setter Property="Foreground" 
      Value="White" /> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type Button}"> 
     <Border x:Name="bg" 
       Background="{TemplateBinding Background}" 
       BorderThickness="2" 
       BorderBrush="White"> 
      <ContentPresenter HorizontalAlignment="{TemplateBinding HorizontalAlignment}" 
          VerticalAlignment="{TemplateBinding VerticalAlignment}" /> 
     </Border> 
     <ControlTemplate.Triggers> 
      <Trigger Property="IsMouseOver" 
        Value="True"> 
      <Setter Property="Background" 
        Value="Red" 
        TargetName="bg" /> 
      </Trigger> 
     </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
</Style> 
+0

這種風格太簡單了。它打破了訪問鍵,它甚至不支持禁用狀態。這也是錯誤的,因爲ContentPresenter的對齊屬性應該使用內容對齊屬性。 – Athari

+0

@Athari:感謝您的建議,是的,它很簡單,它們需要包括Triggers for Disabled和keyboardfocuesd狀態。 – Ravuthasamy