삽질의 현장/- .NET

#106_닷넷(.NET)_ WPF_ WPF 타입 상속 구조

shovelman 2015. 11. 26. 00:27


안녕하세요 삽잡이입니다.


이번시간에는 WPF의 타입 상속 구조에 대해서 알아보려고합니다.



 


해당 그림은 클래스의 상속 구조를 보여주는 예제입니다.


여기에는 FrameworkElement 타입이 있습니다.

Control 이 있고, ContentControl이 있군요...


여기서 알아야할 것은 모든 것이 Content로 사용될 수 있으나,

모든 요소가 Content를 가질 수 있다는게 아니라는 것입니다.


Content는 object 형식입니다.

정수, 문자열, 실수 들도 모두 Content로 가질 수 있습니다.

하지만, 모든 요소들이 Content를 가질 수 있는게 아닙니다.


ContentControl은 속성 Content를 갖습니다.

예를 들어보면 윈도우, 버튼 등 모두 속성 Content를 갖고 있었습니다.

이들이 모두 ContentControl이라는 것이지요.

Content라는 속성을 가지고 있기 때문입니다.


ContentControl 이 바로 Content라는 속성을 가지고 있는 Control입니다.


그런데, 이 컨텐츠가 XAML의 용어로 컨텐츠 아닙니까?

꼭 컨텐츠라는 속성을 가지고 있는 컨텐츠가 ContentControl일까요?

정답은 아닙니다!


뭔말이냐면,

ContentControl은 컨텐츠라는 속성을 가지고 있고,

그외에 Panel, Shape, Decorator가 보이지 않습니까?


Decorator는 말그대로 꾸며주는 역할을 하는 요소인데,

대표적으로 ViewBox가 있습니다.



XAML 코드에서 XML 용어로는

ViewBox가 Button을 가졌다면, ViewBox도 콘텐츠를 가질 수 있지요.

그런데, 그렇다고 콘텐츠 속성을 가지고 있는게 아니라는 것입니다.


Panel도 마찬가지입니다.

Panel은 그룹을 만들어내는 여러가지 컨트롤들이라던가,

사용자와 대화하기 위한 여러가지 요소들을 그룹지을 수 있는 컨트롤입니다.

즉, 여러 요소들을 가질 수 있는 요소를 가리켜 Panel이라고 부릅니다.



<Grid>가 대표적 Panel이고 이 안에 요소들이 들어갈 수 있다 이겁니다.

따라서, Panel도 컨텐츠를 가질 수 있지요.


용어가 다른 것입니다.

XAML의 컨텐츠는 Element 내부에 있는 내용물을 가리키는 것이 Contents이고

WPF의 클래스 차트에서의 ContentControl은 단일 속성 Content를 갖는 놈입니다.


개념은 비슷하지만, 헷갈리시면 안됩니다.



XAML에서의 컨텐츠는 내용물을 의미하는 것입니다.

ContentModel은 꼭 ContentControl만 의미하는 것이 아닙니다.

Panel도 컨텐츠를 갖을 수 있습니다., 컨텐츠라는 속성은 없지만 말이죠.


컨텐츠를 모두 다 갖는 것은 아닙니다.

Shape안에 다른 것을 못 넣지요...

XAML코드에서도 Element 안에서 Content를 못넣는다 이겁니다.


그래서 모든 것이 컨텐츠가 될 수 있으나,

모든 요소들이 컨텐츠를 갖는게 아니라는 것입니다.


대표적으로

Window, Panel, Button, ViewBox 만봐도 

ContentControl은 WIndow와 Button 만이 Content라는 속성을 갖습니다.

그러더라도 XAML 용어로는

넷 모두 컨텐츠를 가질 수 있다는 것이구요.


Button의 컨텐츠로 Ellipse를 만들어도

Ellipse는 Shape이기 때문에 이 안에 데이터를 못 넣습니다.


XAML 용어로는 각각이 모두 컨텐츠이지만,

모든 것들이 컨텐츠를 가질 수 있다는게 아닙니다.

Ellipse는 컨텐츠를 가질 수 없는 컨트롤이기 때문입니다.


Panel, Shape 모두 컨텐츠라는 속성이 없지만,

XAML 상에서 Panel은 컨텐츠를 가질 수 있는 요소고,

Shape은 가질 수 없는 요소라는 것입니다.


아까 공부한 ContentControl은

하나의 컨텐츠를 갖는 컨트롤들은 모두 해당 타입을 상속받아 만들어집니다.


그리고 컨트롤로써 많은 동작을 하게 됩니다.

Button은 컨텐츠 하나만 가질 수 있는데,

다양하게 표현할 수 없을 것 같지만,

Content로써 Panel을 가지면

Panel은 또 수 많은 요소를 컨텐츠로 가질 수 있지 않겠습니까?

그 다른 놈들도 또 ContentControl라는 또 다른 컨텐츠를 가질 수 있으니

이론적으로는 무한히 확장될 수 있습니다.

이게 Contens 모델의 핵심입니다.


그래서 여러가지 개념이 나타나죠.

기존에는 버튼이면 버튼 하나가 끝이었습니다.

그런데, 버튼 위에 수많은 컨텐츠 즉, 객체들이 있을 수 있게 됬지요.

XAML로 말하면 많은 요소들이 붙는다 이겁니다.


기존하고 다른 이벤트를 전달하는 방식이지요.


즉, 컨텐츠들을 가질 수 있다는 뜻입니다.


 


ListBox 내에 있는 여러 요소들을 선택할 수 있습니다.


Button 내에 또다른 컨텐츠들을 가질 수 있기 때문에,

Button에 여러 컨텐츠들을 넣을 수 있지요.


ListBox 안에는 많은 아이템들을 가지고 있고,

이 아이템들은 또 다른 컨텐츠를 가질 수 있죠...

즉, 얼마든지 확장될 수 있다 이겁니다.


WPF의 메커니즘 중 '컨텐츠 모델'이라는 개념이 있기에

단 몇줄의 코드만으로도 쉽게 구현할 수 있게 되는 것입니다.


이번 시간은 여기까지 하도록 하겠습니다.


이상 삽잡이였습니다!