Hello WPF! WPF! WPF!
WPF의 아키텍쳐
WPF의 아키텍쳐는 여러계층으로 이루어져 있습니다
상위 계층에서 c#코드로 작성된 고수준의 서비스 및 상호작용과 .net개체를 Direct 3D 텍스쳐, 삼각형으로 해석하는 작업을 milcore.dll언매니지드(unmanaged) 저수준 컴포넌트를 사용해 내부에서 이루어 집니다.
WPF의 아키텍쳐
2. PresentationCore.dll - 모든 도형들의 개체들과 컨트롤이 파생되는 UIElement 타입과 Visual 타입 포함 | |
3. WindowBase.dll - 기본적인 구성요소를 관리합니다. DispatcherObject 타입, DependencyObject 타입의 경우wpf외부에서 재사용이 될수도 있습니다. | |
4. milcore.dll - WPF렌더링 시스템의 핵심입니다. 미디어 통합계층(Media Intergration Layer)의 토대 - WPF 일부임과 동시에 Windows Vista, 7 의 필수적인 시스템구성요소입니다. | |
5. WindowsCodect.dll - 저수준 API입니다. 비트맵, jpeg 의 처리와 출력 및 크기조정같은 이미지 처리를 제공합니다. | |
6. Direct3D - 저수준 API입니다. WPF 모든 그래픽 요소들은 Direct3D를 통해 렌더링합니다. | |
7. User32 - 윈도우를 관리하거나 입력을 처리하는 프로그램의 상태와 관련된 작업을 처리하는 용도입니다. 여전히 이전에서와 같이 WPF에서도 필요하지만, User32의 일반적인 컨트롤은 WPF에서 렌더링하는 부분은 제공되지 않습니다. [출처] WPF-3. WPF 아키텍처|작성자 초천재 |
C# 기반의 모든 프로그램은 클래스로 이루어져 있습니다
WPF또한 마찬가지인데 다음은 WPF의 클래스 계층의 사진입니다
1. System.Threading.DispatchObject
- WPF 응용 프로그램은 단일쓰레드(STA : Single Thread Apartment) 모델을 사용합니다.
- 단일 스레드 모델은 인터페이스 전체를 하나의 쓰레드가 소유하는것을 의미합니다.
- 이를 위해서 WPF응용프로그램은 디스패처(Dispatcher)의 지배를 받는데,
디스팻처는 키보드 입력, 마우스이동, 레이아웃과 같은 프레임워크상에 처리결과로 나오는
메시지 조정 역할을 담당합니다. 모든 사용자 인터페이스는 DistpatcherObject로 파생됩니다.
2. System.Windows.DependencyObject
- WPF에서 화면상 요소들의 상호작용의 기본방법은 property를 사용하는 것입니다.
- 의존속성에 관해서는 다음에 따로 언급하지요
3. System.Windows.Media.Visual
- 모든 시각적 표현은 실제 Visual 클래스에서 담당합니다.
- Visual class는 간단한 하나의 드로잉 객체입니다.
>> 드로잉 명령과,클리핑, 불투명도, 변환설정 등의 세부사항들을 캡슐화합니다.
- WPF라이브러리와 milcore.dll 간의 연결을 제공합니다.
- Visual 클래스에서 파생되는 모든 클래스들은 윈도우에 출력가능합니다.
4. System.Windows.UIElement
- 레이아웃, 입력, 포커스, 이벤트와 같은 필수사항을 지원합니다.
- WPF는 라우티드이벤트(RoutedEvent) 라는 개선된 이벤트 전달 시스템을 구현합니다.
5. System.Windows.FrameworkElement
- WPF의 핵심상속계층의 최종 종착점이자, UIElement 클래스에 정의된 몇가지 멤버를 구현합니다.
- LayOut 시스템을 지원하는 핵심 프로퍼티를 포함합니다.
>>ex) HorizontalAlignment, Margin 프로퍼티 지원
- 애니메이션, 스타일, 데이타 바인딩 지원
6. System.Windows.Shapes.Shape
- 기본적인 도형클래스는 Shape에서 파생됩니다.
- 버튼이나, 텍스트박스 등이 포함됩니다.
7. System.Windows.Controls.Control
- 컨트롤은 사용자와 상호작용할수 있는 element입니다.
- TextBox, Button, ListBox 같은 클래스가 포함되어 있습니다.
- 흥미로운점은 템블릿을 지원한다는것인데, 자신만의 드로잉스타일을 사용하여,
콘트롤의 표준 외향을 변경가능합니다.
8. System.Windows.Control.ContentControl
- 하나의 콘텐츠를 갖고 있는 모든 컨트롤의 기본 클래스입니다.
9. System.Windows.Control.ItemsControl
- 이 클래스는 TreeView 처럼 컬렉션 항목을 나타내는 모든 클래스의 기본클래스입니다.
10. System.Windows.Controls.Panel
- 레이아웃 컨테이너의 기본 클래스입니다.
- 레이아웃 컨테이너는 하나 이상의 자식요소를 담을수 있고,
규칙에 따라 자식요소를 정렬가능합니다. 이는 WPF의 외관상 시스템의 기초입니다.
※ WPF의 일반적인특징
1. 하드웨어 가속 : WPF 모든 드로잉 작업은 DirectX를 통해 수행됩니다.
2. 해상도 독립성 : WPF는 시스템 DPI 설정에 따라 시스템 디스플레이 선호도의 유연성을
제공합니다.
3. 고정되지 않는 컨트롤 외형
4. 선언형식의 사용자 인터페이스
5. 개체기반의 드로잉
XAML과의 개연성
XAML : eXtensible Application Markup Language[출처] WPF-4. WPF 클래스 계층|작성자 초천재
.net 을 인스턴스하기 위한 태그 언어로서 WPF 응용 프로그램에서는 패널과 버튼, 컨트롤의 배치를 정의하는 용도로 쓰입니다
윈도우의 기본적인 디자인은 Markup 언어를 이용, 디자인, 이벤트 처리, 세부적인 프로그래밍의 동적 기능과 흐름은 C#코드가 담당하게 된다는 의미로 이해하면 되겠습니다
XAML 컴파일의 간소화
XAML의 컴파일은 BAML이라는 바이너리 코드로 변환되어 dll어셈블리나 exe어셈블리로 들어갑니다
- 토큰화되어 BAML로 가며 크기가 작아져 최적화, 간소화가 되는 의미입니다
XAML Basic
C#코드에서의 Button 객체 인스턴트화
>>Button btn = new Button();
XAML 코드에서의 Button 객체 인스턴트화
>><Button></Button>
결론적으로 같은 의미로서 사용되어 XAML에서 생성이든 C#에서 인스턴스화든 둘다 같다는 의미가 됩니다. XAML은 tag이므로 element가 중첩될 수 있습니다.
XAML의 네임 스페이스
XAML 코드에서 윈도우 클래스는 다른 공간에 존재가 가능합니다.
그래서 클래스간에 여러 응용프로그램에 정의되어 있는 element가 존재합니다. 그래서 XAML에서도 namespace가 필요합니다.
1. <Window x:Class="WpfApplication2.Window1" [출처] WPF-6. XAML 네임스페이스 및 기본사용|작성자 초천재 |
2,3 번의 경우엔 네임스페이스에 해당되어 xmlns는 xml namespace의 줄임말입니다. 특유 URI로정의 해 두었습니다. 핵심 WPF네임스페이스가 되어 사용자 인터페이스를 만드는데, WPF의 모든 클래스들이 들어있습니다. 네임스페이스 접두사가 없어 문서 전체의 네임 스페이스가 됩니다
그리고 xmlns:x는 다양한 XAML 유틸리티의 기능을 포함한 접두사 X로 매핑됩니다. 이름앞에 X라는 네임스페이스 접두사를 사용하면 적용 가능합니다.
URI?
URI는 인터페이스를 제공해주는 주소로서 전세계적으로 도메인은 하나밖에 존재하지 않기 때문에 위의 예제에서는 미국MS사의 도메인 주소를 사용한 것입니다.(영국의 Jhon,미국의 Jhon 처럼 같은 이름으로 중복될 여지가 있지만 도메인은 전세계적으로 하나이기 때문에)
간단한 예제
<Window x:Class="WpfApplication1.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="소ùO정¢´이I와¯I 함O께÷©÷하I는¥A WPF" Height="350" Width="525">
<StackPanel>
<Button>클¡þ릭¬?</Button>
<Button>클¡þ릭¬?!</Button>
<TextBox>안úE녕øc하I쇼ùi</TextBox>
</StackPanel>
</Window>
xaml코드로 간단하게 창이 뜨는 것을 확인할 수 있습니다.
'프로그래밍언어 > WPF' 카테고리의 다른 글
WPF 데이터 바인딩 (0) | 2011.07.04 |
---|---|
WPF 레이아웃 (0) | 2011.06.29 |
Lan3 WPF Study –step1 (0) | 2011.03.31 |
Hour 6 Introducing Data Binding (0) | 2011.03.24 |
Hour 4: Handling application layout (1) | 2011.03.24 |