2013-06-29 3 views
6

Ich versuche, die Hintergrundfarbe eines Button-Stils in Xaml auf Hover zu ändern Dies ist mein derzeitiger Ansatz, aber es funktioniert nicht. Die Standard-Hover-Farbe wirdwpf button background hover farbe

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

ich andere Lösungen gefunden haben, die sagen, dass Sie die Steuervorlage außer Kraft setzen müssen, dies zu erreichen, aber diese Lösungen erfordern auch Sie die Grenze und den Inhalt als auch definieren, welche scheint nicht notwendig. Was ist der minimale Ansatz zum Definieren eines Hover-Status in Xaml?

Antwort

1

die bei der Vorlage der Standardschaltfläche Stil für Aero-Design Werfen wir einen Blick:

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

Wie Sie die Maus über sehen können, und drückte Farben als Bindungen auf die ButtonChrome ‚s Eigenschaften definiert RenderMouseOver und RenderPressed . Die Art und Weise ButtonChrome entworfen ist, haben sie Vorrang vor allen Werten aus der Background Eigenschaft. Daher besteht die einzige Möglichkeit, die Hintergrundfarbe einer angeklickten oder hervorgehobenen Schaltfläche zu überschreiben, darin, die Vorlage zu überschreiben.

+1

Dieses Beispiel nicht ... funktioniert Warum Sie denken, dies ist eine bessere Antwort als die andere? Das funktioniert ... –

+5

@Bondye Diese Antwort soll nicht "funktionieren", sie soll die Frage "Warum" beantworten und Anweisungen geben, wie man das Problem vollständig löst. Die angenommene Antwort "funktioniert", aber in einer sehr begrenzten Anzahl von Fällen, und ist nicht hilfreich, wenn etwas Komplexeres notwendig ist. Eine detailliertere Analyse ist in meinem Kommentar zu einer anderen Frage. TL; DR: nicht nur kopieren-einfügen; versuche es zu verstehen und es selbst zu tun. – Athari

7

Ich habe einfache Art basiert Taste auf Ihrer Anforderung basiert erstellt,

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

Dieser Stil ist zu einfach. Es bricht Zugriffsschlüssel ab, es unterstützt nicht einmal den deaktivierten Zustand. Es ist auch falsch, da die Ausrichtungseigenschaften von 'ContentPresenter' Inhaltsausrichtungseigenschaften verwenden sollten. – Athari

+0

@Athari: Danke für Ihren Vorschlag, ja, es ist einfach.Sie müssen Trigger für Behinderte und Tastaturfokussierte Staaten enthalten. – Ravuthasamy