Share via


Control.Template 속성

정의

컨트롤 템플릿을 가져오거나 설정합니다. 컨트롤 템플릿은 UI에서 컨트롤의 시각적 모양을 정의하고 XAML 태그에 정의됩니다.

public:
 property ControlTemplate ^ Template { ControlTemplate ^ get(); void set(ControlTemplate ^ value); };
ControlTemplate Template();

void Template(ControlTemplate value);
public ControlTemplate Template { get; set; }
var controlTemplate = control.template;
control.template = controlTemplate;
Public Property Template As ControlTemplate
<control Template="{StaticResource templateResourceKey}"/>
- or -
<Style TargetType="controlTypeName">
  <Setter Property="Template">
    <Setter.Value>
      <ControlTemplate TargetType="controlTypeName">
        templateRoot
      </ControlTemplate>
    </Setter.Value>
  </Setter>
</Style>

속성 값

컨트롤의 모양을 정의하는 템플릿입니다. ControlTemplate에는 정확히 하나의 루트 요소가 해당 콘텐츠로 있어야 합니다.

예제

이 예제에서는 Setter.Property 값이 "Template"인 StyleSetter로 정의된 보다 완전한 컨트롤 템플릿을 보여줍니다. RadioButton 컨트롤의 명명된 스타일입니다. 여기에는 일반적으로 기능 컨트롤 템플릿의 일부인 템플릿 요소(예: 템플릿의 루트 요소에 연결된 VisualStateManager.VisualStateGroups 연결된 속성 요소) 및 각 눈에 띄는 컨트롤 파트에 할당된 x:Name 특성 값이 포함됩니다.

<Style x:Key="TextRadioButtonStyle" TargetType="RadioButton"> 
    <Setter Property="MinWidth" Value="0"/> 
    <Setter Property="MinHeight" Value="0"/> 
    <Setter Property="Template"> 
        <Setter.Value> 
            <ControlTemplate TargetType="RadioButton"> 
                <Grid Background="Transparent"> 
                    <TextBlock 
                        x:Name="Text" 
                        Text="{TemplateBinding Content}" 
                        Margin="3,-7,3,10" 
                        TextWrapping="NoWrap" 
                        Style="{StaticResource SubheaderTextStyle}"/> 
                    <Rectangle 
                        x:Name="FocusVisualWhite" 
                        IsHitTestVisible="False" 
                        Stroke="{StaticResource FocusVisualWhiteStrokeThemeBrush}" 
                        StrokeEndLineCap="Square" 
                        StrokeDashArray="1,1" 
                        Opacity="0" 
                        StrokeDashOffset="1.5"/> 
                    <Rectangle 
                        x:Name="FocusVisualBlack" 
                        IsHitTestVisible="False" 
                        Stroke="{StaticResource FocusVisualBlackStrokeThemeBrush}" 
                        StrokeEndLineCap="Square" 
                        StrokeDashArray="1,1" 
                        Opacity="0" 
                        StrokeDashOffset="0.5"/> 

                    <VisualStateManager.VisualStateGroups> 
                        <VisualStateGroup x:Name="CommonStates"> 
                            <VisualState x:Name="Normal"/> 
                            <VisualState x:Name="PointerOver"> 
                                <Storyboard> 
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground"> 
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApplicationPointerOverForegroundThemeBrush}"/> 
                                    </ObjectAnimationUsingKeyFrames> 
                                </Storyboard> 
                            </VisualState> 
                            <VisualState x:Name="Pressed"> 

                                <Storyboard> 
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground"> 
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApplicationPressedForegroundThemeBrush}"/> 
                                    </ObjectAnimationUsingKeyFrames> 
                                </Storyboard> 
                            </VisualState> 
                            <VisualState x:Name="Disabled"> 
                                <Storyboard> 
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground"> 
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ButtonDisabledForegroundThemeBrush}"/> 
                                    </ObjectAnimationUsingKeyFrames> 
                                </Storyboard> 
                            </VisualState> 
                        </VisualStateGroup> 
                        <VisualStateGroup x:Name="FocusStates"> 
                            <VisualState x:Name="Focused"> 
                                <Storyboard> 
                                    <DoubleAnimation Duration="0" To="1" Storyboard.TargetName="FocusVisualWhite" Storyboard.TargetProperty="Opacity"/> 
                                    <DoubleAnimation Duration="0" To="1" Storyboard.TargetName="FocusVisualBlack" Storyboard.TargetProperty="Opacity"/> 
                                </Storyboard> 
                            </VisualState> 
                            <VisualState x:Name="Unfocused"/> 
                        </VisualStateGroup> 
                        <VisualStateGroup x:Name="CheckStates"> 
                            <VisualState x:Name="Checked"/> 
                            <VisualState x:Name="Unchecked"> 
                                <Storyboard> 
                                    <ObjectAnimationUsingKeyFrames Storyboard.TargetName="Text" Storyboard.TargetProperty="Foreground"> 
                                        <DiscreteObjectKeyFrame KeyTime="0" Value="{StaticResource ApplicationSecondaryForegroundThemeBrush}"/> 
                                    </ObjectAnimationUsingKeyFrames> 
                                </Storyboard> 
                            </VisualState> 
                            <VisualState x:Name="Indeterminate"/> 
                        </VisualStateGroup> 
                    </VisualStateManager.VisualStateGroups> 
                </Grid> 
            </ControlTemplate> 
        </Setter.Value> 
    </Setter> 
</Style> 

설명

위에 표시된 두 번째 XAML 구문은 Style의 일부로 Setter 구문입니다. 컨트롤의 템플릿 값이 거의 모든 경우에 정의되는 방식입니다.

TargetType 은 템플릿 값으로 사용되는 모든 ControlTemplate 요소에 필요한 특성입니다. style-setter 구문을 사용하는 경우 값은 템플릿용 Setter가 포함된 StyleTargetType 속성과 일치해야 합니다.

ControlTemplate컨트롤의 모양을 지정합니다. 컨트롤에 ControlTemplate이 없으면 컨트롤이 앱에 표시되지 않습니다. 컨트롤 작성자는 기본 컨트롤 템플릿을 정의하고 앱 작성자는 ControlTemplate XAML을 다시 템플릿화하여 컨트롤의 시각적 트리를 다시 정의할 수 있습니다.

컨트롤 템플릿은 일반적으로 XAML(Extensible Application Markup Language)에서 컨트롤별 암시적 스타일의 일부로 설정됩니다. 이 경우 SetterProperty 값은 문자열 "Template"으로 설정되고 Setter.Value 값은 ControlTemplate 개체 요소를 포함하는 속성 요소로 설정됩니다. 예를 들어 ScrollViewer에 대한 템플릿 값을 정의하는 스타일입니다. 이는 StyleResourceDictionary 에 있을 수 있지만 x:Key 특성이 필요하지 않은 암시적 스타일의 예입니다.

<ResourceDictionary>
  <Style TargetType="ScrollViewer">
  ...
    <Setter Property="Template">
      <Setter.Value>
        <ControlTemplate TargetType="ScrollViewer">
          <!--visual root of template for a ScrollViewer-->
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>
  ...
</ResourceDictionary>

스타일 및 템플릿

Style에서 Setter를 사용하여 종속성 속성에 값을 적용할 수 있습니다. 그러나 일반적인 Style에서 대부분의 XAML 태그를 구성하는 Control 파생 클래스의 Template 속성에 대한 Setter입니다. Style을 사용하여 컨트롤 템플릿을 정의하는 경우 Style 요소의 TargetType과 Control.Template setter에 대한 ControlTemplate 요소의 TargetType은 항상 동일한 값을 사용해야 합니다. 템플릿 setter는 해당 템플릿이 적용되는 컨트롤에 대한 기본 템플릿 UI 정의를 정의합니다. 또한 컨트롤에 대한 시각적 상태와 기본 테마 전환과 같은 기타 상태 기반 UI 정의도 포함됩니다. ListBox와 같은 복잡한 컨트롤의 경우 기본 템플릿 스타일 및 내 ControlTemplate에는 수백 줄의 XAML이 있을 수 있습니다. 템플릿의 역할에 대한 자세한 내용은 템플릿 제어 시나리오를 참조 하세요. 빠른 시작: 템플릿 제어를 참조하세요.

암시적 스타일

이러한 개체의 각 instance Style을 FrameworkElement.Style 값으로 구체적으로 참조하지 않고도 동일한 TargetType의 모든 개체에서 Style을 암시적으로 사용하도록 스타일을 정의할 수 있습니다. 리소스가 <Style>x:Key 특성 없이 ResourceDictionary에 선언되면 x:Key 값은 TargetType 속성의 값을 사용합니다. 스타일을 암시적으로 설정하는 경우 스타일은 TargetType 값에서 파생된 요소가 아니라 TargetType과 정확히 일치하는 형식에만 적용됩니다. 예를 들어 애플리케이션의 모든 ToggleButton 컨트롤에 대해 암시적으로 스타일을 만들고 애플리케이션에 ToggleButtonCheckBox 컨트롤(CheckBoxToggleButton에서 파생됨)이 있는 경우 "ToggleButton" 암시적 스타일은 ToggleButton 컨트롤에만 적용됩니다.

적용 대상

추가 정보