2013-06-29 7 views
6

Sto provando a cambiare il colore di sfondo dello stile di un pulsante in xaml su hover Questo è il mio approccio attuale, ma non funziona. Il colore di default passaggio del mouse viene utilizzatowpf button background hover color

<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> 

Ho visto altre soluzioni che dire che è necessario sostituire il modello di controllo per raggiungere questo obiettivo, ma queste soluzioni richiedono anche di definire il confine e il contenuto e che sembra non necessario. Qual è l'approccio minimo alla definizione di uno stato di hover in Xaml?

risposta

1

Guardiamo il modello dello stile pulsante predefinito per Aero tema: colori

<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> 

Come si può vedere, il mouse-over e pressato sono definiti come attacchi sulle proprietà RenderMouseOver e RenderPressed s' il ButtonChrome . Il modo in cui è progettato ButtonChrome ha la priorità su qualsiasi valore della proprietà Background. Pertanto, sfortunatamente, l'unico modo per sovrascrivere il colore di sfondo di un pulsante cliccato o evidenziato è quello di sovrascrivere il suo modello.

+1

Questo esempio non funziona ... Perché pensi che sia una risposta migliore rispetto agli altri? Quello sta funzionando ... –

+5

@Bondye Questa risposta non dovrebbe "funzionare", dovrebbe rispondere alla domanda "perché" e dare indicazioni su come risolvere completamente il problema. La risposta accettata "funziona", ma in un numero molto limitato di casi e non è utile se è necessario qualcosa di più complesso. Un'analisi più dettagliata è nel mio commento ad un'altra domanda. TL; DR: non fare semplicemente copia-incolla; cerca di capire e di farlo da solo. – Athari

7

Ho creato semplice pulsante in base stile basato sul vostro requisito,

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

Questo stile è troppo semplice. Rompe le chiavi di accesso, non supporta nemmeno lo stato disabilitato. È anche sbagliato, poiché le proprietà di allineamento su 'ContentPresenter' dovrebbero usare le proprietà di allineamento del contenuto. – Athari

+0

@Athari: Grazie per il tuo suggerimento, sì è semplice.hanno bisogno di includere Trigger per disabili e stati keyboardfocuesd. – Ravuthasamy