2013-06-29 26 views
6

Ben vurgulu üzerinde xaml bir düğmenin stili arka plan rengini değiştirmek çalışıyorum Bu benim şimdiki yaklaşım, ama çalışmıyor. Varsayılan vurgulu rengi Bunu başarmak için Denetim şablonu geçersiz kılmak gerektiğini söylemek başka çözümler gördüğüm wpf düğmesi arka plan üzerine gelme rengi

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

kullanılıyor, ancak bu çözümler de siz de görünüyor sınır ve içeriğini tanımlayan gerektirir gereksiz. Xaml'da bir vurgulu devleti tanımlamanın en küçük yaklaşımı nedir?

cevap

1

Aero teması için varsayılan düğme tarzı şablonun bakalım: Gördüğünüz gibi

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

, fareyle üzerine ve preslenmiş renkler ButtonChrome özelliklerindeki RenderMouseOver ve RenderPressed üzerinde bağlamaları olarak tanımlanır . ButtonChrome'un yolu, Background özelliğinden herhangi bir değere göre öncelikli olarak tasarlanmıştır. Bu nedenle, maalesef, tıklanmış veya vurgulanmış bir tuşun arka plan rengini geçersiz kılmanın tek yolu şablonunu geçersiz kılmaktır.

+1

bu diğer olandan daha iyi bir cevap olduğunu düşünüyorum Neden Bu örnek ... çalışmıyor? Bu çalışıyor ... –

+5

@Bondye Bu cevap "çalışmak" için gerekli değildir, "neden" sorusunu cevaplamak ve sorunu tamamen çözmek için nasıl talimatlar vermesi gerekiyordu. Kabul edilen cevap "çalışır", ancak çok sınırlı sayıda durumda ve daha karmaşık bir şey gerekli olursa yararlı değildir. Daha ayrıntılı analiz, başka bir soruya yaptığım yorumda. TL; DR: sadece kopyala yapıştırmayın; anlamaya çalış ve kendin yap. – Athari

7

Ben, ihtiyacı dayalı basit tarzı bazlı düğmeye oluşturduk

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

Bu stil çok basit. Erişim anahtarlarını kırar, engelli durumu bile desteklemez. Ayrıca, ContentPresenter'daki hizalama özellikleri içerik hizalama özelliklerini kullanması gerektiğinden de yanlıştır. – Athari

+0

@Athari: Öneriniz için teşekkürler, evet basittir. Devre Dışı Bırakanlar ve keyboardfocuesd durumlarını eklemeniz gerekir. – Ravuthasamy