2010-04-21 9 views
9

Sto provando a fare un semplice effetto mouseover su un pulsante, esso cambia il colore quando il mouse è finito, ma il colore viene immediatamente modificato sullo sfondo del pulsante predefinito ... come posso sovrascrivere questo comportamento ?Pulsante Stili WPF MouseOver Domanda

questo è il mio codice:

Style myBtnStyle = new Style(); 
Trigger bla = new Trigger() { Property = IsMouseOverProperty, Value = true }; 
bla.Setters.Add(new Setter(Control.BackgroundProperty, Brushes.Black)); 
myBtnStyle.Triggers.Add(bla); 
button2.Style = myBtnStyle; 

risposta

24

Secondo this post, che l'animazione fantasia è costruito in e per rimuoverlo, si sta andando ad avere bisogno di ignorare il ControlTemplate per il vostro Button. Fortunatamente, non è troppo difficile. Ho usato this post come materiale di partenza e ho trovato il seguente Style che ti dà l'idea.

<Style x:Key="MouseOverButtonStyle" TargetType="Button"> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="Button"> 
       <ControlTemplate.Resources> 
        <Style x:Key="ShadowStyle"> 
         <Setter Property="Control.Foreground" Value="LightGray" /> 
        </Style> 
       </ControlTemplate.Resources> 
       <Border Name="border" BorderThickness="1" Padding="4,2" BorderBrush="DarkGray" CornerRadius="3" Background="{TemplateBinding Background}"> 
        <Grid > 
         <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Name="contentShadow" Style="{StaticResource ShadowStyle}"> 
          <ContentPresenter.RenderTransform> 
           <TranslateTransform X="1.0" Y="1.0" /> 
          </ContentPresenter.RenderTransform> 
         </ContentPresenter> 
         <ContentPresenter HorizontalAlignment="Center" VerticalAlignment="Center" Name="content"/> 
        </Grid> 
       </Border> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="Background" Value="Beige" /> 
     </Trigger> 
    </Style.Triggers> 
</Style> 

Aggiornamento: Se sei morto insieme su come applicare il Style nel codice e non si desidera utilizzare una (probabilmente il modo migliore per farlo) ResourceDictionary, è possibile caricare i Style dinamicamente utilizzando XamlReader.Load:

  const string xaml = @" 
<Style xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation' 
     xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml' 
     TargetType='Button'> 
    <Setter Property='Template'> 
     <!--- Omitted For Clarity ---> 
    </Setter> 
    <Style.Triggers> 
     <Trigger Property='IsMouseOver' Value='True'> 
      <Setter Property='Background' Value='Beige' /> 
     </Trigger> 
    </Style.Triggers> 
</Style>"; 
      var encoding = new ASCIIEncoding(); 
      var bytes = encoding.GetBytes(xaml); 
      var style = (Style)XamlReader.Load(new MemoryStream(bytes)); 
      Button1.Style = style; 
+5

So che posso farlo tramite xaml ma non può essere fatto tramite C# ??? – Luiscencio

+0

È possibile inserire lo stile in un dizionario risorse e quindi estrarlo quando necessario per applicare al pulsante. –

+0

+1 Proverò il tuo aggiornamento, sembra promettente grazie – Luiscencio

4

Override il tema ButtonChrome sarebbe stato più facile.

creare un modello e rimuovere il RenderMouseOver = "{} TemplateBinding IsMouseOver"

<Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="Button"> 
      <Microsoft_Windows_Themes:ButtonChrome x:Name="Chrome" BorderBrush="{TemplateBinding BorderBrush}" Background="{TemplateBinding Background}" RenderMouseOver="{TemplateBinding IsMouseOver}"RenderPressed="{TemplateBinding IsPressed}" RenderDefaulted="{TemplateBinding Button.IsDefaulted}" SnapsToDevicePixels="True"> 
       <ContentPresenter ContentTemplate="{TemplateBinding ContentTemplate}" Content="{TemplateBinding Content}" ContentStringFormat="{TemplateBinding ContentStringFormat}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" Margin="{TemplateBinding Padding}" RecognizesAccessKey="True" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/> 
      </Microsoft_Windows_Themes:ButtonChrome> 
      <ControlTemplate.Triggers> 
       <Trigger Property="IsKeyboardFocused" Value="True"> 
        <Setter Property="RenderDefaulted" TargetName="Chrome" Value="True"/> 
       </Trigger> 
       <Trigger Property="ToggleButton.IsChecked" Value="True"> 
        <Setter Property="RenderPressed" TargetName="Chrome" Value="True"/> 
       </Trigger> 
       <Trigger Property="IsEnabled" Value="False"> 
        <Setter Property="Foreground" Value="#FFADADAD"/> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </Setter.Value> 
</Setter> 

e quindi aggiungere il proprio trattamento di mouseover

<Style.Triggers> 
     <Trigger Property="IsMouseOver" Value="True"> 
      <Setter Property="Background"> 
       <Setter.Value> 
        <LinearGradientBrush EndPoint="0.5,1" StartPoint="0.5,0"> 
         <GradientStop Color="#FFF3E8D5" Offset="0"/> 
         <GradientStop Color="#FFF49B03" Offset="1"/> 
        </LinearGradientBrush> 
       </Setter.Value> 
      </Setter> 
     </Trigger> 
    </Style.Triggers> 

Questo dovrebbe risolverlo! :)

+0

Dovresti menzionare come registrare Microsoft_Windows_Themes, aggiungere 'xmlns: themes =" clr-namespace: Microsoft.Windows.Themes; assembly = PresentationFramework.Aero "' e Aggiungi riferimento 'PresentationFramework.Aero' da proiettare. – psulek