티스토리 뷰

반응형

윈폼팀에서 프로그래머로 활동하는동안 WPF라는걸 봤다.
도우 컨트롤을 사용하는 사용자 정의 컨트롤 만드는것으로 처음 WPF를 시작했다.
이건 뭐...컨트롤의 색깔 하는 바꾸는데도 템플릿을 이해하기 어려워서 쉽게 다가가기 힘든놈이라고
생각했다.


윈폼 컨트롤을 이용한 아래 클래스를 보자.
 

    public class WinformControl : Control

    {

        public WinformControl()

            : base()

        {

            this.BackColor = Color.Green;

        }

    }

 

 

윈폼에서는 이런 간단한 추가를 위해 아래와 같은 것들이 동반되어 온다.

 

        public Form1()

        {

            InitializeComponent();

 

            WinformControl myControl = new WinformControl();

            myControl.Height = 30;

            myControl.Width = 30;

            myControl.Top = 10;

            myControl.Left = 10;

 

            this.Controls.Add(myControl);

        }

 

윈도우에 녹색 사각형을 그리는 소스다.

이번에는 WPF로 같은 걸 만들어 보자.

 

   public class MyWPFControl : Control

    {

        public MyWPFControl()

            : base()

        {

            Background = Brushes.Blue;

        }

    }

 

    public class Window1 : System.Windows.Window

    {

        public Window1()

        {

            MyWPFControl myControl = new MyWPFControl();

            myControl.Height = 30;

            myControl.Width = 30;

 

            // Give the control a position on a Canvas called root.

            Canvas.SetTop(myControl, 10);

            Canvas.SetLeft(myControl, 10);

            root.Children.Add(myControl);

 

        }

     }

 

Background 속성을 사용하는것이 관점이다.
컨트롤 자체는 형태를 띄고 있지 않다.
Control.Template 속성이 컨트롤의 형태를 결정한다.
만약 컨트롤을 만들고 싶으면 이 컨트롤을 상속받을때 반드시 ControlTemplate 부터 사용하는법을 익혀야 할 것이다.
 
기초 단계!
ControlTemplate 은 UI요소들을 가질 수 있습니다.
ContentTemplate 가 최상위에 있으며 자식 UI요소들을 가질 수 있습니다.
물론 UI요소들도 Panel같은 템플릿을 가질 수 있지요.
WPF는 서로 다른 요소들을 요리조리 엮어서 새로운 아이디어를 가진 컨트롤을 만드는
작업입니다.

예를 들어, "Hello world"라고 스트링이 박혀있는 기본 버튼이 있다고 합시다.
이 버튼은 원래 스트링을 표현하기 위해 TextBlock 을 가지고 있지요
 

<Style> 요소로 컨트롤 XAML 을 하나 만들어 봅시다.

 

<ResourceDictionary

    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

    xmlns:local="clr-namespace:CustomControlWPF"

    >

    <Style TargetType="{x:Type local:MyWPFControl}">

        <Setter Property="Template">

            <Setter.Value>

                <ControlTemplate TargetType="{x:Type local:MyWPFControl}">

                    <Border Background="Orange" >

                    </Border>

                 

                </ControlTemplate>

            </Setter.Value>

        </Setter>

    </Style>

</ResourceDictionary>

 

이 ControlTemplate 은 오렌지색 배경에 Border를 가지고 있습니다.
새로운 스타일을 지정하려면 DefaultStyleKeyProperty 에 대해 알아봐야 합니다.
 

 

    public class MyWPFControl : System.Windows.Controls.Control

    {

        static MyWPFControl()

        {

            //This OverrideMetadata call tells the system that this element wants

            //to provide a style that is different than its base class.

            DefaultStyleKeyProperty.OverrideMetadata(typeof(MyWPFControl),

                new FrameworkPropertyMetadata(typeof(MyWPFControl)));

 

           

        }

 

        public MyWPFControl()

            : base()

        {

        }

 

    }


자, 이제 응용프로그램에 이 컨트롤을 추가하면 오렌지 사각형이 나올것을 기대할겁니다.

컨트롤 사이즈를 조절하기 위한 width 나 height도 당근 사용할 수 있겠죠
정말 좋죠?
근데, 오렌지색 사각형이라는 건 아직 그대로네요?

사각형의 색갈을 바꾸고 싶은데.....흠...

자, 바꿔 봅시다.
Control.Background 속성으로 말이죠.

Control.Background 에서는 다양한 템플릿이 있습니다.
 

    <Style TargetType="{x:Type local:MyWPFControl}">

        <Setter Property="Template">

            <Setter.Value>

                <ControlTemplate TargetType="{x:Type local:MyWPFControl}">

                    <Border Background="{TemplateBinding Background}" >

                    </Border>

                 

                </ControlTemplate>

            </Setter.Value>

        </Setter>

    </Style>

 

자 이제 Background 속성을 이용하여 원하는 색상을 Border에 집어 넣은 사용자 컨트롤을 보게 되었습니다.
그외에도 아래의 속성들이 더 있습니다.

Background, BorderBrush, BorderThickness, FontFamily, FontSize, FontStretch, FontWeight, Foreground, HorizontalContentAlignment, VerticalContentAlignment. 

이러한 속성의 공통점은 변경할 수 없다는 것이지만, 컨트롤의 템플릿에서는 열거할 수가 있죠.
템플릿에서 사용할 수 없는 속성이란 없습니다 ^^

예를 들면 스크롤바의 Foreground 속성을 변경해도 스크롤바의 어떤 기능에도 영향을 받지 않습니다.

 

컨트롤 나타냄에 있어 템플릿을 만들고 싶다면 ControlTemplate 덕좀 보세요
독특한 형태의 사용자 컨트롤을 사용할 수가 있습니다.
Templating 은 아주 강력한 툴이죠
그러나 제대로 이해하기 전에는 사용하지 마세요 -0-

- Carole 씀

반응형
댓글