✍ 의존 프로퍼티, 의존 속성
- 기존의 닷넷 Property에 WPF 요소를 가미하여 새롭게 탄생
- XAML, C# 코드 비하인드에서 사용 가능하며 의존속성 값이 변경되면 자동으로 어떤 것을 로드되게 하거나 렌더링 되도록 할 수 있는데 애니메이션, 스타일링, 데이터바인딩 등에 자주 사용된다.
- 어떤 속성을 애니메이션 시켜야 하거나 데이터 바인딩을 하려면 그 속성은 반드시 의존 속성이어야 한다.
- 기본으로 제공되는 UI컨트롤은 대부분의 속성이 의존 속성으로 되어 있다.
- FrameworkElement, Control 등과 같이 DependencyObject 에서 파생 된 클래스에서만 정의 할 수 있다.
- 우리가 흔히 속성으로 알고 사용하는 Height도 의존 속성이다.
💻 XAML
<Window x:Class="WpfApp2.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:WpfApp2"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.ContextMenu>
<ContextMenu MenuItem.Click="ContextMenu_Click">
<MenuItem Header="YELLOW"/>
<MenuItem Header="GREEN"/>
<MenuItem Header="BLUE"/>
</ContextMenu>
</Window.ContextMenu>
<TextBox x:Name="textBox1" HorizontalAlignment="Left" Height="32" TextWrapping="Wrap" Text="TextBox" Width="120"/>
</Window>
💻 XAML.cs
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace WpfApp2
{
/// <summary>
/// MainWindow.xaml에 대한 상호 작용 논리
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
// DependencyProperty(MyProperty)를 위한 레퍼속성 MyColor
public String MyColor
{
get { return (String)GetValue(MyProperty); }
set { SetValue(MyProperty, value); }
}
// 의존속성 MyProperty
/*DependencyProperty 클래스에는 public 생성자가 없기 때문에 static 메서드인
DependencyProperty.Register()를 사용한다.
수정이 불가능 하도록 의존속성은 읽기전용 필드로 선언된다.
일반 UI 컨트롤인 Height, Width등 대부분의 의존속성은 FrameworkElement에
DependencyProperty로 정의되어 있다. */
public static readonly DependencyProperty MyProperty = DependencyProperty.Register(
"MyColor", //의존속성으로 등록될 속성
typeof(String), //등록할 의존속성 타입
typeof(MainWindow), // 의존속성을 소유하게될 OWNER
new FrameworkPropertyMetadata(new PropertyChangedCallback(OnMyPropertyChanged)));
//속성값 변경시 호출될 메소드
// 프로퍼티 값의 변경에 따른 Callback 메서드 등 새로운 속성을 추가하기 위해
// FrameworkPropertyMetadata를 인자 값으로 전달 할수 있다.
private static void OnMyPropertyChanged(DependencyObject d, DependencyPropertyChangedEventArgs e)
{
MainWindow win = d as MainWindow;
SolidColorBrush brush = (SolidColorBrush)new BrushConverter().ConvertFromString(e.NewValue.ToString());
win.Background = brush;
win.Title = (e.OldValue == null) ? "이전배경색 없음" : "배경색 : " + e.OldValue.ToString();
win.textBox1.Text = e.NewValue.ToString();
}
private void ContextMenu_Click(object sender, RoutedEventArgs e)
{
string str = (e.Source as MenuItem).Header as string;
MyColor = str;
}
}
}
'C# > WPF' 카테고리의 다른 글
[WPF] 카카오톡 구현 - 1 (패키지 추가, 타이틀 바 제작) (0) | 2023.08.09 |
---|---|
[WPF] 데이터 바인딩 (0) | 2023.08.07 |
[WPF] ListBox와 LINQ쿼리 (0) | 2023.08.05 |
[WPF] Data Trigger(데이터 트리거) (0) | 2023.08.05 |
[WPF] Trigger, Property Trigger(프로퍼티 트리거) (0) | 2023.08.04 |