WPF에서 스타일(Style)은 애플리케이션 전반에 걸쳐 일관된 모양을 구현하고 속성 설정을 재사용하는 강력한 메커니즘입니다. 다음은 스타일 정의의 핵심 개념 및 활용법에 대한 요약입니다.
1. 기본 구조
<Style TargetType="대상컨트롤유형" x:Key="스타일키이름">
<Setter Property="속성이름" Value="속성값"/>
<Setter Property="속성이름" Value="속성값"/>
<!-- 다른 Setter 또는 Triggers -->
</Style>
TargetType: 스타일에 적용될 컨트롤의 유형을 지정합니다 (예:Button,TextBlock).x:Key: 스타일의 고유 식별자입니다 (명시적으로 참조할 때 필요).Setter: 대상 컨트롤의 속성 값을 설정합니다.
2. 정의 위치
(1) 지역 리소스
<Window.Resources>
<Style TargetType="Button" x:Key="RedButtonStyle">
<Setter Property="Background" Value="Red"/>
<Setter Property="Foreground" Value="White"/>
</Style>
</Window.Resources>
- 적용 범위: 현재 창 또는 사용자 컨트롤.
(2) 전역 리소스 (App.xaml)
<Application.Resources>
<Style TargetType="Button" x:Key="GlobalButtonStyle">
<Setter Property="FontSize" Value="16"/>
</Style>
</Application.Resources>
- 적용 범위: 전체 애플리케이션.
(3) 외부 리소스 사전
<ResourceDictionary>
<Style TargetType="TextBox" x:Key="TextBoxStyle">
<Setter Property="BorderBrush" Value="Blue"/>
</Style>
</ResourceDictionary>
App.xaml에서 포함:
<Application.Resources>
<ResourceDictionary Source="Styles/Styles.xaml"/>
</Application.Resources>
3. 스타일 유형
(1) 명시적 스타일
x:Key를 통해 명시적으로 참조:
<Button Style="{StaticResource RedButtonStyle}" Content="Click"/>
(2) 암시적 스타일
x:Key를 생략하면 TargetType으로 지정된 모든 컨트롤에 자동으로 적용됩니다:
<Style TargetType="Button"> <!-- 모든 Button에 자동으로 이 스타일이 적용됩니다 -->
<Setter Property="Margin" Value="10"/>
</Style>
4. 스타일 상속
BasedOn을 사용하여 기존 스타일을 상속합니다:
<Style x:Key="BaseButtonStyle" TargetType="Button">
<Setter Property="FontSize" Value="14"/>
</Style>
<Style x:Key="DerivedButtonStyle"
TargetType="Button"
BasedOn="{StaticResource BaseButtonStyle}">
<Setter Property="Foreground" Value="Green"/>
</Style>
5. Triggers
속성 또는 이벤트 변경에 동적으로 반응합니다:
(1) 속성 트리거
<Style TargetType="Button">
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="Yellow"/>
</Trigger>
</Style.Triggers>
</Style>
(2) 데이터 트리거
<DataTrigger Binding="{Binding IsError}" Value="True">
<Setter Property="Foreground" Value="Red"/>
</DataTrigger>
(3) 이벤트 트리거
<EventTrigger RoutedEvent="MouseEnter">
<BeginStoryboard>
<Storyboard>
<DoubleAnimation Storyboard.TargetProperty="Opacity" To="0.5"/>
</Storyboard>
</BeginStoryboard>
</EventTrigger>
6. 기본 스타일 재정의
TargetType을 통해 컨트롤의 기본 모양을 재정의합니다:
<Style TargetType="Button">
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<!-- 사용자 지정 버튼 템플릿 -->
<Border Background="{TemplateBinding Background}" CornerRadius="5">
<ContentPresenter HorizontalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
</Style>
7. 모범 사례
- 재사용성: 공통 스타일은
App.xaml또는 리소스 사전에 정의합니다. - 계층 구조:
- 지역 리소스 > 전역 리소스 (지역 스타일이 우선 적용됩니다).
- 명시적 스타일 > 암시적 스타일.
- 성능: 스타일 내에서 복잡한 애니메이션을 빈번하게 트리거하지 않도록 합니다.
- 테마 지원:
ThemeResource와 결합하여 동적 테마 전환을 구현합니다:<Setter Property="Background" Value="{DynamicResource PrimaryBrush}"/>
예제: 전체 스타일 정의
<Style x:Key="ModernButton" TargetType="Button">
<!-- 기본 속성 -->
<Setter Property="Background" Value="#3498db"/>
<Setter Property="Foreground" Value="White"/>
<Setter Property="FontSize" Value="14"/>
<Setter Property="Padding" Value="10 5"/>
<!-- 템플릿 -->
<Setter Property="Template">
<Setter.Value>
<ControlTemplate TargetType="Button">
<Border Background="{TemplateBinding Background}"
CornerRadius="4"
BorderThickness="1"
BorderBrush="#2980b9">
<ContentPresenter HorizontalAlignment="Center"
VerticalAlignment="Center"/>
</Border>
</ControlTemplate>
</Setter.Value>
</Setter>
<!-- Triggers -->
<Style.Triggers>
<Trigger Property="IsMouseOver" Value="True">
<Setter Property="Background" Value="#2980b9"/>
</Trigger>
<Trigger Property="IsPressed" Value="True">
<Setter Property="Background" Value="#1d6fa5"/>
</Trigger>
</Style.Triggers>
</Style>
주요 요약
| 특성 | 설명 |
|---|---|
TargetType |
반드시 선언해야 하며, 스타일이 적용될 컨트롤의 유형을 지정합니다. |
x:Key |
명시적 참조 시 필요하며, 생략 시 암시적 스타일을 생성합니다. |
Setter |
속성 설정을 위한 핵심 요소입니다. |
BasedOn |
다른 스타일을 상속하여 중복 정의를 피합니다. |
Triggers |
동적 상호 작용 효과(속성/데이터/이벤트 트리거)를 구현합니다. |
| 리소스 위치 | 지역 리소스 (Window/UserControl), 전역 리소스 (App.xaml), 외부 리소스 사전. |
ControlTemplate |
스타일을 통해 컨트롤의 모양을 완전히 재정의합니다. |
이러한 핵심 개념들을 숙지하면 WPF 스타일을 효과적으로 활용하여 UI 일관성과 동적 효과를 구현할 수 있습니다!