Style 클래스

정의

형식의 인스턴스 간에 공유할 수 있는 속성 setter를 포함합니다. Style은 일반적으로 리소스 컬렉션에서 선언되므로 공유되고 컨트롤 템플릿 및 기타 스타일을 적용하는 데 사용할 수 있습니다.

public ref class Style sealed : DependencyObject
/// [Windows.Foundation.Metadata.Activatable(Windows.UI.Xaml.IStyleFactory, 65536, Windows.Foundation.UniversalApiContract)]
/// [Windows.Foundation.Metadata.Activatable(65536, Windows.Foundation.UniversalApiContract)]
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
/// [Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
class Style final : DependencyObject
/// [Windows.Foundation.Metadata.ContractVersion(Windows.Foundation.UniversalApiContract, 65536)]
/// [Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
/// [Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
/// [Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
/// [Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
/// [Windows.Foundation.Metadata.Activatable(Windows.UI.Xaml.IStyleFactory, 65536, "Windows.Foundation.UniversalApiContract")]
class Style final : DependencyObject
[Windows.Foundation.Metadata.Activatable(typeof(Windows.UI.Xaml.IStyleFactory), 65536, typeof(Windows.Foundation.UniversalApiContract))]
[Windows.Foundation.Metadata.Activatable(65536, typeof(Windows.Foundation.UniversalApiContract))]
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
[Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
public sealed class Style : DependencyObject
[Windows.Foundation.Metadata.ContractVersion(typeof(Windows.Foundation.UniversalApiContract), 65536)]
[Windows.Foundation.Metadata.MarshalingBehavior(Windows.Foundation.Metadata.MarshalingType.Agile)]
[Windows.Foundation.Metadata.Threading(Windows.Foundation.Metadata.ThreadingModel.Both)]
[Windows.UI.Xaml.Markup.ContentProperty(Name="Setters")]
[Windows.Foundation.Metadata.Activatable(65536, "Windows.Foundation.UniversalApiContract")]
[Windows.Foundation.Metadata.Activatable(typeof(Windows.UI.Xaml.IStyleFactory), 65536, "Windows.Foundation.UniversalApiContract")]
public sealed class Style : DependencyObject
Public NotInheritable Class Style
Inherits DependencyObject
<Style .../>
-or-
<Style ...>
  oneOrMoreSetters
</Style>
상속
Object Platform::Object IInspectable DependencyObject Style
특성

Windows 요구 사항

디바이스 패밀리
Windows 10 (10.0.10240.0에서 도입되었습니다.)
API contract
Windows.Foundation.UniversalApiContract (v1.0에서 도입되었습니다.)

예제

이 예제에서는 두 가지 스타일을 만듭니다. 하나는 TextBlock 용이고 다른 하나는 TextBox용입니다. 각 스타일은 각 TextBlock 및 TextBox 에 대해 균일한 모양을 만들기 위해 컨트롤의 두 인스턴스에 적용 됩니다. 다음은 Style을 {StaticResource} 태그 확장으로 참조하여 각 컨트롤의 FrameworkElement.Style 속성을 설정하는 예제입니다. 이 예제에서는 리소스 사전에서 스타일을 검색하고 코드의 컨트롤에 적용하는 방법도 보여 있습니다.

각 스타일에는 여러 Setter 부분이 있습니다. 이 XAML에서는 XAML 속성 요소가 나타나지 않습니다 Style.Setters . 이 속성에 대한 XAML의 일반적인 사용법입니다. Style.SettersSetter는 Style의 XAML 콘텐츠 속성이므로 값은 암시적입니다. XAML 구문 및 XAML 콘텐츠 구문을 통해 특정 XAML 요소를 암시하고 생략하는 방법에 대한 자세한 내용은 XAML 구문 가이드를 참조하세요.

TextBox 스타일에서 Margin 속성은 4로 설정됩니다. 즉, TextBox의 모든 면에 여백이 4입니다. 첫 번째 TextBlock보다 짧은 두 번째 TextBlock의 길이를 보정하기 위해 이름보다 공간이 적기 때문에 두 번째 TextBoxMargin 속성에 "6,4,4,4" 값이 할당됩니다. 이렇게 하면 두 번째 TextBox 가 스타일이 지정한 것과 다른 여백을 가지므로 첫 번째 TextBox와 가로로 정렬됩니다.

<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>
private void ShowEmailAddressBox()
{
    TextBlock emailAddressLabel = new TextBlock();
    emailAddressLabel.Text = "Email:";
    emailAddressLabel.Style = (Style)rootPanel.Resources["TextBlockStyle"];

    TextBox emailAddressBox = new TextBox();
    emailAddressBox.Style = (Style)rootPanel.Resources["TextBoxStyle"];
    emailAddressBox.Margin = new Thickness(38, 4, 4, 4);

    emailAddressPanel.Children.Add(emailAddressLabel);
    emailAddressPanel.Children.Add(emailAddressBox);
}

이 예제에서는 두 가지 스타일 요소를 만듭니다. 첫 번째 스타일 요소의 TargetType은 TextBox로 설정되고 두 번째 스타일 요소의 TargetType은 Button으로 설정됩니다. 그런 다음 TextBox 컨트롤 및 단추 컨트롤에 대한 암시적 스타일로 적용됩니다.

<StackPanel>
    <StackPanel.Resources>
        <Style TargetType="TextBox">
            <Setter Property="Foreground" Value="Pink" />
            <Setter Property="FontSize" Value="15" />                
        </Style>
        
        <Style TargetType="Button">
            <Setter Property="Foreground" Value="Black" />
            <Setter Property="Background" Value="Yellow" />
        </Style>
    </StackPanel.Resources>
    
    <TextBox Height="30" Width="120" Margin="2" Text="TextBoxStyle" />
    <Button Height="30" Width="100" Margin="2" Content="ButtonStyle" />
</StackPanel>

이 예제에서는 BaseStyle이라는 Style을 기반으로 하는 InheritedStyle이라는 Style을 만듭니다. InheritedStyle은 BaseStyle에서 Yellow의 Background 값을 상속하고 포그라운드 값 Red를 추가합니다.

<StackPanel>
    <StackPanel.Resources>
        <Style x:Key="BaseStyle" TargetType="Button">
            <Setter Property="Background" Value="Yellow" />
        </Style>
        <!--Create a Style based on BaseStyle-->
        <Style x:Key="InheritedStyle" TargetType="Button" BasedOn="{StaticResource BaseStyle}">
            <Setter Property="Foreground" Value="Red" />
        </Style>
    </StackPanel.Resources>
    <!--A button with default style-->
    <Button Content="HelloWorld" />
    <!--A button with base style-->
    <Button Content="HelloWorld" Style="{StaticResource BaseStyle}" />
    <!--A button with a style that is inherited from the BaseStyle-->
    <Button Content="HelloWorld" Style="{StaticResource InheritedStyle}" />
</StackPanel>

설명

Style은 기본적으로 이러한 속성이 있는 특정 형식의 하나 이상의 인스턴스에 적용되는 속성 설정의 컬렉션입니다. Style에는 하나 이상의 Setter 개체 컬렉션이 포함되어 있습니다. 각 Setter 에는 속성이 있습니다. 속성은 스타일이 적용되는 요소의 속성 이름입니다. 은 속성에 적용되는 값입니다.

Style을 적용하려면 대상 개체가 DependencyObject여야 합니다. 각 Setter 가 속성 값으로 참조하는 속성 은 종속성 속성이어야 합니다.

Style을 만들 때 TargetType 속성을 설정해야 합니다. 그렇지 않으면 예외가 throw됩니다.

Style 및 요소에서 직접 동일한 속성에 대한 값을 설정하는 경우 요소에 설정된 값이 직접 우선합니다. 자세한 내용은 종속성 속성 개요, 특히 "종속성 속성 값 우선 순위" 섹션을 참조하세요.

스타일을 XAML 리소스로 정의

Style은 거의 항상 XAML에서 ResourceDictionary의 리소스로 정의됩니다.

  • 동일한 XAML 페이지에 정의된 다른 UI 항목에서만 사용되는 Style의 경우 일반적으로 FrameworkElement.Resources 컬렉션(Page.Resources 루트 요소가 Page인 경우)에서 Style을 정의합니다.
  • 앱에서 둘 이상의 페이지에서 사용되는 Style의 경우 일반적으로 Application.Resources 컬렉션에서 Style을 정의합니다. 또는 Application.ResourcesMergedDictionaries 값으로 포함하는 앱에 대한 별도의 XAML 파일이 있을 수 있습니다.
  • 대부분의 UI 요소에는 Windows 런타임 정의된 기본 스타일이 있습니다. 기본 스타일의 복사본은 generic.xaml이라는 디자인 도우미 XAML 파일에서 볼 수 있습니다. 이 파일은 기술적으로 앱의 리소스 파일이 아니지만 앱의 리소스 파일은 아닙니다. 도구에서 사용하도록 설정된 대로 스타일 복사본을 편집할 때 이 파일의 불연속 부분을 시작점으로 앱의 XAML에 복사할 수 있지만, 이러한 복사본을 만들면 Resources 컬렉션 중 하나에 포함되거나 MergedDictionaries를 통해 간접적으로 액세스되어야 합니다. 이러한 모든 경우 기본값을 재정의하는 수정된 XAML이 앱의 일부로 포함됩니다.

Windows 8 Windows 8 XAML에서 기존 컨트롤을 다시 템플릿하는 경우 대부분의 시작 앱 템플릿에 포함된 StandardStyles.xaml XAML 파일에 있는 Style 요소를 수정하는 경우가 있습니다. StandardStyles.xaml은 template app.xaml 파일에서 MergedDictionaries 원본 파일로 참조됩니다. Windows 8.1 시작하는 앱용 템플릿은 더 이상 StandardStyles.xaml을 사용하지 않습니다.

ResourceDictionary의 Style 정의 요소에는 x:Key 특성 또는 x:Name 특성이 필요하지 않습니다. 이 특성은 일반적으로 XAML 리소스가 되기 위한 요구 사항입니다. 이러한 방식으로 정의된 Style은 TargetType 속성 값을 암시적 키로 사용하고 암시적 스타일이라고 합니다.

XAML 리소스 사전을 사용하는 방법에 대한 자세한 내용은 ResourceDictionary 및 XAML 리소스 참조를 참조하세요.

스타일 및 템플릿

Style에서 Setter 를 사용하여 종속성 속성에 값을 적용할 수 있습니다. 그러나 일반적인 Style에서 대부분의 XAML 태그를 구성하는 Control 파생 클래스의 Template 속성에 대한 Setter입니다. SetterProperty="Template"Value는 거의 항상 ControlTemplate 개체 요소를 포함하는 속성 요소로 지정됩니다.

Style을 사용하여 컨트롤 템플릿을 정의하는 경우 Style 요소의 TargetTypeControl.Template setter에 대한 ControlTemplate 요소의 TargetType은 항상 동일한 값을 사용해야 합니다.

템플릿 setter는 해당 템플릿이 적용되는 컨트롤 instance 대한 기본 템플릿 UI 정의를 정의합니다. 또한 컨트롤에 대한 시각적 상태와 기본 테마 전환과 같은 기타 상태 기반 UI 정의도 포함됩니다. ListBox와 같은 복잡한 컨트롤의 경우 기본 템플릿 스타일 및 내 ControlTemplate에는 수백 줄의 XAML이 있을 수 있습니다. 컨트롤 템플릿 시나리오에서 Style의 역할에 대한 자세한 내용은 XAML 컨트롤 템플릿을 참조하세요.

컨트롤에 대한 템플릿에는 종종 논리적 상태에 대한 응답으로 컨트롤의 모양을 변경하는 시각적 상태가 포함됩니다. 예를 들어 단추 는 템플릿에서 새 시각적 상태를 적용하여 누를 때 다른 시각적 모양을 가질 수 있으며 모든 모양 변경은 코드가 아닌 XAML에서 올 수 있습니다. 시각적 상태의 작동 방식과 시각적 상태를 수정하거나 사용자 지정 컨트롤의 상태를 정의하는 방법에 대한 자세한 내용은 시각적 상태 및 XAML 컨트롤 템플릿에 대한 스토리보드 애니메이션을 참조하세요.

스타일 및 런타임 동작

런타임에 Style에 의해 설정된 개별 속성의 값을 변경할 수 있으며 새 값은 Setters 값을 덮어씁니다. 예를 들어 이 속성이 스타일에 의해 설정된 경우에도 런타임에 Template 속성을 설정할 수 있습니다.

런타임에 Style의 속성을 조정할 수 있지만 해당 스타일이 아무것도 적용되지 않고 암시적으로 사용되지 않는 리소스로만 존재하는 경우에만 가능합니다. 예를 들어 x:Key 특성이 있지만 해당 스타일을 참조하는 XAML의 다른 위치에 {StaticResource} 태그 확장 값이 없는 스타일에 대해 Setters의 컬렉션에 setter를 추가할 수 있습니다. 그러나 Style이 참조되고 로드된 개체의 값에 사용되는 즉시 Style은 봉인된 것으로 간주되어야 합니다. Style의 IsSealed 속성 값을 확인하여 봉인된 상태를 검색할 수 있습니다. true이면 스타일이 봉인되고 해당 스타일 또는 Setter 하위 값의 속성을 수정할 수 없습니다. Style이 참조되는 개체가 Loaded 이벤트를 발생시킬 때 스타일이 사용되고 봉인된 시점도 검색할 수 있습니다.

BasedOn 스타일

앱에서 정의한 기존 스타일 또는 Windows 런타임 컨트롤에 대한 기본 스타일을 기반으로 새 스타일을 빌드할 수 있습니다. BasedOn 속성을 사용하여 이 작업을 수행할 수 있습니다. 이렇게 하면 XAML의 중복이 줄어들고 리소스를 더 쉽게 관리할 수 있습니다. 각 스타일은 하나의 BasedOn 스타일만 지원합니다. 자세한 내용은 BasedOn 또는 스타일 지정 컨트롤을 참조하세요.

암시적 스타일

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

XAML 구문에 대한 참고 사항

Setter는 Style의 XAML 콘텐츠 속성이므로 와 같은 <Style><Setter .../><Setter .../></Style>암시적 컬렉션 구문을 사용할 수 있습니다.

코드에서 Style 클래스를 사용하는 경우(예: 생성자 호출 및 Setter 값을 하나씩 빌드) 매우 드뭅니다. 스타일은 템플릿에 사용되며 XAML 로드 시 템플릿을 사용할 수 있어야 하므로 코드에서 만든 모든 스타일은 일반적으로 너무 늦게 UI의 컨트롤에 적용할 수 없습니다.

생성자

Style()

초기 TargetType 및 빈 Setters 컬렉션 없이 Style 클래스의 새 instance 초기화합니다.

Style(TypeName)

지정한 초기 TargetType 및 빈 Setters 컬렉션을 사용하여 Style 클래스의 새 instance 초기화합니다.

속성

BasedOn

현재 스타일의 기준이 되는 정의된 스타일을 가져오거나 설정합니다.

Dispatcher

이 개체가 연결된 CoreDispatcher 를 가져옵니다. CoreDispatcher는 코드가 비 UI 스레드에서 시작된 경우에도 UI 스레드에서 DependencyObject에 액세스할 수 있는 기능을 나타냅니다.

(다음에서 상속됨 DependencyObject)
IsSealed

이 스타일이 읽기 전용이고 변경될 수 없는지 여부를 나타내는 값을 가져옵니다.

Setters

Setter 개체의 컬렉션을 가져옵니다.

TargetType

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

메서드

ClearValue(DependencyProperty)

종속성 속성의 로컬 값을 지웁니다.

(다음에서 상속됨 DependencyObject)
GetAnimationBaseValue(DependencyProperty)

애니메이션이 활성화되지 않은 경우 적용되는 종속성 속성에 대해 설정된 모든 기본 값을 반환합니다.

(다음에서 상속됨 DependencyObject)
GetValue(DependencyProperty)

DependencyObject에서 종속성 속성의 현재 유효 값을 반환합니다.

(다음에서 상속됨 DependencyObject)
ReadLocalValue(DependencyProperty)

로컬 값이 설정된 경우 종속성 속성의 로컬 값을 반환합니다.

(다음에서 상속됨 DependencyObject)
RegisterPropertyChangedCallback(DependencyProperty, DependencyPropertyChangedCallback)

DependencyObject instance 특정 DependencyProperty의 변경 내용을 수신 대기하기 위한 알림 함수를 등록합니다.

(다음에서 상속됨 DependencyObject)
Seal()

Setters 컬렉션의 TargetType 속성 또는 Setter를 변경할 수 없도록 스타일을 잠가줍니다.

SetValue(DependencyProperty, Object)

DependencyObject에서 종속성 속성의 로컬 값을 설정합니다.

(다음에서 상속됨 DependencyObject)
UnregisterPropertyChangedCallback(DependencyProperty, Int64)

RegisterPropertyChangedCallback을 호출하여 이전에 등록된 변경 알림을 취소합니다.

(다음에서 상속됨 DependencyObject)

적용 대상

추가 정보