2017-12-29 30 views
2

나는 wpf에서 xaml의 과도한 자세한 표시에 의아해합니다. 예 : 컨트롤 템플릿을 정의 할 때 대상 유형을 컨트롤 자체로 지정해야합니다. TargetType을 지정해야합니까? TargetControl의 템플릿 요소를 정의 할 때 지정하지 않으면 TargetControl이 기본값이 아닌가?WPF 제어 템플릿 : Why TargetType이 필요한 이유는 무엇입니까?

<local:TargetControl Width="100" Height="100"> 
<local:TargetControl.Template> 
    <ControlTemplate TargetType="local:TargetControl"> 
     <Grid> 
     <Ellipse x:Name="PART_Target" Fill="Blue" /> 
     <Grid> 
    </ControlTemplate> 
</local:TargetControl.Template> 
</local:TargetControl> 

답변

2

마크 업 <ControlTemplate> </ControlTemplate> 새로운 ControlTemplate이 인스턴스가 기본 생성자 (new ControlTemplate())를 사용하여 만들 수 있음을 의미합니다. 생성자는 템플릿을 사용할 요소를 인식하지 못합니다. 이 TemplateBinding 초 동안 어떤 TargetControl - 특정 속성을 사용하지 않기 때문에이 예에서

<ControlTemplate TargetType="local:TargetControl"> 
    <Grid> 
    <Ellipse x:Name="PART_Target" Fill="Blue" /> 
    <Grid> 
</ControlTemplate> 

템플릿은 TargetType없이 사용할 수 있습니다. TemplateBindings가 필요한 경우 TargetType도 설정해야합니다.

대부분의 경우 요소 템플릿은 요소 유형과 동일한 TargetType을가집니다.

하지만 예외적 인 경우가 있습니다. 예 : RadioButtons 및 CheckBoxes가 색상이있는 원처럼 보이기를 원합니다 - 선택하면 녹색, 선택하지 않으면 회색입니다.

의 RadioButton 및 확인란 ToggleButton을에서 파생, 그래서 ToggleButton을위한 템플릿을 생성하고 내 RadioButtons를 체크 박스에 적용

:

<StackPanel> 
    <StackPanel.Resources> 
     <ControlTemplate TargetType="{x:Type ToggleButton}" x:Key="Toggle"> 
      <Border Name="btn" BorderBrush="Black" Background="Gainsboro" 
        Width="28" Height="28" CornerRadius="14" /> 

      <ControlTemplate.Triggers> 
       <Trigger Property="IsChecked" Value="True"> 
        <Setter Property="Background" TargetName="btn" Value="Lime" /> 
       </Trigger> 
      </ControlTemplate.Triggers> 
     </ControlTemplate> 
    </StackPanel.Resources> 

    <CheckBox Template="{StaticResource Toggle}" /> 
    <RadioButton Template="{StaticResource Toggle}" /> 
    <RadioButton Template="{StaticResource Toggle}" /> 
</StackPanel> 

이 예는 ControlTemplate이 특정 요소에 연결하지 않고 리소스 사전에 정의 된 상황을 보여줍니다 , TargetType을 유추 할 수 없습니다.

TargetType이 확실하지 않거나 필요하지 않은 경우가 3 건 이상입니다. 따라서 개발자는 항상 콘크리트 유형을 제공해야합니다.