본문 바로가기
프로그래밍 언어/C#

[ C#- WPF ] 기초 이론

by 티옌.liy 2018. 10. 29.

WPF(Windows Presentation Foundation)


MS의 새로운 프리젠테이션 프레임워크로 기존 프레임워크에서 제공하던 GDI, GDI+, HTML등을 포함할 뿐만 아니라 다양하고 새로운 여러 기능과 프레임워크를 제공합니다.



WPF의 주요특징


1. Control, 텍스트, UI 등의 여러요소가 '컨텐츠' 라는 하나의 모델로 통합되었습니다.

2. 컨텐츠를 자동으로 설정해주는 '컨테이너' 요소는 멋진 레이아웃을 만들 수 있도록 도움을 줍니다.

3. DirectX 기반으로 개발되어 WinForm에서 하기 어려웠던 3D 환경의 컨텐츠를 쉽게 생산할 수 있습니다.

4. UI로직( XAML ) 과 데이터 로직( CS ) 가 구분되어있어 디자이너와 프로그래머간의 협업이 개선되었습니다.

5. 그래픽 기능뿐만 아니라, 스트리밍, 동영상, 문서화 기능 등 다양한 기능을 사용할 수 있습니다.


일반적으로 UI작업은 디자이너가 XAML 언어를 사용하여 UI를 제작하고 

프로그램 로직은 프로그래머가 .Net 언어(C#)를 사용하여 기능을 제작합니다.

이렇게 나누어 작업하면 서로 독립적으로 작업을 진행할 수 있고 프로그램 유연성을 높여 프로그램 생산성이 좋아집니다.  WPF는 이러한 협업을 통해 빠르고쉽게 개발할 수 있도록 결합하여 작업할 수 있는 환경을 제공합니다.


UI 작업은 .Net 프로그램 언어로도 작업할 수 있으나, 프로그래머가 일일히 코딩해야하기에 XAML로 작성하는것보다 생산성은 떨어지나, 프로그래머가 직접 UI의 속성 등을 설정할 수 있는 장점이 있습니다.




목차

  • XAML(자멜) - UI
  • 컨텐츠 - UI
  • 이벤트 - 데이터 로직




1. XAML ( 자멜 )   -  UI



XAML XML 기반의 언어로, XAML 컴파일러를 이용하여 .Net(C#) 형식으로 변환됩니다.

그 후, Net 바이너리(.dll, .exe)로 결합됩니다.



아래의 그림은 XAML로 작성한 UI 입니다.

 


<Window x:Class="Sample.MainWindow"

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

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

        Title="MainWindow" Height="300" Width="300">

</Window>



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

XML의 기본 네임스페이스(namespace) 문법으로, XAML에서 클래스나 속성, 이벤트를 사용하는데 쓰입니다.

"http://schemas.microsoft.com/winfx/2006/xaml/presentation"을 기본 namespace로 사용한다는 의미입니다.



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

' x ' 라는 namespace ( namesapce x )를 XAML 코드에서 사용한다는 의미로

클래스, 속성, 이벤트 등에 ' namespace x ' 를 사용해야합니다.

예시 ) <Window x:Class="Sample.MainWindow"



3. Title="MainWindow" Height="300" Width="300">

MainWindow의 Title 속성과 Heigth, Width의 속성값 입니다.




2. 컨텐츠 - UI


WinForm과 같은 컨트롤들은 각 컨트롤이 수행하는 ‘기능‘UI’가 정해져 있었습니다.

또한 컨트롤의 UI을 변경하는 것은 간단한 문자열을 변경하거나 비트맵을 그리는 정도였습니다.

멋진 UI를 사용하기 위해서는 사용자정의컨트롤을 사용해야 했습니다.

WPF는 사용자정의컨트롤을 사용하지 않고 XAML에서 컨텐츠를 사용함으로써 UI를 맘껏 변경할 수 있습니다.



컨텐츠는 Windows Form, Control , TextBox 등 모든 요소가 컨텐츠 입니다. Button의 Text 속성도 컨텐츠입니다.

또한, ContentControl(부모)로부터 파생된 하나의 컨텐츠(자식)만을 가질 수 있습니다.

즉, 하나의 Form에는 버튼 1개만 생성 할 수 있습니다.

그래서 하나의 Form에 무한개의 버튼을 만들 수 있는 Panel이라는 레이아웃이 있습니다.



패널

특징

 겹침

Canvas

가장 기본적인 패널로 자식 요소를 원하는 위치에 배치할 수 있다.

O

StackPanel

가로나 세로 방향으로 자식 요소를 일렬로 정렬한다.

X

WrapPanel

StackPanel과 비슷하지만 자식 요소를 왼쪽에서 오른쪽으로 차례로 배치하며 크기를 벗어나면 다음 줄에 배치한다.

X

DockPanel

지정 방향에 자식 요소를 배치한다.

X

Grid

가장 강력한 패널로 표 형태로 자식 요소를 배치한다.

O





2.1 Canvas Panel


가장 기본적인 패널로, 자식 요소를 원하는 위치(절대 위치)에 배치할 수 있으며, 가장 단순합니다.

Canvas 패널은 윈폼의 그리기 영역과 가장 유사한 패널로 일반적으로 그래픽 콘텍츠를 배치(그리기)하고자 할 때 유용하게 사용할 수 있습니다. 핵심 속성은 Canvas.Left, Canvas.Top, Canvas.Right, Canvas.Bottom 입니.



사용 예시




2.2 Stack Panel

자식 요소를 행(세로)이나 열(가로)로 자동 정렬하여 배치해주는 패널입니다.

보통 다른 패널과 결합되어 많이 사용됩니다.


사용 예시




2.3 Wrap Panel

WrapPanel의 기본 동작은 StackPanel과 같습니다.

다른 점은 자식 요소가 패널의 크기를 벗어나면 다음 줄에 자동으로 배치해줍니다. 


사용 예시





2.4 Dock Panel

DockPanel은 전체 레이아웃을 표현할 때 주로 사용하고, 패널에서 지정한 방향으로 항목을 배치합니다.

자식 요소를 지정한 방향으로 배치시키고 마지막 자식 요소는 남은 공간을 채우도록 배치합니다

Canvas와 같이 DockPanel DockPanel.Dock 이란 결합 속성을 사용하며 이 결합 속성을 사용하여 자식 요소들이 지정한 방향에 배치됩니다. 


사용 예시




2.5 Grid Panel

Grid 패널은 자식 요소를 표 형태로 배치하며, 자식 요소들 간의 간격과 배율을 유지 시킬 수 있습니다.

행과 열로 이루어진 Grid는 셀( Cell )이라 부르는 행열의 위치에 자식 요소를 배치하거나 여러 셀에 자식 요소를 배치할 수 있다.  즉, Excel 같은 패널입니다.

주로, 그리드로 UI 구조의 큰 틀을 잡고 패널을 사용해 세부적인 UI를 꾸밉니다.



사용 예시

1. 기본적인 Grid 패널



2. 여러 셀을 하나로 합지는 Grid



3. 정적 Column(열)의 크기 지정



4. 동적 Column(열)의 크기 지정



5. 배율로 Column(열)의 크기 지정



6. 서로 다른 Grid의 열 크기 공유





3. 이벤트 - 데이터로직






1. 마우스 이벤트

기본클래스 <UIElement>로부터 파생되었습니다.

MouseDown, MouseUp등의 마우스의 동작과 관련된 이벤트를 정의하고 있습니다.

이런 이벤트는 입력과 관련된 기본 클래스인 InputEventArgs로부터 상속받은 MouseEventArgs 대리자를 통해

마우스와 관련된 여러 정보를 확인할 수 있습니다.



사용예시




2. 키보드 이벤트

기본클래스 <UIElement>로부터 키보드 관련 기능을 제공받습니다.

KeyDown, KeyUp등의 이벤트를 KeyEventArgs 핸들러로 전달된다.



사용예시




3. 라우트 이벤트


3.1 터널링 이벤트

부모요소로부터 자식요소로 이벤트가 라우팅(전달)하는 이벤트입니다.

이벤트 접두어로 Preview 가 붙어 PreviewMouseDown 식의 이벤트 이름을 사용합니다.


3.2 버블링 이벤트

자식요소로부터 부모요소로 이벤트가 라우팅(전달)하는 이벤트입니다.

MouseDown 식의 이벤트 이름을 사용합니다.


댓글