Style 클래스

정의

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

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

예제

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

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

TextBox의 스타일에서 Margin 속성은 4로 설정됩니다. 즉, 모든 면에 여백이 TextBox 4입니다. 번째 TextBlock의 길이를 보정하기 위해 성은 이름보다 공간이 적기 때문에 첫 번째 TextBlock 텍스트 블록보다 짧으므로 두 번째 TextBox의 속성에 "6,4,4,4"의 값이 할당됩니다Margin. 이렇게 하면 두 번째 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설정됩니다. 그런 다음 컨트롤 및 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을 기반으로 하는 명명된 InheritedStyleStyle 만듭니다.Style InheritedStyle은 의 BackgroundYellowBaseStyle 값을 상속하고 값을 Red추가합니다.Foreground

<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 에는 속성 과 값이 있습니다. 는 Property 스타일이 적용되는 요소의 속성 이름입니다. 는 Value 속성에 적용되는 값입니다.

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

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

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

스타일을 XAML 리소스로 정의

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

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

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

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

스타일 및 템플릿

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

Style 를 사용하여 컨트롤 템플릿을 정의하는 경우 요소의 StyleTargetTypeControl.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 의 값에 사용되는 즉시 는 봉인된 것으로 간주되어야 합니다. 의 IsSealed 속성 값을 확인하여 봉인된 상태를 검색할 Style수 있습니다. true인 경우 스타일이 봉인되고 해당 스타일 또는 Setter 하위 값의 속성을 수정할 수 없습니다. 스타일이 사용되고 봉인된 시점은 가 참조되는 개체가 StyleLoaded 이벤트를 발생시킬 때 검색할 수도 있습니다.

BasedOn 스타일

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

암시적 스타일

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

XAML 구문에 대한 참고 사항

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

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

생성자

Style()

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

Style(TypeName)

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

속성

BasedOn

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

Dispatcher

항상 Windows 앱 SDK 앱에서 를 반환 null 합니다. 대신 DispatcherQueue 를 사용합니다.

(다음에서 상속됨 DependencyObject)
DispatcherQueue

DispatcherQueue 이 개체가 연결된 을 가져옵니다. 는 DispatcherQueue 코드가 비 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)

적용 대상

추가 정보