2013-06-29 16 views
6

Próbuję zmienić kolor tła stylu przycisku w języku xaml na hover To jest moje obecne podejście, ale to nie działa. Domyślny kolor aktywowanych jest używanyKolor tła przycisku wpf hover

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

Widziałem inne rozwiązania, które mówią, że trzeba zastąpić szablon sterowania, aby to osiągnąć, ale te rozwiązania wymagają również zdefiniować granicę i treści, a także co wydaje niepotrzebne. Jakie jest minimalne podejście do definiowania stanu zawisu w Xaml?

Odpowiedz

1

Spójrzmy szablonu domyślnego przycisku styl dla 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> 

Jak widać, myszą i prasowane kolory są zdefiniowane jako wiązań na właściwościom ButtonChrome „s RenderMouseOver i RenderPressed . Sposób, w jaki został zaprojektowany, ma pierwszeństwo przed dowolnymi wartościami z właściwości Background. Dlatego niestety jedynym sposobem na zastąpienie koloru tła klikniętego lub wyróżnionego przycisku jest nadpisanie jego szablonu.

+1

Ten przykład nie działa ... Dlaczego uważasz, że jest to lepsze rozwiązanie niż inne? Ten działa ... –

+5

@Bondye Ta odpowiedź nie ma na celu "pracy", ma odpowiedzieć na pytanie "dlaczego" i podać wskazówki, jak rozwiązać problem całkowicie. Przyjęta odpowiedź "działa", ale w bardzo ograniczonej liczbie przypadków i nie jest pomocna, jeśli konieczne jest coś bardziej złożonego. Bardziej szczegółowa analiza jest w moim komentarzu do innego pytania. TL; DR: nie tylko kopiuj-wklej; spróbuj zrozumieć i zrobić to samemu. – Athari

7

Stworzyłem prosty przycisk w oparciu stylu w zależności od potrzeb,

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

Ten styl jest zbyt prosty. Łamie klucze dostępu, nie obsługuje nawet stanu wyłączenia. Jest to również niepoprawne, ponieważ właściwości dopasowania w 'ContentPresenter' powinny korzystać z właściwości wyrównania zawartości. – Athari

+0

@Athari: Dzięki za twoją sugestię, tak, to jest proste. Muszą zawierać Wyzwalacze dla niepełnosprawnych i stany z klawiaturą. – Ravuthasamy