본문 바로가기
개발 이야기/C# 이야기

C# .Net WPF 의존프로퍼티(DP)

by 런던살자 2020. 3. 16.

안녕하세요 마블랑입니다.

 

C#에서 Winform을 주로 사용하다 요새 들어 WPF를 배워보았습니다.

 

그동안 Winform(윈폼)을 통해 윈도우의 GUI프로그래밍이 쉽다고 느꼈었는데 WPF는 그것보다 조금 더 어려운 감이 있군요. 

 

Winform(윈폼)과 WPF의 차이점은 여러가지 있겠지만 프로세스나 자원을 건너뛰고 외적인 것만 본다면 화면 디자인을 더 다양하게 구현할수 있는 것이 장점이라고 생각합니다.

 

생각보다 배워야하는 WPF의 기능이 많아 완벽히 이해하고 사용하는데 시간이 오래 걸리겠지만 조금씩 배우면서 포스팅을 작성하려고 합니다. 

 

아직 WPF를 배우고 있어 정확히 설명을 하기는 어렵지만 배우는 시각에서의 C# WPF를 설명하여 이해하기 쉽게 도우려고 합니다.

 

이번 포스팅에는 WPF의 기능중 하나인 DP를 먼저 알아보려고 합니다.

 

DP는 Dependency Property의 약자로 보이는대로 해석하면 의존 속성(프로퍼티)라고 합니다.

 

이해하기 쉽게 설명을 하자면 데이터 변수를 하나 지정하여 속성을 지정해두면 해당 변수의 값에 따라 화면 UI를 바꿀수있는 기능인데요

 

우선 프로그램을 통해서 알아보도록 하겠습니다~

 

아래 빨간 박스로 표시한 부분을 잘 봐주시기 바랍니다~

 

텍스트박스에 컬러를 입력하고 '적용' 버튼을 누르면 더 아래 그림처럼 배경색이 변경됩니다. 

밝은 분홍색인 부분은 StackPanel로 배경색만 바뀐다는 것을 보여주려고 영역을 따로 남겨두었습니다.

 

이제 코드를 살펴보도록 하겠습니다.

 

먼저 xaml 코드입니다.

<Window x:Class="WPF_DPSample.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:WPF_DPSample"
        mc:Ignorable="d"
        Title="MainWindow" Height="450" Width="800">
    <Grid>
        <StackPanel HorizontalAlignment="Left" Height="78" VerticalAlignment="Top" Width="100" Background="#FFF3DBDB">
            <TextBox x:Name="tb_BgColor" Height="23" TextWrapping="Wrap" Text="White"/>
            <Button x:Name="bt_Apply" Content="적용" Click="bt_Apply_Click"/>
        </StackPanel>
    </Grid>
</Window>

 

xaml 코드는 따로 할것은 없습니다. 데이터 값을 입력받을 부분만 잘 구현해주면 됩니다. 

 

위 코드는 텍스트박스를 이용하였지만 체크박스나 콤보박스, 컨텍스트메뉴 등 다양하게 응용할수 있습니다.

 

다음은 C# 코드입니다.

using System;
using System.Windows;
using System.Windows.Media;

namespace WPF_DPSample
{
    /// <summary>
    /// MainWindow.xaml에 대한 상호 작용 논리
    /// </summary>
    public partial class MainWindow : Window
    {
        public String BgColor // '1'
        {
            get { return (String)GetValue(BgColorProperty); }// '3'
            set { SetValue(BgColorProperty, value); }
        }

        public static readonly DependencyProperty BgColorProperty = DependencyProperty.Register( // '3'
            "BgColor",    // '1'
            typeof(String), // '1' 의 데이터 타입
            typeof(MainWindow),
            new FrameworkPropertyMetadata(new PropertyChangedCallback(OnBgColorPropertyChange))); // '2'


        public MainWindow()
        {
            InitializeComponent();
        }

        // '2'
        private static void OnBgColorPropertyChange(DependencyObject d, DependencyPropertyChangedEventArgs e)
        { 
            MainWindow win = d as MainWindow;
            SolidColorBrush brush = (SolidColorBrush)new BrushConverter().ConvertFromString(e.NewValue.ToString()); // e.NewValue 에 현재 BgColor의 값이 들어있습니다.
            win.Background = brush;
        }

        private void bt_Apply_Click(object sender, RoutedEventArgs e)
        {
            BgColor = tb_BgColor.Text; // -> BgColor 의 값을 변경하면 OnBgColorPropertyChange 이 호출됩니다.
        }
    }
}

 

내용이 어려워서 어느정도 이해하고 오픈소스로 활용하면 될것같습니다.

 

 

이처럼 의존 속성은 속성에 해당하는 값을 데이터 변수에 대입하고 속성을 바꾸는 기능인데요

 

주석에서 봤듯이 데이터를 의존속성으로 등록을 해두고 데이터를 변경하면 OnBgColorPropertyChange가 호출되고 이벤트 내부에서 디자인을 변경되는 작업이나 다른 작업을 수행하는 것입니다.

 

 

개인적으로 이해는 되었지만 설명하기에는 많이 부족한듯 합니다.

 

직접 코드를 구현해보면 이해하기 쉬울듯 합니다.

 

 

이상 마블랑이었습니다.

 

읽어주어서 고맙습니다.

댓글