8장. WPF 의존프로퍼티(DependencyProperty) 란?

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;
        }
    }
}

실행결과

1

2

728x90

이 글을 공유하기

댓글

Designed by JB FACTORY