2012-03-28 5 views
0

ControlTemplates의 복잡한 작동을 고백해야합니다. 아직 책을 쓸 준비가되어 있지 않습니다. : O)ControlTemplate에서 작동하지 않을 수 있습니다.

어쨌든, 저는 고객의 HMI (휴먼 머신 인터페이스)의 요구 사항에 맞게 사용자 정의 버튼을 작성했습니다. 물론 사용자를위한 ControlTemplate을 제공했습니다. 그것.

버튼은 항상 검은 그림자를 표시하지만 마우스가 위로 가져갈 때와 같이 버튼이 "뜨거워"질 때 그림자가 변경되도록하고 싶습니다 (버튼 클래스 - HmiToolbarButton - 속성은 "IsHot").

다음은 (비 작동) 템플릿입니다 :

<Style TargetType="{x:Type local:HmiToolbarButton}"> 
    <Setter Property="AutoSize" Value="False" /> 
    <Setter Property="HotBehaviorNormal" Value="True" /> 
    <Setter Property="HorizontalAlignment" Value="Center" /> 
    <Setter Property="BorderThickness" Value="0" /> 
    <Setter Property="Template"> 
     <Setter.Value> 
      <ControlTemplate TargetType="{x:Type local:HmiToolbarButton}"> 
       <Grid x:Name="_grd"> 
        <Border 
         Background="{TemplateBinding Background}" 
         BorderBrush="{TemplateBinding BorderBrush}" 
         BorderThickness="{TemplateBinding BorderThickness}" 
         > 
         <ContentPresenter x:Name="PART_CONTENT" /> 
        </Border> 
        <local:ButtonHotDecorator IsHitTestVisible="False" IsChecked="{TemplateBinding IsChecked}" IsMouseOver="{TemplateBinding IsHot}" IsEnabled="{TemplateBinding HotBehaviorNormal}" /> 
        <Grid.Effect> 
         <DropShadowEffect ShadowDepth="0" Opacity="0.9" BlurRadius="10" Color="{TemplateBinding DropShadowColor}" /> 
        </Grid.Effect> 
       </Grid> 
       <ControlTemplate.Triggers> 
        <Trigger Property="IsHot" Value="True"> 
         <Setter TargetName="_grd" Property="Effect"> 
          <Setter.Value> 
           <!-- *** PROBLEM HERE *** --> 
           <DropShadowEffect 
            ShadowDepth="0" Opacity="0.9" BlurRadius="10" 
            Color="{TemplateBinding HotDropShadowColor}" 
            /> 
          </Setter.Value> 
         </Setter> 
        </Trigger> 
       </ControlTemplate.Triggers> 
      </ControlTemplate> 
     </Setter.Value> 
    </Setter> 
</Style> 

검은 그림자가 작품을 좋아하지만 버튼 위에 마우스를 이동할 때 나는 전혀 효과를 얻을 수 없습니다. 나는 그것이 일정한 색으로 바뀌면 효과가 예상대로 표시되기 때문에 그것이 작동하지 않는 것으로 생각한다. TemplateBinding.

힌트를 보내 주시면 감사하겠습니다.

감사합니다.

답변

3

간혹 TemplateBinding이 템플릿 자체에 직접 위치하지 않을 때 문제가 해결되는 경우가 있습니다. 여기에서는 Trigger 내부의 Setter 내부에 새 객체 인스턴스화에이 객체를 사용하므로 문제가있을 수 있습니다. 트리거의 관계 소스 대신 RelativeSource를 사용해보십시오.

<DropShadowEffect 
    ShadowDepth="0" Opacity="0.9" BlurRadius="10" 
    Color="{Binding RelativeSource={RelativeSource TemplatedParent}, Path=HotDropShadowColor}" 
    /> 
+0

고마워요, 그게 다예요. 나는 템플릿을 읽을 필요가 있다는 것을 알지만 어디서나 좋은 문서를 찾기 란 어렵다. 하나 또는 두 개의 자원을 추천 할 수 있습니까? 대단히 감사하겠습니다. 건배! –

+0

WPF Control Development Unleashed는 컨트롤과 관련된 모든 것을 다루고 있지만 VisualStateManager 및 비헤이비어와 같은 최신 항목이 빠져 있다고 생각합니다. –

관련 문제