2013-06-29 8 views
6

호버시 xaml에서 버튼 스타일의 배경색을 변경하려고합니다. 이것이 현재 접근 방식이지만 작동하지 않습니다. 기본 호버 색상은 당신이 이것을 달성 할 수있는 컨트롤 템플릿을 오버라이드 (override) 할 필요가 있다고 다른 솔루션을 본 적이 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의 특성 RenderMouseOverRenderPressed에 바인딩으로 정의된다 . ButtonChrome이 설계된 방식으로 Background 속성의 모든 값보다 우선합니다. 따라서 불행하게도 클릭되거나 강조 표시된 버튼의 배경색을 덮어 쓰는 유일한 방법은 템플릿을 덮어 쓰는 것입니다.

+1

이가 다른 하나보다 더 나은 해답이라고 생각 왜이 예는 ... 작동하지 않는 이유는 무엇입니까? 그 중 하나가 작동 중입니다 ... –

+5

@ 본디이 답변은 "작동"하지 않아서, "왜"라는 질문에 대답하고 문제를 완전히 해결하는 방법을 알려 주어야합니다. 수용된 대답은 "효과가 있지만, 극히 제한된 경우에만 가능하며 더 복잡한 것이 필요한 경우에는 도움이되지 않습니다. 더 자세한 분석은 다른 질문에 대한 나의 코멘트입니다. TL : DR : 단순히 복사하여 붙여 넣기하지 마십시오. 이해하고 스스로 해보려고 노력하십시오. – 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

관련 문제