2010-04-21 7 views
9

단추에 간단한 마우스 오버 효과를 만들려고합니다. 마우스가 끝났을 때 색상이 변경되지만 색상이 즉시 기본 단추 배경으로 변경됩니다. 어떻게이 동작을 재정의 할 수 있습니까? ?WPF 스타일 단추 MouseOver 질문

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; 

답변

24

this post에 따르면, 그 화려한 애니메이션과를 제거하려면, 당신은 당신의 ButtonControlTemplate을 재정의 할 필요 해요 내장되어 있습니다 :

이 내 코드입니다. 다행히도 그렇게 어렵지 않습니다. 나는 this post을 소스 자료로 사용하여 다음과 같은 아이디어를내는 Style을 제안했습니다.

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

업데이트 : 당신이 코드에서 Style 적용에 죽은 세트를이야 그리고 당신은 (그것을 할 아마 더 좋은 방법)을 ResourceDictionary을 사용하지 않으려면 , 당신은 동적으로 Style을로드 할 수 있습니다 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

나는 이것을 xaml을 통해 할 수 있지만 C#을 통해 할 수는 없다는 것을 알고있다. ??? – Luiscencio

+0

리소스 사전에 스타일을 넣은 다음 필요에 따라 단추에 적용 할 수 있습니다. –

+0

+1 업데이트를 시도해 보겠습니다. 유익한 감사가 나타납니다. – Luiscencio

4

ButtonChrome 테마를 재정의하는 것이 더 쉬울 것입니다.

템플릿을 생성하고 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> 

을 제거하고 그것을 해결해야

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

마우스 오버

의 자신의 처리를 추가! :)

+0

Microsoft_Windows_Themes를 등록하고,'xmlns : themes = "clr-namespace : Microsoft.Windows.Themes; assembly = PresentationFramework.Aero"를 추가하고 참조를 PresentationFramework.Aero로 프로젝트에 추가하는 방법을 언급해야합니다. – psulek