Style.TargetType 속성

정의

스타일이 의도된 형식을 가져오거나 설정합니다. 지정된 리소스 키가 없는 경우 TargetType을 사용하여 암시적 스타일 리소스를 선언할 수 있습니다.

public:
 property TypeName TargetType { TypeName get(); void set(TypeName value); };
TypeName TargetType();

void TargetType(TypeName value);
public System.Type TargetType { get; set; }
var typeName = style.targetType;
style.targetType = typeName;
Public Property TargetType As Type
<Style TargetType="typeName"/>

속성 값

스타일이 적용되는 개체의 형식입니다. 이 값은 일반적으로 코드가 아닌 XAML로 설정됩니다. 설명 부분을 참조하세요.

예제

다음은 TextBlockTextBox의 두 가지 스타일을 만드는 예제입니다. 각 스타일은 각 TextBlockTextBox에 대해 균일한 모양을 만들기 위해 컨트롤의 두 인스턴스에 적용됩니다. 다음은 Style을 {StaticResource} 태그 확장으로 참조하여 각 컨트롤의 FrameworkElement.Style 속성을 설정하는 예제입니다.

<StackPanel x:Name="rootPanel">
  <StackPanel.Resources>
    <!--Create a Style for a TextBlock to specify that the
              Foreground equals Navy, FontSize equals 14, and
              VerticalAlignment equals Botton.-->
    <Style TargetType="TextBlock" x:Key="TextBlockStyle">
      <Setter Property="Foreground" Value="Navy"/>
      <Setter Property="FontSize" Value="14"/>
      <Setter Property="VerticalAlignment" Value="Bottom"/>
    </Style>

    <!--Create a Style for a TextBox that specifies that
              the Width is 200, Height is 30, Margin is 4,
              Background is LightBlue, and FontSize is 14.-->
    <Style TargetType="TextBox" x:Key="TextBoxStyle">
      <Setter Property="Width" Value="200"/>
      <Setter Property="Height" Value="30"/>
      <Setter Property="Margin" Value="4"/>
      <Setter Property="FontSize" Value="14"/>
      <Setter Property="Background">
        <Setter.Value>
          <LinearGradientBrush StartPoint="0,0.5" EndPoint="1,0.5">
            <GradientStop Color="White" Offset="0.0"/>
            <GradientStop Color="LightBlue" Offset="0.5"/>
            <GradientStop Color="Navy" Offset="1"/>
          </LinearGradientBrush>
        </Setter.Value>
      </Setter>
    </Style>
  </StackPanel.Resources>

  <!--Apply the TextBlockStyle and TextBoxStyle to each 
      TextBlock and TextBox, respectively.-->
  <StackPanel Orientation="Horizontal">
    <TextBlock Text="First Name:" Style="{StaticResource TextBlockStyle}"/>
    <TextBox Style="{StaticResource TextBoxStyle}"/>
  </StackPanel>
  <StackPanel Orientation="Horizontal">
    <TextBlock Text="Last Name:" Style="{StaticResource TextBlockStyle}"/>
    <TextBox Style="{StaticResource TextBoxStyle}"
             Margin="6,4,4,4"/>
  </StackPanel>
  <StackPanel x:Name="emailAddressPanel" Orientation="Horizontal"/>
</StackPanel>

설명

Style을 사용하거나 선언하는 모든 경우에 TargetType 값이 필요합니다. 기본값은 없습니다. FrameworkElement.Style 속성의 인라인 값으로 사용되는 Style에도 명시적 TargetType 값이 필요합니다.

TargetType 값을 지정하는 일반적인 방법은 Style 요소의 XAML 특성을 사용하는 것입니다. XAML에서 설정하는 경우 TargetType의 의미와 제공하는 값은 XAML에서 형식이 표현되는 방식의 몇 가지 측면을 사용합니다.

XAML의 경우 XAML 요소 사용을 통해 형식을 참조하는 데 필요한 접두사는 TargetType 특성 값에 포함되어야 합니다. 예를 들어 스타일이 "local:" 접두사에 매핑된 코드 네임스페이스에 정의된 사용자 지정 형식을 대상으로 하는 경우 해당 형식의 스타일에 대한 TargetType 특성 값은 형식 이름 앞에 동일한 접두사를 포함해야 합니다. 이 동작은 Windows 런타임 XAML 파서의 기본 제공 문자열 형식 변환 동작에 의해 활성화됩니다.

사용자 지정 형식에 대한 스타일을 정의할 때 TargetType에 대한 매핑 접두사를 포함하면 해당 Style에 있는 Setter속성 값에 접두사를 포함하지 않습니다.

TargetType에 제공하는 값은 스타일 내에서 지정한 Setter.Property 값에 대한 조회 동작을 수정합니다. 특히 Setter.Property XAML 특성 값의 이름으로 참조하는 종속성 속성은 TargetType 형식 또는 상위 클래스에 존재해야 합니다. 예를 들어 지정한 TargetType이 Button이고 StyleSetter.Property XAML 특성 값 중 하나가 "Background"이면 Control.Background 속성으로 확인됩니다(Control은 클래스 상속에서 Button 위의 세 수준이고 ButtonControl의 모든 속성을 상속합니다). 일반적으로 TargetType 값을 일반적인 UI 태그에서 사용하는 것과 동일한 UI 요소 이름으로 지정하는 것이 일반적입니다. 일반적으로 상위 클래스의 이름을 지정하지는 않습니다(기술적으로 허용됨).

Style에 컨트롤 템플릿(Template 속성의 값)을 선언하는 Setter가 포함된 경우 부모 Style의 TargetType 값은 포함된 ControlTemplate 요소의 TargetType 값과 일치해야 합니다.

암시적 스타일

스타일은 거의 항상 해당 스타일을 참조하는 앱의 각 UI 요소에 공유되고 적용되는 XAML 리소스로 선언됩니다. 리소스로 선언하려면 Style 요소를 포함한 모든 XAML 요소에는 런타임에 조회할 각 리소스를 구분하는 키가 리소스 컬렉션 내에 있어야 합니다. Style 요소(및 ControlTemplate와 같은 다양한 템플릿 요소)는 암시적 스타일이라는 기능을 지원합니다. 암시적 스타일의 경우 TargetType 값에 제공하는 값은 리소스 컬렉션 scope 해당 스타일의 키 역할을 하며 x:Key 특성 값을 지정할 필요가 없습니다. 반면 리소스 컬렉션 내에서 선언하는 대부분의 다른 요소에는 명시적 x:Key 특성 값이 필요하며 이를 적용하는 디자인 타임 또는 파서 오류가 발생합니다.

암시적 스타일을 사용하여 선언된 스타일은 암시적 스타일의 TargetType과 일치하는 형식인 instance 모든 UI 요소의 Style 값으로 사용됩니다. 컨트롤은 이 동작을 가져오기 위해 Style 특성 값과 {StaticResource} 태그 확장 참조가 있는 스타일을 참조할 필요가 없으며, 이러한 컨트롤이 기존 암시적 스타일의 형식과 일치하는 경우 암시적 동작입니다.

암시적 스타일은 TargetType 값으로 참조되는 형식의 하위 형식인 요소에는 적용되지 않습니다. 예를 들어 ToggleButton 컨트롤에 대한 암시적 스타일을 선언하고 앱에 CheckBox 컨트롤(CheckBoxToggleButton에서 파생됨)이 있는 경우 스타일은 특히 ToggleButton 컨트롤에 적용되지만 CheckBox 컨트롤에는 적용되지 않습니다.

Windows 런타임 Windows 런타임 API의 일부인 모든 실제 UI 요소에 대한 기본 암시적 스타일을 정의합니다. 이러한 스타일은 요소(특히 템플릿)에 대한 시각적 개체를 정의하고 시각적 개체가 없는 요소는 UI에 표시되거나 레이아웃에 참여하지 않기 때문에 이 작업을 수행해야 합니다. 이러한 모든 암시적 스타일은 generic.xaml이라는 디자인 도우미 XAML 파일에서 볼 수 있습니다. XAML을 편집하는 데 사용하는 도구는 도구에서 사용하도록 설정된 스타일 복사본을 편집할 때 시작점으로 이 파일의 개별 부분을 앱의 XAML에 복사할 수 있습니다. 기본 암시적 스타일 내에는 {ThemeResource} 태그 확장 및 테마별 브러시 또는 기타 리소스를 사용하는 테마 지원뿐만 아니라 많은 리소스 참조 계층이 있습니다. Windows 런타임 기본 암시적 스타일을 정의하는 암시적 스타일을 재정의할 수 있습니다. 자세한 내용은 빠른 시작: 컨트롤 스타일 지정빠른 시작: 컨트롤 템플릿을 참조하세요.

코드에서 TargetType 사용

코드에서 TargetType을 설정하는 것은 일반적이지 않습니다. XAML 스타일 시스템은 XAML을 리소스로 로드하고 스타일의 모든 측면을 미리 준비하는 데 사용됩니다. 코드에서 만들거나 참조하는 스타일 에서 TargetType을 설정해야 하는 런타임까지 컨트롤의 스타일을 지정하거나 스타일을 적용하는 방법에 대한 정보를 모르는 시나리오는 거의 없습니다.

코드에서 TargetType을 가져오는 것은 일반적이지 않지만 이 작업을 수행하는 몇 가지 시나리오가 더 있을 수 있습니다. 예를 들어 XAML에 이미 정의된 명명된 Style 리소스 집합이 있을 수 있습니다. 그러나 컨트롤에 적용하려는 스타일에 적용하려는 컨트롤의 형식에 대해 작동하는 TargetType 값이 있음을 두 번 검사 수 있습니다. 따라서 다음과 같은 코드가 있을 수 있습니다.

private bool VerifyStyle(FrameworkElement scope, String styleKey, Control applyTo)
{
    Style styleToCheck = scope.Resources[styleKey] as Style;
    if (styleToCheck != null)
    {
        if (styleToCheck.TargetType == applyTo.GetType())
        {
            // applyTo.Style = styleToCheck;
            return true;
        }
    }
    return false;
}

Microsoft .NET 언어(C# 또는 Microsoft Visual Basic)를 사용하여 프로그래밍하는 경우 TypeName 형식은 System.Type으로 프로젝트합니다. C#C#을 사용하여 프로그래밍하는 경우 일반적으로 typeof 연산자를 사용하여 형식 이름을 문자열로 기반으로 하는 형식의 System.Type 에 대한 참조를 가져옵니다. Microsoft Visual Basic에서 GetType을 사용합니다.

마이그레이션 정보

  • WPF(Windows Presentation Foundation용 XAML)를 사용한 경우 x:Type 태그 확장을 사용하여 System.Type을 사용하는 XAML 값을 입력했을 수 있습니다. Windows 런타임 XAML 파서는 x:Type을 지원하지 않습니다. 대신 태그 확장을 사용하지 않고 이름으로 형식을 참조해야 하며 필요한 XAML-지원 형식 변환은 이미 XAML 파서의 기본 제공 변환 동작에 의해 처리됩니다.

적용 대상