2010-04-21 19 views
9

Düğme üzerinde basit bir mouseover efekti yapmaya çalışıyorum, Fare bittiğinde rengi değiştirir, ancak renk hemen varsayılan düğme arka planına dönüşür ... Bu davranışı nasıl geçersiz kılabilirim? ?WPF Styles Düğme MouseOver Soru

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; 

cevap

24

this post göre, bu fantezi animasyon ve kaldırmak için, size Button için ControlTemplate geçersiz kılmak ihtiyacımız olacak yerleşik:

bu benim kodudur. Neyse ki, bu çok zor değil. Kaynak malzeme olarak this post kullandım ve size fikir veren aşağıdaki Style ile geldi.

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

Güncelleme: kodda Style uygulayarak ölü seti ve sen (bunu yapmak için muhtemelen daha iyi bir yol) bir ResourceDictionary kullanmak istemiyorsanız , dinamik Style yükleyebilirsiniz XamlReader.Load kullanarak: ButtonChrome tema geçersiz kılma

  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

Bunu xaml aracılığıyla yapabileceğimi biliyorum ama C# ile yapamazsınız ??? – Luiscencio

+0

Stili bir kaynak sözlüğüne yerleştirebilir ve ardından düğmesine basmanız gerektiğinde çekebilirsiniz. –

+0

+1 Güncelleştirmeyi denerim, umut verici görünüyor – Luiscencio

4

daha kolay olurdu.

şablon oluşturma ve 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> 

kaldırmak Sonra bunu çözmek gerekir

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

Mouseover

kendi işleme ekleyin! :)

+0

Microsoft_Windows_Themes'e kayıt yaptırmanız, xmlns: themes = "clr-namespace: Microsoft.Windows.Themes; assembly = PresentationFramework.Aero" ve Add Reference "PresentationFramework.Aero" adlarını eklemeniz gerekir. – psulek