2013-06-29 10 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

के एयरो विषय के लिए डिफ़ॉल्ट बटन शैली के टेम्पलेट पर नजर डालते हैं:

<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 के गुण RenderMouseOver और RenderPressed पर बाइंडिंग के रूप में परिभाषित कर रहे हैं । जिस तरह से ButtonChrome डिज़ाइन किया गया है, वे Background संपत्ति से किसी भी मूल्य पर प्राथमिकता लेते हैं। इसलिए, दुर्भाग्यवश, क्लिक किए गए या हाइलाइट किए गए बटन के पृष्ठभूमि रंग को ओवरराइड करने का एकमात्र तरीका अपने टेम्पलेट को ओवरराइड करना है।

+1

इस उदाहरण काम नहीं करता है ... तुम्हें क्या लगता है यह एक दूसरे से बेहतर जवाब है? वह काम कर रहा है ... –

+5

@ बॉन्डेई यह जवाब "काम" नहीं करना चाहिए, यह सवाल "क्यों" का जवाब देना है और समस्या को पूरी तरह से हल करने का निर्देश देना है। स्वीकृत उत्तर "काम करता है", लेकिन बहुत सीमित मामलों में, और यदि कुछ और जटिल आवश्यक है तो सहायक नहीं है। एक और सवाल पर मेरी टिप्पणी में अधिक विस्तृत विश्लेषण है। टीएल; डीआर: केवल कॉपी पेस्ट न करें; समझने की कोशिश करो और इसे स्वयं करने के लिए। – 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: आपके सुझाव के लिए धन्यवाद, हाँ यह सरल है। उसे अक्षम और कीबोर्डफोक्यूड राज्यों के लिए ट्रिगर शामिल करने की आवश्यकता है। – Ravuthasamy

संबंधित मुद्दे