WPF

WPF

Tags
Published
Author

WPF(Windows Presentation Foundation)

μœˆλ„μš° 기반 μ‘μš©ν”„λ‘œκ·Έλž¨μ—μ„œ μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€λ₯Ό ν‘œμ‹œν•˜κΈ° μœ„ν•œ λͺ©μ μœΌλ‘œ λ§ˆμ΄ν¬λ‘œμ†Œν”„νŠΈμ—μ„œ λ§Œλ“  κ·Έλž˜ν”½ μ„œλΈŒμ‹œμŠ€ν…œ

WPF μ•„ν‚€ν…μ²˜

notion image
WPFμ—μ„œμ˜ λͺ¨λ“  λ””μŠ€ν”Œλ ˆμ΄λŠ” DirectX엔진을 톡해 μˆ˜ν–‰λ˜λ―€λ‘œ 효율적인 ν•˜λ“œμ›¨μ–΄ 및 μ†Œν”„νŠΈμ›¨μ–΄ λ Œλ”λ§μ„ ν—ˆμš©

System.Threading.DispatcherObject

λ””μŠ€νŒ¨μ²˜μ— μ˜ν•΄ κ΅¬ν˜„λœ λ©”μ‹œμ§• μ‹œμŠ€ν…œμ„ 기반
λ””μŠ€νŒ¨μ²˜
μ‚¬μš©μžκ°€ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ©΄ ν”„λ‘œμ„ΈμŠ€κ°€ μƒμ„±λ˜κ³  Ready μƒνƒœκ°€ λœλ‹€(Ready Queue) κ·Έ ν›„ μŠ€μΌ€μ€„λŸ¬κ°€ Ready Queue에 μžˆλŠ” ν”„λ‘œμ„ΈμŠ€ 쀑 ν•˜λ‚˜λ₯Ό ν”„λ‘œμ„Έμ„œ(CPU)κ°€ μ‚¬μš© κ°€λŠ₯ν•œ μƒνƒœκ°€ 될 λ•Œ CPU에 ν• λ‹Ή
λ””μŠ€νŒ¨μ²˜ μ‚¬μš©μžκ°€ ν”„λ‘œκ·Έλž¨μ„ μ‹€ν–‰ν•˜λ©΄ ν”„λ‘œμ„ΈμŠ€κ°€ μƒμ„±λ˜κ³  Ready μƒνƒœκ°€ λœλ‹€(Ready Queue) κ·Έ ν›„ μŠ€μΌ€μ€„λŸ¬κ°€ Ready Queue에 μžˆλŠ” ν”„λ‘œμ„ΈμŠ€ 쀑 ν•˜λ‚˜λ₯Ό ν”„λ‘œμ„Έμ„œ(CPU)κ°€ μ‚¬μš© κ°€λŠ₯ν•œ μƒνƒœκ°€ 될 λ•Œ CPU에 ν• λ‹Ή

MVVM

model - view - viewmodel

XAML

XAML은 μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λͺ¨μ–‘을 κ΅¬ν˜„ν•˜λŠ” XML 기반 νƒœκ·Έ μ–Έμ–΄
  • μ°½,λŒ€ν™”.μƒμž, νŽ˜μ΄μ§€ 및 μ‚¬μš©μž μ •μ˜ μ»¨νŠΈλ‘€μ„ μ •μ˜
  • 컨트둀, λ„ν˜• 및 κ·Έλž˜ν”½μœΌλ‘œ μ±„μš°λŠ”λ° μ‚¬μš©

μ½”λ“œ μˆ¨κΉ€

μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ μ£Όμš” λ™μž‘μ€ μ‚¬μš©μž μƒν˜Έ μž‘μš©μ— μ‘λ‹΅ν•˜λŠ” κΈ°λŠ₯을 κ΅¬ν˜„
νƒœκ·Έμ™€ μ—°κ²°λœ μ½”λ“œμ—μ„œ κ΅¬ν˜„ν•˜λŠ” μ’…λ₯˜μ˜ μ½”λ“œλ₯Ό μ½”λ“œ μˆ¨κΉ€μ΄λΌκ³  함
<Window xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" x:Class="SDKSample.AWindow" Title="Window with button" Width="250" Height="100"> <!-- Add button to window --> <Button Name="button" Click="button_Click">Click Me!</Button> </Window> /////////////////////////// using System.Windows; namespace SDKSample { public partial class AWindow : Window { public AWindow() { // InitializeComponent call is required to merge the UI // that is defined in markup with this class, including // setting properties and registering event handlers InitializeComponent(); } void button_Click(object sender, RoutedEventArgs e) { // Show message box when button is clicked. MessageBox.Show("Hello, Windows Presentation Foundation!"); } } }
  • xmlns:x : λ„€μž„μŠ€νŽ˜μ΄μŠ€λ₯Ό μ •μ˜ν•˜κ³  μ½”λ“œ μˆ¨κΉ€ ν˜•μ‹μ— λŒ€ν•œ 지원을 μΆ”κ°€ν•˜λŠ” μŠ€ν‚€λ§ˆμ— 맀핑
  • x:Class : μ½”λ“œ μˆ¨κΉ€ 클래슀λ₯Ό νŠΉμ • XAML νƒœκ·Έμ— μ—°κ²°ν•˜λŠ”λ° μ‚¬μš©
  • <window> : μ½”λ“œ μˆ¨κΉ€ν΄λž˜μŠ€λŠ” <window>ν΄λž˜μŠ€μ—μ„œ 상속
  • InitializeComponent : μ½”λ“œ μˆ¨κΉ€ 클래슀λ₯Ό μ‚¬μš©ν•˜μ—¬ νƒœκ·Έμ—μ„œ μ •μ˜λœ UIλ₯Ό λ³‘ν•©ν•˜κΈ° μœ„ν•΄ μ½”λ“œ μˆ¨κΉ€ 클래슀의 μƒμ„±μžμ—μ„œ 호좜

μž…λ ₯ 및 λͺ…λ Ή

μ»¨νŠΈλ‘€μ€ λŒ€μ²΄λ‘œ μ‚¬μš©μž μž…λ ₯을 κ°μ§€ν•˜κ³  μ‘λ‹΅ν•©λ‹ˆλ‹€.
WPF μž…λ ₯ μ‹œμŠ€ν…œμ€ 직접 및 라우트된 이벀트λ₯Ό μ‚¬μš©ν•˜μ—¬ ν…μŠ€νŠΈμž…λ ₯, 포컀슀 관리 및 마우슀 μœ„μΉ˜ 지정을 지원

λ ˆμ΄μ•„μ›ƒ

μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€λ₯Ό λ§Œλ“€ λ•Œ μœ„μΉ˜ 및 ν¬κΈ°λ³„λ‘œ μ»¨νŠΈλ‘€μ„ μ •λ ¬ν•˜μ—¬ λ ˆμ΄μ•„μ›ƒμ„ κ΅¬μ„±ν•©λ‹ˆλ‹€.

바인딩

두 개 μ΄μƒμ˜ 객체 κ°„ 속성을 μ—°κ²°ν•˜λ©΄ ν•œ 객체의 속성이 λ³€κ²½λ˜μ—ˆμ„ λ•Œ 바인딩 된 λ‹€λ₯Έ 객체의 속성 λ˜ν•œ λ³€κ²½λ˜λ„λ‘ ν•˜λŠ” μž‘μ—…

데이터 바인딩

μ•± UI와 ν•΄λ‹Ή UIκ°€ ν‘œμ‹œν•˜λŠ” 데이터λ₯Ό μ—°κ²°ν•˜λŠ” ν”„λ‘œμ„ΈμŠ€
  • μœ μ € μΈν„°νŽ˜μ΄μŠ€μ™€ λΉ„μŠ€λ‹ˆμŠ€ λͺ¨λΈ 사이에 μžλ™μœΌλ‘œ 데이터λ₯Ό μ—…λ°μ΄νŠΈ ν•΄μ£ΌλŠ” 방법
데이터에 μ•‘μ„ΈμŠ€ν•˜κ³  μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ κ΄€λ¦¬λ˜λŠ” κ°œμ²΄μ— λ‘œλ“œν•œ ν›„ WPF μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—μ„œ μ‹œμž‘
  1. κ΄€λ¦¬λ˜λŠ” κ°œμ²΄μ—μ„œ 데이터λ₯Ό ν‘œμ‹œ 및 νŽΈμ§‘ν•  수 μžˆλŠ” 컨트둀둜 데이터 볡사
  1. μ»¨νŠΈλ‘€μ„ μ‚¬μš©ν•œ 데이터 λ³€κ²½ λ‚΄μš©μ΄ κ΄€λ¦¬λœλŠ” κ°œμ²΄μ— λ‹€μ‹œ λ³΅μ‚¬λ˜λŠ”μ§€ 확인
notion image
Binding 클래슀둜 컨트둀(바인딩 λŒ€μƒ)을 데이터 개체(바인딩 μ†ŒμŠ€)에 λ°”μΈλ”©ν•˜λŠ” μž‘μ—…μ„ μˆ˜ν–‰
  • κ΅¬μ„±μš”μ†Œ
    • 바인딩 λŒ€μƒ 개체
    • λŒ€μƒ 속성
    • 바인딩 μ†ŒμŠ€
    • μ‚¬μš©ν•  바인딩 μ†ŒμŠ€μ— μžˆλŠ” κ°’ 경둜

데이터 흐름 λ°©ν–₯

  • OneWay 바인딩을 μ‚¬μš©ν•˜λ©΄ μ†ŒμŠ€ 속성이 변경될 경우 λŒ€μƒ 속성이 μžλ™μœΌλ‘œ μ—…λ°μ΄νŠΈ λ˜μ§€λ§Œ λŒ€μƒ 속성이 변경될 경우 λ³€κ²½ λ‚΄μš©μ΄ λ‹€μ‹œ μ†ŒμŠ€ μ†μ„±μœΌλ‘œ μ „νŒŒ X
  • TwoWay λ°”μΈλ”©μœΌλ‘œ 인해 μ†ŒμŠ€ 속성 λ˜λŠ” λŒ€μƒ 속성이 λ³€κ²½λ˜μ–΄ λ‹€λ₯Έ ν•­λͺ©μ΄ μžλ™μœΌλ‘œ μ—…λ°μ΄νŠΈ
  • OneWayToSourceλŠ” OneWay λ°”μΈλ”©μ˜ λ°˜λŒ€λ‘œ λŒ€μƒ 속성이 λ³€κ²½λ˜λ©΄ μ†ŒμŠ€ 속성을 μ—…λ°μ΄νŠΈ

μ†ŒμŠ€ μ—…λ°μ΄νŠΈλ₯Ό νŠΈλ¦¬κ±°ν•˜λŠ” ν•­λͺ©

TwoWay λ˜λŠ” OneWayToSource인 바인딩은 λŒ€μƒ μ†μ„±μ˜ λ³€κ²½ λ‚΄μš©μ„ μˆ˜μ‹ ν•˜κ³  λ‹€μ‹œ μ†ŒμŠ€μ— μ „νŒŒν•©λ‹ˆλ‹€.
notion image

TemplateBinding

TemplateBinding은 ν…œν”Œλ¦Ώμ˜ 일뢀λ₯Ό 컨트둀의 속성에 λ°”μΈλ”©ν•˜λŠ”λ° 유용

XAML(자멜)μ—μ„œ 바인딩 μ„ μ–Έ

바인딩 ν™•μž₯을 μ‚¬μš©ν•˜μ—¬ 바인딩을 μ„ μ–Έν•  λ•Œ 선언은 Binding ν‚€μ›Œλ“œ 뒀에 일련의 절이 μ‰Όν‘œλ‘œ κ΅¬λΆ„λœ ν˜•νƒœλ‘œ ꡬ성

ν…œν”Œλ¦Ώ

μ‹œκ°μ μœΌλ‘œ 맀λ ₯적인 νš¨κ³Όμ™€ μΌκ΄€λœ λͺ¨μ–‘을 λ§Œλ“€ 수 μžˆλŠ” κΈ°λŠ₯ 집합
WPF 컨트둀의 κΈ°λ³Έ μ‚¬μš©μž μΈν„°νŽ˜μ΄μŠ€λŠ” 일반적으둜 λ‹€λ₯Έ 컨트둀 및 λ„ν˜•μ—μ„œ ꡬ성

ContorlTemplates

컨트둀의 μ—¬λŸ¬ μΈμŠ€ν„΄μŠ€μ—μ„œ κ³΅μœ ν•  수 μžˆλŠ” Control μ‹œκ°μ  ꡬ쑰 및 λ™μž‘ 츑변을 지정
  • λ ˆμ΄μ•„μ›ƒ, ν…Œλ‘λ¦¬, λ°°κ²½ 및 기타 μ‹œκ°μ  μš”μ†Œμ™€ 같은 컨트둀의 ꡬ쑰 및 μ‹œκ°μ  λͺ¨μ–‘을 μ •μ˜
  • Button, CheckBox

DataTemplates

λ°μ΄ν„°μ˜ μ‹œκ°μ  ν‘œμ‹œλ₯Ό μ •μ˜
  • λͺ©λ‘μ΄λ‚˜ κ·Έλ¦¬λ“œμ— ν•­λͺ© λͺ¨μŒμ„ ν‘œμ‹œν•˜λŠ” 것과 같이 νŠΉμ • ν˜•μ‹μœΌλ‘œ 데이터λ₯Ό ν‘œμ‹œν•˜λŠ”λ° μ‚¬μš©
  • ListBox, ListView, ItemsControl

ItemsPanelTemplate

ItemControl의 ν•­λͺ©μ„ ν¬ν•¨ν•˜λŠ” νŒ¨λ„μ„ μ •μ˜ν•˜λŠ”λ° μ‚¬μš©
  • κ°€λ‘œ or μ„Έλ‘œ μŠ€νƒ νŒ¨λ„, κ·Έλ¦¬λ“œ or μ»¨λ²„μŠ€μ™€ 같은 ν•­λͺ©μ˜ λ ˆμ΄μ•„μ›ƒμ„ μ •μ˜

TemplateBinding

ν…œν”Œλ¦Ώ μ‹œλ‚˜λ¦¬μ˜€μ— λŒ€ν•œ λ°”μΈλ”©μ˜ μ΅œμ ν™”λœ ν˜•νƒœ

기본적인 ν‹€

<Window.DataContext> <local:MainWindowViewModel /> </Window.DataContext> <Grid> <ItemsControl Grid.Row="1" Margin="5" ItemsSource="{Binding DigitElements}"> <ItemsControl.ItemsPanel> <ItemsPanelTemplate> <Grid IsItemsHost="True"> <Grid.RowDefinitions> <RowDefinition Height="*" /> </Grid.RowDefinitions> <Grid.ColumnDefinitions> <ColumnDefinition Width="*" /> </Grid.ColumnDefinitions> </Grid> </ItemsPanelTemplate> </ItemsControl.ItemsPanel> <ItemsControl.ItemTemplate> <DataTemplate> <Button Grid.Row="{Binding Row}" Grid.Column="{Binding Column}" Margin="3" Grid.ColumnSpan="{Binding ColumnSpan}" Grid.RowSpan="{Binding RowSpan}" Content="{Binding Text}" Command="{Binding Command}" CommandParameter="{Binding DataContext.Calculation, RelativeSource={RelativeSource FindAncestor, AncestorType={x:Type local:MainWindow}}}" /> </DataTemplate> </ItemsControl.ItemTemplate> <ItemsControl.ItemContainerStyle> <Style> <Setter Property="Grid.Row" Value="{Binding Row}" /> <Setter Property="Grid.Column" Value="{Binding Column}" /> <Setter Property="Grid.ColumnSpan" Value="{Binding ColumnSpan}" /> </Style> </ItemsControl.ItemContainerStyle> </ItemsControl> </Grid>

라우트된 이벀트

  • κΈ°λŠ₯적 κ΄€μ μ—μ„œ 라우트된 μ΄λ²€νŠΈλŠ” 이벀트 μ›λ³ΈλΏλ§Œ μ•„λ‹ˆλΌ μš”μ†Œ 트리의 μ—¬λŸ¬ μˆ˜μ‹ κΈ°μ—μ„œ 처리기λ₯Ό ν˜ΈμΆœν•  수 μžˆλŠ” 이벀트 μœ ν˜•
  • κ΅¬ν˜„ κ΄€μ μ—μ„œ 라우트된 μ΄λ²€νŠΈλŠ” WPF 이벀트 μ‹œμŠ€ν…œμ— λ“±λ‘λ˜κ³  RoutedEvent 클래슀의 μΈμŠ€ν„΄μŠ€λ‘œ λ’·λ°›μΉ¨λ˜κ³  WPF 이벀트 μ‹œμŠ€ν…œμ—μ„œ μΉ˜λ¦¬λ˜λŠ” 이벀트
WPF μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ—λŠ” 일반적으둜 XAMLμ—μ„œ μ„ μ–Έλ˜κ±°λ‚˜ μ½”λ“œμ—μ„œ μΈμŠ€ν„΄μŠ€ν™”λœ λ§Žμ€ μš”μ†Œκ°€ 포함

μ΄λ²€νŠΈκ°€ 원본 μš”μ†Œμ—μ„œ λ°œμƒν•˜λŠ” 경우

  • 원본 μš”μ†Œμ—μ„œ 루트 μš”μ†Œ(일반적으둜 νŽ˜μ΄μ§€ λ˜λŠ” μ°½)둜 μš”μ†Œ 트리λ₯Ό 톡해 버블 μ—… 됨
  • μš”μ†Œ 트리λ₯Ό 톡해 루트 μš”μ†Œμ—μ„œ 원본 μš”μ†Œλ‘œ 터널링 됨
  • μš”μ†Œ 트리λ₯Ό ν†΅κ³Όν•˜μ§€ μ•Šκ³  원본 μš”μ†Œμ—μ„œλ§Œ λ°œμƒν•¨

라우트 μ „λž΅

  • 버블링 : 이벀트 μ†ŒμŠ€μ—μ„œ 이벀트 μ²˜λ¦¬κΈ°κ°€ 호좜됨 β†’ 라우트된 μ΄λ²€νŠΈλŠ” 연속 λΆ€λͺ¨ μš”μ†Œλ‘œ λΌμš°νŒ…λ˜μ–΄ μš”μ†Œ 트리 λ£¨νŠΈμ— 도달할 λ•ŒκΉŒμ§€ ν•΄λ‹Ή 이벀트 처리기λ₯Ό μ°¨λ‘€λ‘œ 호좜
  • 터널링 : μ²˜μŒμ— μš”μ†Œ 트리 λ£¨νŠΈμ— μžˆλŠ” 이벀트 처리기 호좜 β†’ 라우트된 μ΄λ²€νŠΈλŠ” μ—°μ†λœ μžμ‹ μš”μ†Œλ‘œ λΌμš°νŒ… λ˜μ–΄ 이벀트 원본에 도달할 λ•ŒκΉŒμ§€ ν•΄λ‹Ή 이벀트 처리기λ₯Ό μ°¨λ‘€λ‘œ 호좜

이벀트 처리기 μ—°κ²° 및 κ΅¬ν˜„

<StackPanel Name="StackPanel1" Button.Click="Button_Click"> <Button>Click me</Button> </StackPanel>
private void Button_Click(object sender, RoutedEventArgs e) { // Click event logic. }
RoutedEventHandlerλŒ€λ¦¬μžμ˜ sender λ§€κ°œλ³€μˆ˜λŠ” 이벀트 μ²˜λ¦¬κΈ°κ°€ μ—°κ²°λœ μš”μ†Œλ₯Ό 지정
RoutedEventHandler 은 κΈ°λ³Έ 라우트된 이벀트 처리기 μ΄μ§€λ§Œ 일뢀 컨트둀 λ˜λŠ” κ΅¬ν˜„ μ‹œλ‚˜λ¦¬μ˜€μ—λŠ” νŠΉμˆ˜ν™”λœ 이벀트 데이터λ₯Ό μ§€μ›ν•˜λŠ” λ‹€λ₯Έ λŒ€λ¦¬μžκ°€ ν•„μš”
ex) DragEnter β†’ DragEventHandler
μ½”λ“œλ₯Ό μ‚¬μš©ν•˜μ—¬ 라우트된 μ΄λ²€νŠΈμ— λŒ€ν•œ 이벀트 처리기λ₯Ό μš”μ†Œμ— μ—°κ²°ν•  λ•Œ
  1. AddHandler λ©”μ„œλ“œλ₯Ό 직접 호좜 Button1.AddHandler(ButtonBase.ClickEvent, new RoutedEventHandler(Button_Click));
  1. 라우트된 μ΄λ²€νŠΈκ°€ CLR 이벀트 래퍼λ₯Ό κ΅¬ν˜„ν•˜λŠ” 경우 Button1.Click += Button_Click;

Handled κ°œλ…

라우트된 λͺ¨λ“  μ΄λ²€νŠΈλŠ” RoutedEventArgs 클래슀인 이벀트 데이터에 λŒ€ν•œ 곡톡 κΈ°λ³Έ 클래슀λ₯Ό 곡유
  • RoutedEventArgs ν΄λž˜μŠ€λŠ” λΆ€μšΈ Handled 속성을 μ •μ˜
  • Handled μ†μ„±μ˜ λͺ©μ μ€ 이벀트 경둜λ₯Ό 따라 μžˆλŠ” 이벀트 μ²˜λ¦¬κΈ°κ°€ 라우트 된 이벀트λ₯Ό μ²˜λ¦¬λ¨μ„ ν‘œμ‹œν•  수 있게 ν•˜λŠ” 것

DataContext

ν•˜λ‚˜μ˜ 곡용 μ†ŒμŠ€μ—μ„œ μ—¬λŸ¬ 개의 속성을 λ°”μΈλ”©ν•˜λŠ” 경우
<Window.DataContext> <local:MainWindowViewModel /> </Window.DataContext>

ItemsControl 클래슀

ν•­λͺ©μ˜ μ»¬λ ‰μ…˜μ„ ν‘œμ‹œν•˜λŠ” 데 μ‚¬μš©ν•  수 μžˆλŠ” 컨트둀
<ListBox ItemsSource="{Binding Source={StaticResource dataList}}"/> // ItemSource => ItemsControl의 μ½˜ν…μΈ λ₯Ό μƒμ„±ν•˜λŠ”λ° μ‚¬μš©λ˜λŠ” μ»¬λ ‰μ…˜μ„ κ°€μ Έμ˜€κ±°λ‚˜ μ„€μ •

ItemsControl.ItemContainerStyle

각 ν•­λͺ©μ— λŒ€ν•΄ μƒμ„±λœ μ»¨ν…Œμ΄λ„ˆ μš”μ†Œμ— 적용된 Style을 κ°€μ Έμ˜€κΈ°λ‚˜ μ„€μ •
<ItemsControl.ItemContainerStyle> <Style> <Setter Property="Grid.Row" Value={Binding Row} /> <Setter Property="Grid.Column" Value={Binding Column} /> </Style> </ItemsControl.ItemContainerStyle>

INotifyPropertyChanged μΈν„°νŽ˜μ΄μŠ€

속성값이 λ³€κ²½λ˜μ—ˆμŒμ„ ν΄λΌμ΄μ–ΈνŠΈμ— μ•Œλ¦Ό
  • 바인딩을 λ‹€μ‹œ μ„€μ •ν•  ν•„μš”μ—†μ΄ λ°”μΈλ”©λœ DataGridView 컨트둀이 데이터 μ›λ³Έμ˜ λ³€κ²½ 사항을 반영
  • CallerMemberName νŠΉμ„±μ„ μ‚¬μš©ν•˜λŠ” 경우 NotifyPropertyChanged λ©”μ„œλ“œμ— λŒ€ν•œ ν˜ΈμΆœμ€ 속성 이름을 λ¬Έμžμ—΄ 인수둜 지정할 ν•„μš”κ°€ μ—†λ‹€.
public void RaisePropertyChanged(string propertyName) { PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); }

Setter

속성 값을 μ μš©ν•˜λŠ” 클래슀
<Style TargetType="{x:Type TextBlock}"> <Setter Property="FontFamily" Value="Hong Gil Dong" /> <Setter Property="HorizontalAlignment" Value="Center" /> <Setter Property="FonSize" Value="12pt" /> </Style>

XAML λ¦¬μ†ŒμŠ€

λ¦¬μ†ŒμŠ€λŠ” μ•±μ˜ μ—¬λŸ¬ μœ„μΉ˜μ—μ„œ λ‹€μ‹œ μ‚¬μš©ν•  수 μžˆλŠ” 개체
  • λ¦¬μ†ŒμŠ€ λ””λ ‰ν„°λ¦¬μ˜ 각 λ¦¬μ†ŒμŠ€μ—λŠ” 고유 ν‚€κ°€ μžˆμ–΄μ•Όν•¨ (ex : x:Key)
<Button Backgroud="{StaticResource MyBrush}" /> <Ellipse Fill="{StaticResource MyBrush}" />

정적 및 동적 λ¦¬μ†ŒμŠ€

정적 λ¦¬μ†ŒμŠ€

  • μ‚¬μš© κ°€λŠ₯ν•œ λͺ¨λ“  λ¦¬μ†ŒμŠ€ μ‚¬μ „μ—μ„œ ν•΄λ‹Ή ν‚€μ˜ 값을 κ²€μƒ‰ν•˜μ—¬ ν‚€λ₯Ό 처리
  • μ²˜λ¦¬λŠ” λ‘œλ“œν•˜λŠ” λ™μ•ˆ 이루어짐
  • μ•± λ””μžμΈμ—μ„œλŠ” λŒ€λΆ€λΆ„μ˜ λ¦¬μ†ŒμŠ€λ₯Ό νŽ˜μ΄μ§€ λ˜λŠ” μ• ν”Œλ¦¬μΌ€μ΄μ…˜ μˆ˜μ€€ λ¦¬μ†ŒμŠ€ 사전에 집쀑
  • νŽ˜μ΄μ§€ λ‹€μ‹œ λ‘œλ“œ λ“±μ˜ λŸ°νƒ€μž„ λ™μž‘μ— 따라 λ‹€μ‹œ ν‰κ°€λ˜μ§€ μ•ŠμŒ

정적 λ¦¬μ†ŒμŠ€ 쑰회 λ™μž‘

  1. 쑰회 ν”„λ‘œμ„ΈμŠ€κ°€ 속성을 μ„€μ •ν•˜λŠ” μš”μ†Œλ₯Ό 톡해 μ •μ˜λœ λ¦¬μ†ŒμŠ€ μ‚¬μ „μ—μ„œ μš”μ²­λœ ν‚€λ₯Ό 확인
  1. 쑰회 ν”„λ‘œμ„ΈμŠ€κ°€ 논리적 트리λ₯Ό 상ν–₯μ‹μœΌλ‘œ ν†΅κ³Όν•˜μ—¬ λΆ€λͺ¨ μš”μ†Œμ™€ ν•΄λ‹Ή λ¦¬μ†ŒμŠ€ μ‚¬μ „μœΌλ‘œ 이동 (λ£¨νŠΈμ— 도달할 λ•ŒκΉŒμ§€)
  1. μ•± λ¦¬μ†ŒμŠ€λ₯Ό 확인

동적 λ¦¬μ†ŒμŠ€

  • μ‹œμŠ€ν…œ λ¦¬μ†ŒμŠ€ λ˜λŠ” μ‚¬μš©μžκ°€ μ„€μ •ν•  수 μžˆλŠ” λ¦¬μ†ŒμŠ€λ₯Ό ν¬ν•¨ν•˜μ—¬ λ¦¬μ†ŒμŠ€μ˜ 값은 λŸ°νƒ€μž„κΉŒμ§€ μ•Œλ €μ§€μ§€ μ•Šμ€ 쑰건에 따라 달라짐
  • λŸ°νƒ€μž„ μ‹œ 변경될 여지가 μžˆλŠ” λ¦¬μ†ŒμŠ€

Binding.RelativeSource

바인딩 λŒ€μƒ μœ„μΉ˜λ₯Ό κΈ°μ€€μœΌλ‘œ ν•΄λ‹Ή μœ„μΉ˜λ₯Ό μ§€μ •ν•˜μ—¬ 바인딩 μ†ŒμŠ€λ₯Ό κ°€μ Έμ˜€κ±°λ‚˜ μ„€μ •ν•©λ‹ˆλ‹€.
<Style x:Key="textBoxInError" TargetType="{x:Type TextBox}"> <Style.Triggers> <Trigger Property="Validation.HasError" Value="true"> <Setter Property="ToolTip" Value="{Binding RelativeSource={x:Static RelativeSource.Self}, Path=(Validation.Errors)/ErrorContent}"/> </Trigger> </Style.Triggers> </Style>
기본적으둜 바인딩은 데이터 μ»¨ν…μŠ€νŠΈλ₯Ό μƒμ†ν•©λ‹ˆλ‹€.

WPF Trigger

  • TriggerλŠ” μ–΄λ–€ 쑰건, μ΄λ²€νŠΈλ“± μ£Όμ–΄μ‘Œμ„ λ•Œ λ¬΅μ‹œμ μœΌλ‘œ 컨트둀의 μƒνƒœ λ˜λŠ” 이벀트 ν•Έλ“€λŸ¬ 등을 ν˜ΈμΆœν•˜λŠ” κΈ°λŠ₯
  • Triggerλ₯Ό μ‚¬μš©ν•˜λ©΄ μ—˜λ¦¬λ¨ΌνŠΈμ˜ ν”„λ‘œνΌν‹°λ‚˜ 데이터 바인딩, μ΄λ²€νŠΈμ—μ„œ λ°œμƒν•˜λŠ” 변화에 μ—˜λ¦¬λ¨ΌνŠΈμ™€ 컨트둀이 μ–΄λ–»κ²Œ λ°˜μ‘ν• μ§€λ₯Ό μ •ν•  수 μžˆλ‹€.