2013-05-04 3 views
1

ControlTemplate으로 정의 된 사용자 정의 모양의 Button이 있습니다.트리거를 사용한 WPF 버튼 동작

이 포함되어 있으며 Path이 포함되어 있습니다. 나는 마우스 상태에 따라 Path.Opacity에 변경 내용을 추가하고 싶습니다 :

  • 기본 - 이상 누르지 0.5
  • 마우스 - 이상 누르면 1.0
  • 마우스 - 0.5

첫 번째 경우 로컬 값 Path.Opacity0.5으로 설정하고 에 대해 Trigger을 추가하여 간단하게 다룹니다.

<Button x:Class="ImagingShop.Panosphere.Controls.PathButton" 
      xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
      xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
      xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" 
      xmlns:d="http://schemas.microsoft.com/expression/blend/2008" 
      mc:Ignorable="d" 
      d:DesignHeight="100" d:DesignWidth="100" 
     Name="pathButton"> 

    <Button.Template> 
     <ControlTemplate> 
      <Canvas Background="Transparent" Width="{TemplateBinding Width}" Height="{TemplateBinding Width}"> 
       <Canvas.Style> 
        <Style TargetType="Canvas"> 
         <Setter Property="Path.Opacity" Value="0.5"/> 
         <Style.Triggers> 
          <Trigger Property="IsMouseOver" Value="True"> 
           <Setter Property="Path.Opacity" Value="1.0"/> 
          </Trigger> 
         </Style.Triggers> 
        </Style> 
       </Canvas.Style> 
       <Path Data="{Binding ElementName=pathButton, Path=PathData}" Stretch="Uniform" Fill="#FFFFFFFF" Width="{TemplateBinding Width}" Height="{TemplateBinding Width}"/> 
      </Canvas> 
     </ControlTemplate> 
    </Button.Template> 

    <Grid> 

    </Grid> 
</Button> 

그러나 세 번째 경우는 작동하지 않습니다. 나는 다음과 같은 트리거를 추가 한 :

<MultiTrigger> 
    <MultiTrigger.Conditions> 
     <Condition Property="IsMouseOver" Value="True"/> 
     <Condition Property="Button.IsPressed" Value="True"/> 
    </MultiTrigger.Conditions> 
    <Setter Property="Path.Opacity" Value="0.75"/> 
</MultiTrigger> 

그래서이 마우스 버튼을 누를 때 버튼 위에 놓을 Path.Opacity입니다 0.75에 설정해야합니다.

불투명도가 0.75 대신 0.5으로 변경되었으므로이 문제로 고민했습니다. 트리거는 적용 할 것 같지만에 트리거를 예상대로 왜 그냥 ButtonOpacity 사용하지 않는 ...

+0

그래서 XAML을 사용하여 버튼을 다시 스타일화할 수 없습니까? Button.IsPressed가 작동해야합니다. [XAML 예제] (http://msdn.microsoft.com/en-us/library/system.windows.controls.primitives.buttonbase.ispressed.aspx)가 있습니다. . – Libor

답변

1

작동하고 있지 않는 ButtonStyle 직접 귀하의 ControlTemplatePath하지만 아무것도하지 않습니다 어쨌든.

<Style TargetType="{x:Type local:PathButton}"> 
    <Setter Property="Opacity" 
      Value=".5" /> 
    <Setter Property="OverridesDefaultStyle" 
      Value="True" /> 
    <Setter Property="Template"> 
    <Setter.Value> 
     <ControlTemplate TargetType="{x:Type local:PathButton}"> 
     <Canvas Width="{TemplateBinding Width}" 
       Height="{TemplateBinding Width}" 
       Background="Transparent"> 
      <Path Width="{TemplateBinding Width}" 
       Height="{TemplateBinding Width}" 
       Data="{Binding ElementName=pathButton, 
           Path=PathData}" 
       Fill="#FFFFFFFF" 
       Opacity="{TemplateBinding Opacity}" 
       Stretch="Uniform" /> 
     </Canvas> 
     </ControlTemplate> 
    </Setter.Value> 
    </Setter> 
    <Style.Triggers> 
    <Trigger Property="IsMouseOver" 
       Value="True"> 
     <Setter Property="Opacity" 
       Value="1" /> 
    </Trigger> 
    <Trigger Property="IsPressed" 
       Value="True"> 
     <Setter Property="Opacity" 
       Value=".75" /> 
    </Trigger> 
    </Style.Triggers> 
</Style> 

출력을 기대합니다.

업데이트 :

당신은 단지 ResourceDictionary에서 Style이 있고 코드 숨김 파일의 서브 클래스 선언을 할 수 있습니다. 그러면 하나의 xaml 파일 만 생성됩니다. 이 방법에서는 2 개의 xaml 파일이 남아 있지 않습니다.

PathData의 바인딩을 RelativeSource 바인딩으로 전환했습니다.

Here에서 샘플을 다운로드 할 수 있습니다. 열기 및 체크 아웃

또한 vsproj 파일을 편집하고 DependsOn 속성을 추가하여 파일을 사용자 지정 그룹으로 그룹화 할 수있는 추가 기능 NestIn을 사용했습니다. 이를 통해 UserControlWindow이 코드 숨김 파일로 IDE를 찾는 모양과 마찬가지로 ResourceDictionary과 코드 숨김 클래스 파일을 하나의 엔터티 PathButton.xaml으로 그룹화 할 수 있습니다.

+0

OK이 부분적으로 작동하지만 PathButton 외부에서 전체 스타일을 이동해야했습니다.xaml 코드 - 내부에 갖고 싶었던 이유는'{TemplateBinding PathData}'가 작동하지 않고'{Binding ElementName = pathButton, Path = PathData} '만이 작동한다는 것입니다. PathData는 String 유형의 일반 종속성 속성입니다. 스타일은 이제 마법 상수 인 일부 요소 이름을 참조하며 가능한 한 자체 포함 된 코드를 갖기를 원합니다 (단일 XAML 파일이 가장 좋을 것입니다 ...). 모든 사용자 지정 컨트롤에 적어도 두 개의 XAML 파일 (코드 용과 스타일 용)이있는 경우 코드가 흩어져 있습니다. – Libor

+0

@Libor 작은 설명과 드롭 다운 다운로드에 대한 링크로 내 대답을 업데이트했습니다. 한 xaml 파일에서이 구조를 구성하는 방법과 PathData에 TemplateBinding 대신 RelativeSource 바인딩을 사용하는 방법을 살펴보고 살펴볼 수 있습니다. 그것을 다운로드하고 자신을 찾으십시오. – Viv

+0

감사합니다. 이제 그것은 매력처럼 작동합니다. 먼저 Button.Style 안에 PathButton 스타일을 추가하려고했지만 스타일이 PathButton이 아닌 Button을 대상으로하기 때문에이 유형 불일치가 발생했습니다. 코드 덕분에 스타일 자체를 제외하고는 버튼에 XAML이 필요 없다는 것을 알게되었습니다. WPF 컨트롤 속성을 원활하게 작동하기 때문에 TemplateBindingExtension에 대해 혼란 스럽다.하지만 사용자 지정 컨트롤 속성이 전혀 작동하지 않는다. 적어도 글쎄, 적어도 솔루션은있다. (TemplateBinding만큼 단순하고 우아하지는 않지만). – Libor