8장. WPF 의존프로퍼티(DependencyProperty) 란?
- C#/WPF
- 2021. 5. 8. 18:06
8장. WPF 의존프로퍼티(DependencyProperty) 란?
참조
목적
- WPF DependencyProperty에 대해서 학습합니다.
의존 프로퍼티(DependencyProperty), 의존속성이란?
- 기존의 닷넷 Property 에 WPF 요소를 가미하여 새롭게 탄생
- XAML, C# 코드 비하인드에서 사용 가능하며 의존속성 값이 변경되면 자동으로 어떤 것을 로드하게 하거나 렌더링 되도록 할 수 있는데 애니메이션, 스타일링, 데이터바인딩 등에 자주 사용된다.
- 어떤 속성을 애니메이션 시켜야 하거나 데이터 바인딩을 하려면 그 속성은 반드시 의존 속성이어야 한다.
- 기본으로 제공되는 UI 컨트롤은 대부분의 속성이 의존 속성으로 되어 있다.
- FreameworkElement, Control 등과 같이 DependencyObject 에서 파생 된 클래스에서만 정의할 수 있다.
의존프로퍼티 실습
예제
- 마우스 우클릭 하면, ContextMenu 가 나오고 3개의 컬러 Yellow, Green, Blue 가 나오게 디자인 합니다.
- Window 가운데에 TextBox 컨트롤 하나를 배치합니다.
- MenuItem 을 하나 선택을 하게 되면 해당 컬러에 맞게 배경색이 바뀌고 Color 값이 TextBox에 보여지게 합니다.
MainWindow.xaml
<Window x:Class="WPF08_Test.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:WPF08_Test"
mc:Ignorable="d"
Title="MainWindow" Height="300" Width="300">
<Window.ContextMenu>
<ContextMenu MenuItem.Click="ContextMenu_Click">
<MenuItem Header="YELLOW"/>
<MenuItem Header="GREEN"/>
<MenuItem Header="BLUE"/>
</ContextMenu>
</Window.ContextMenu>
<Grid>
<TextBox x:Name="textBox1"
Width="100"
Height="20"/>
</Grid>
</Window>
MainWindow.xaml.cs
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Media;
namespace WPF08_Test
{
/// <summary>
/// MainWindow.xaml에 대한 상호 작용 논리
/// </summary>
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
}
//DependencyProperty(MyProperty)를 위한 래퍼속성 MyColor
//이 래퍼속성에서는 System.Windows.DepencencyObject 클래스의
//GetValue()와 SetValue() 메서드 지원
public String Mycolor
{
get
{
return (String)GetValue(MyProperty);
}
set
{
SetValue(MyProperty, value);
}
}
//의존속성(Depencency Property) MyProperty
//DependencyProperty 클래스에는 public 생성자가 없기 때문에 static 메서드인 DependencyProperty 이용
//대부분의 의존속성은 FrameworkElement에 Dependency로
//정의 되어있다.
public static readonly DependencyProperty MyProperty = DependencyProperty.Register(
"MyColor", //의존 속성으로 등록될 Wrapper 속성
typeof(String), //등록할 의존속성 타입
typeof(MainWindow), //의존속성을 소유하게 될 OWNER (소유자)
new FrameworkPropertyMetadata(new PropertyChangedCallback(OnMyPropertyChanged))
);
//속성값 변경시 호출될 메서드
//프로퍼티 값의 변경에 따른 Callback 메서드 등 새로운 속성을 추가하기 위해
//FrameworkPropertyMetadata를 인자 값으로 전달 할 수 있다.
private static void OnMyPropertyChanged(DependencyObject obj, DependencyPropertyChangedEventArgs e)
{
MainWindow win = obj 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;
}
}
}
실행결과
728x90
'C# > WPF' 카테고리의 다른 글
10장. WPF 데이터바인딩(DataBinding)이란? (0) | 2021.05.08 |
---|---|
9장. WPF 이벤트 라우팅(RoutedEvent), 버블링/ 터널링/다이렉트 이벤트 (0) | 2021.05.08 |
7장. WPF ListBox와 LINQ쿼리를 이용한 간단한 데이터바인딩 (0) | 2021.05.08 |
6장. WPF Data Trigger 란? (0) | 2021.05.08 |
5장. WPF 트리거란? (0) | 2021.05.06 |
이 글을 공유하기