Silverlight를 설치하려면 여기를 클릭합니다.*
Korea 대한민국변경|Microsoft 전체 사이트
MSDN
|개발자 센터|라이브러리|MSDN Online|다운로드|코드 센터|Subscriptions|MSDN 행사
MSDN Home   MSDN Home
MSDN 홈 > .NET Framework 홈 > 기술 문서(Articles) > Windows Presentation Foundation 가이드 투어

Windows Presentation Foundation 가이드 투어

  


Tim Sneath
Microsoft Corporation

2005년 9월

적용 대상 :
   WinFX Runtime Components September CTP (PDC 2005 Build)

개요: Windows Presentation Foundation (코드명 "Avalon") 개요와 새로운 그래픽 서브시스템에 대해 소개합니다. 개발자용 릴리스에 포함된 아키텍처와 주요 구성요소를 살펴보겠습니다.

목차

시작
Windows Presentation Foundation
레이아웃 : 화면상에의 요소 배치
XAML
그래픽 및 텍스트 서비스
텍스트
스타일과 데이터 바인딩
데이터 바인딩
문서 서비스
응용 프로그램 모델
고성능 응용 프로그램의 작성
상호 운용성 및 이행
마무리
참조

시작

과거 10 년간 응용 프로그램 개발 모델은 기존의 "스마트 클라이언트"를 설치 한 응용 프로그램과 Web 기반의 응용 프로그램의 커다란 두 가지 흐름이 응용 프로그램 개발 패권을 두고 싸워 왔습니다. Web 응용 프로그램은 많은 사용자들이 이용할 수 있도록 배포가 용이하고 단순합니다만, 상태 정보를 알 수 없고, AJAX와 같은 기술의 재 발견에도 불구하고, 통합 플랫폼 경험(experience)이 불충분합니다. 한편 Windows 환경에서는 오프 라인에서 클라이언트 하드웨어를 충분히 활용하여 응용 프로그램을 간단하게 작성할 수 있지만, Web 응용 프로그램으로 이용 시 배포의 용이함이나 무수한 마크 업 툴 지원이 안됩니다. 현재는 독립 실행형, 브라우저 기본의 응용 프로그램을 이용할 수 있고 배포가 용이한 다양한 툴 지원, 한층 더 플랫폼과 통합된 클라이언트 응용 프로그램 모델이 요구되고 있습니다.

Windows 사용자 경험(experience)의 핵심이 되는 그래피컬 하부조직 (USER32 와 GDI 라이브러리)이 Windows 에 처음 등장한 후 20년이 지났습니다. 물론 USER32나 GDI 도 커다란 진화와 발전을 이뤄 모든 영역에서 새로운 서비스나 신기능이 도입되었습니다. 또 최근에는 비디오 카드 그래픽 기능이 비약적으로 향상되어, Direct3D 등의 새로운 프레젠테이션 기술이 등장하고 있습니다. 그러나 현재의 주류 응용 프로그램은 이러한 그래픽 카드가 본래 실현 가능한 경험(experience)를 제공하지는 않습니다.

Windows Presentation Foundation

Windows Presentation Foundation (코드명"Avalon")는 사용자 인터페이스, 2D 및 3D 그래픽스, 문서, 미디어에 통일적으로 접근 하는 Windows의 새로운 전략적 그래픽 하부조직입니다. .NET Framework를 기반으로 구축되어 Direct3D를 이용해 벡터 기본의 렌더링을 하여 고도의 표현력을 갖춘 모든 종류의 응용 프로그램을 구축하기 위한 강력한 솔루션을 제공합니다. 게다가 "툴 작성의 용이성" 과 유연성을 실현한 선언형 프로그래밍 모델을 제공하여, 설계자는 개발 프로세스의 중요한 역할을 완수할 수 있습니다.

표 1 Windows Presentation Foundation 의 서비스

기본 서비스 XAML, 속성 시스템, 입력 및 이벤팅, 접근성
미디어 서비스 2 D, 3 D, 오디오, 비디오, 텍스트, 이미징, 애니메이션, 특수 효과, 합성 엔진
문서 서비스 XPS 문서, Open Packaging Conventions
사용자 인터페이스 서비스 응용 프로그램 서비스, 배포, 제어, 레이아웃, 데이터 바인딩

Windows Presentation Foundation 의 설계 원칙은 다음의 카테고리로 분류됩니다.

  • 통합. Windows Presentation Foundation는 표1에 나타난 서비스를 모두 갖춘 통합 API를 제공합니다. 오늘날 개발자는 무수한 기술이나 API에서, 2D그래픽스 (GDI 또는 GDI+), 사용자 인터페이스(USER32 또는 Windows Forms), 미디어 (DirectShow), 3D (Direct3D 또는 OpenGL)등 경우에 따라 선택해야 합니다. Windows Presentation Foundation는 이러한 서비스를 모두 갖춘 하나의 모델을 제공하므로 단일 응용 프로그램 안에서 컨텐츠를 지속적으로 통합할 수 있습니다. 2D, 3D, 텍스트 컨텐츠 모두 같은 구조로 애니메이션, 데이터 바인딩 및 스타일링을 할 수 있습니다.
  • 벡터 그래픽스. 「시작」에서 설명한 것처럼, Windows Presentation Foundation 는 최근 PC시스템에 탑재된 강력한 GPU (Graphical Processing Units)를 완전히 활용합니다. 그 중심이 되는 것이 벡터 기본의 합성 엔진으로, 모든 출력이 개별 머신의 해상도에 맞춰 조정됩니다. 렌더링 아키텍처에서는 모든 출력이 Direct3D를 경유합니다. 하드웨어에 DirectX 7이상으로 구현된 비디오 카드에서는 출력 렌더링에 가능한 한 GPU가 사용됩니다. 하드웨어에 의한 렌더링을 할 수 없는 경우, 대안으로서 소프트웨어 렌더링이 가능합니다. 게다가 부동 소수점 논리 픽셀 시스템과 32 비트 ARGB 칼라를 지원하여, 높은DPI 디스플레이 등 미래의 기술의 대응하는 풍부한 색체감 재현이 가능합니다.
  • 선언형 프로그래밍. Windows Presentation Foundation 에서는 XAML (eXtensible Application Markup Language)이라는 XML기본의 언어를 사용하여 중첩된 오브젝트 계층을 인스턴스화하여 동작합니다. XAML는 Windows Presentation Foundation 만을 위해 사용되는 것은 아니며 본질적으로는 UI정의나 생성등의 작업에 적절한 언어입니다. XAML로 설계하면 동적 워크플로 시나리오에서는 응용 프로그램의 실행 시에 UI 논리를 해석 및 조작할 수 있습니다. 중요한 점은 Windows Presentation Foundation로 실현된 XAML/분리 코드 모델에서는, 설계자와 개발자가 Expression Interactive Designer 등의 툴 및 ZAM 3D나 Mobiform Aurora 등의 서드파티의 전문 툴을 사용하여 클라이언트 응용 프로그램을 공동으로 설계, 개발할 수 있습니다.
  • 배포의 용이함. Windows Presentation Foundation는 독립 실행형 응용 프로그램과 Web 브라우저 응용 프로그램을 모두 지원하기 때문에, 양쪽 모두 배포 모델의 장점을 이용할 수 있습니다. Web 브라우저 응용 프로그램은, Internet Explorer 중에서 하나의 윈도우 전체를 사용하거나 인라인 프레임 안에서 실행할 수 있습니다. 또 Web 응용 프로그램 특유의 배포 용이함과 더불어 부분적으로 신뢰할 수 있는 샌드 박스 내에서의 동작은 클라이언트 머신을 위험한 응용 프로그램에서 보호 할 수 있습니다. 게다가 로컬 클라이언트 하드웨어의 성능을 활용하거나 3D나 미디어 서비스 사용, 현시점에서 가장 뛰어난 Web 경험(experience) 할 수 있습니다. 또, 독립 실행형 응용 프로그램을 ClickOnce이나 MSI기술을 통해 로컬에 설치 하여, 플랫폼에 완전하게 액세스 할 수도 있습니다.
  • 문서 라이프 스타일. Windows Presentation Foundation 에서는 새로운 문서와 인쇄 기술이 도입하였습니다. 로컬 스토어에 데이터를 남길 필요가 있는 응용 프로그램은 Open Packaging Conventions 이라는 Office 12에 공유되어 중요한 속성과 사용자 지정 메타데이터, 디지털 서명과 권리 관리 기능을 지원 하는 Zip기본의 패키징 사양을 이용할 수 있습니다. 응용 프로그램이 설치 되어 있지 않은 머신을 포함해 복수의 머신 간의 협업을 위한 문서를 공유하는 경우는 XML Paper Specification 에 의해서 비주얼적인 요소를 인쇄 가능하고 이식 가능한 형식에 고정할 수 있습니다.

그림 1 의 아키텍처는Windows Presentation Foundation의 주된 구성요소를 나타내고 있습니다 (박스의 크기는 각 구성요소의 중요도와는 관계 없습니다).

그림 1 Windows Presentation Foundation 아키텍처

최상위의Presentation Framework가 매니지 API를 제공하여 기반이 되는 기능을 완전히 이용할 수 있도록 합니다. Windows Presentation Foundation로 개발하는 경우, 대부분은 이 레이어만으로 작업을 합니다. 많은 표준 컨트롤 (Button, Label, Menu 등), 레이아웃 패널, 2D 로 3D 의 그래픽스 및 텍스트, 이미징 효과, 미디어, 애니메이션, 문서 서비스의 지원 및 GDI, DirectX Windows Forms/GDI+ 와의 상호 운용성 지원 등이 포함되어 있습니다.

Windows Presentation Foundation의 중심은 비주얼 시스템입니다. Windows Presentation Foundation의 대부분의 요소는 기본 비주얼 클래스에서 파생됩니다. 비주얼 시스템은 모든 데이터를 합성해 화면 출력을 생성합니다. 여기서 비디오, 오디오, 2 D, 3 D, 애니메이션이 통합되어 텍스트 레이아웃 서비스가 제공됩니다. 아키텍처 모델의 하위 부분은 합성 엔진상에 구성되어 투명 레이어에서 윈도우 영역의 무효화까지 모든 것을 고려하여, 비주얼 트리를 화면에 렌더링 합니다.

Windows Presentation Foundation로 만들어진 렌더링은 모두 Direct3D 경유로 처리됩니다 (다만, Windows Vista 하드웨어 로고 프로그램에서는DirectX 9 레벨의 CPU 가 필수). 보다 많은 그래픽 처리를 GPU로 실시하여, CPU를 다른 작업에 배분함으로, 성능이 향상되고 그래픽 품질도 높아집니다. 이러한 이점은 3D 세계뿐이 아니라, 2D그래픽에서도 같은 서비스를 활용할 수 있습니다. GDI는 레가시 요소와의 통합 목적으로만Windows Presentation Foundation 내에서 사용됩니다. Windows Vista 탑재 머신에서는 새로운 디스플레이 드라이버 모델로 미디어 중심의 응용 프로그램용으로, 고도의 퍼포먼스 특성을 가지는 뛰어난 출력이 실현됩니다.

레이아웃 : 화면상에의 요소의 배치

사용자 인터페이스 하부조직의 기반이 되는 서비스의 하나가 레이아웃 즉, 윈도우 내에서의 요소의 배치입니다. Windows Presentation Foundation의 레이아웃 시스템에서는 컨텐츠에 따라 최적화된 데이터, 스타일, 컨트롤 조작성이 뛰어난, 유연하고 확장성이 풍부한 모델이 지원 됩니다.

Win32를 시작으로 하는 기존의 응용 프로그램 플랫폼에서는, 레이아웃이라는 개념이 거의 없습니다. 컨트롤은 캔버스의 (x,y) 좌표상에 배치되어 개발자는 윈도우의 사이즈 변경과 디스플레이의 DPI 설정을 고려하여, 원점과 모든 요소의 좌표를 결정해 수동으로 지정해야 했습니다. Windows Presentation Foundation 에서는 레이아웃을 복수의 방법으로 구현할 수 있고 컨텐츠에 적절한 사이즈 조정 및 윈도우 내에서의 컨트롤과 항목의 위치 관리가 가능합니다.

Windows Presentation Foundation 에서는 거의 모든 요소가 다른 요소의 호스트로서 사용할 수 있습니다. 예를 들어, 다음과 같이 버튼에 화상을 포함할 수 있습니다.

<Window xmlns="http://schemas.microsoft.com/winfx/avalon/2005" >
   <Button Width="260" Height="200" >
      <Image Source="C:\WINDOWS\Web\Wallpaper\follow.jpg" />
   </Button>
</Window>

또 Windows Presentation Foundation 에는 사이즈와 위치를 제한하는 5 개의 레이아웃 패널, Canvas, DockPanel, StackPanel, Grid, WrapPanel 가 있습니다.

주의   SDK 에는 XAML를 검증하기 위한 XamlPad 라는 뛰어난 툴이 있습니다. XamlPad는 사용자가 편집하고 있는 코드의 기본적인 오류 리포트와 WYSIWYG 프리뷰 윈도우를 갖추고 있습니다.

레이아웃 패널

Canvas 를 사용하면 현재의 GDI 나 GDI+ 의 기능을 닮은 (x,y) 좌표축상의 배치 을 할 수가 있습니다. 또 추가된 속성을 사용해 항목의 위치를 제어할 수도 있습니다. 이하는 그 예입니다.

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005">
   <Canvas Background="silver" Margin="20" LayoutTransform="scale 2">
      <Button Canvas.Top="30" Canvas.Left="50">Hello world!</Button>
   </Canvas>
</Border>

이 예에서는 Canvas.Top 와 Canvas.Left 는 Canvas 클래스 속성으로, Button 에 적용되어 버튼의 위치를 제어합니다.

DockPanel 에서는 정확한 (x,y)의 배치를 고려하지 않고 항목을 배치할 수 있습니다.

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005">
   <DockPanel Background="silver" Margin="20" LayoutTransform="scale 2">
      <Menu DockPanel.Dock="Top">
         <MenuItem Header="File" />
         <MenuItem Header="Edit" />
      </Menu>
      <TreeView>
         <TreeViewItem Header="root1">
            <TreeViewItem Header="child" />
         </TreeViewItem>
         <TreeViewItem Header="root2">
      </TreeView>
      <ListBox>
         <ListBoxItem>listBoxItem1</ListBoxItem>
         <ListBoxItem>listBoxItem2</ListBoxItem>
      </ListBox>
   </DockPanel>
</Border>

StackPanel은 컨텐츠를 왼쪽에서 오른쪽 또는 위에서 아래로 배치하는 스택 모델을 제공합니다.

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005">
   <StackPanel Orientation="Horizontal" Background="silver" Margin="20" LayoutTransform="scale 2">
      <Button Height="30" Margin="5">OK</Button>
      <Button Height="30">Cancel</Button>
   </StackPanel>
</Border>

Grid는 행/그리드를 배치하기 위한 모델을 제공합니다.

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005">
   <Grid Background="silver" Margin="20" LayoutTransform="scale 3">
   <Button Width="200" Height="60" VerticalAlignment="Bottom" HorizontalAlignment="Right" Margin="20" >Hello</Button>
   </Grid>
</Border>

그리드내에는 열과 행을 정의할 수 있고 그것에 따라 폭과 높이를 설정할 수 있습니다. 열과 행은 절대치(x 픽셀폭)로 설정할 수 도 있고, 절대치를 사용하여 설정한 나머지의 스페이스를 asterisk에 의해 할당할 수도 있습니다. 또는 계수를 설정해 스페이스의 할당 방법을 결정할 수도 있습니다. 다음은 예입니다.

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005">
   <Grid LayoutTransform="scale 3" ShowGridLines="true">
      <ColumnDefinition Width="30" />
      <ColumnDefinition Width="2*" />
      <ColumnDefinition Width="*" />

      <RowDefinition />
      
      <Button Grid.Column="1" Margin="10">Hello world!</Button>
   </Grid>
</Border>

SharedSizeGroup에서는 복수 오브젝트에 동일한 사이즈를 지정할 수 있습니다. 예를 들어, 사이즈가 다른 두 개의 버튼에 대해서 이 속성을 지정하면 버튼의 폭이 같게 됩니다. 다음은 예입니다.

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005">
<Grid LayoutTransform="scale 2" ShowGridLines="true" IsSharedSizeScope="true" Height="80">
<ColumnDefinition Width="30" />
<ColumnDefinition Width="Auto" SharedSizeGroup="Buttons" />
<ColumnDefinition Width="Auto" SharedSizeGroup="Buttons" />

<RowDefinition />
<Button Grid.Column="1" Margin="10">OK</Button>
<Button Grid.Column="2" Margin="10">A very long cancel button</Button>
</Grid>
</Border>

WrapPanel은 탐색기 윈도우의 우측의 윈도우 범위를 모델링하여 현재의 항목이 행의 끝에 이르면, 새로운 행으로 되풀이합니다. 다음은 예입니다.

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005" LayoutTransform="scale 2">
   <WrapPanel Background="Silver" Margin="10">
<Button /> <Button /> <Button /> <Button /> <Button /> <Button /> <Button /> <Button 
/> <Button /> <Button /> <Button /> <Button /> <Button /> <Button /> <Button /> 
<Button /> <Button /> <Button /> <Button /> <Button /> <Button /> <Button /> <Button 
/> <Button /> <Button /> <Button /> <Button />
   </WrapPanel>
</Border>

이러한 레이아웃 패널은 그 자식 요소의 레이아웃도 실시합니다. 즉, 컨텐츠, 정렬 방법, 여백 사이즈와 형상을 정의할 수 있습니다. 패널의 아이들에게는 TextBox 나 Button 등의 요소를 사용하거나 또는 다른 패널을 아이들이 사용할 수도 있습니다. 예를 들어, DockPanel 안에 StackPanel를 포함할 수 있습니다.

항목의 사이즈는 포함되어 있는 컨텐츠에 따라 조정됩니다. 이것은 중요합니다. 왜냐하면, 예를 들어 같은 의미의 문장에서도 언어에 따라서 텍스트의 길이가 다르지만, 패널을 사용하면 응용 프로그램을 로컬라이즈 해도, 응용 프로그램 레이아웃을 다시 조정할 필요가 없기 때문입니다. 정렬 방법은 HorizontalAlignment/VerticalAlignment 속성을 사용하고, 여백은 Margin 속성을 지정합니다.

ScrollViewer 에서는 자식의 컨텐츠에 스크롤 바를 설정합니다. 이용 가능한 스페이스에서 컨텐츠가 오버플로우 하면, 스크롤 바가 표시되어 사용자가 컨텐츠 영역을 이동할 수 있게 됩니다. 이하는 그 예입니다.

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005" 
        LayoutTransform="scale 2">
   <ScrollViewer>
      <TextBlock FontSize="20" TextWrapping="Wrap" FontFamily="Global User Interface">

Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Fusce posuere volutpat erat. 
Praesent imperdiet nibh nec pede. Mauris quis orci. Maecenas luctus, risus tempus 
dapibus mollis, magna metus convallis nunc, eget pulvinar eros ipsum consectetuer dui. 

      </TextBlock>
   </ScrollViewer>
</Border>

ViewBox 에서는 ScrollViewer 와는 반대로 컨텐츠의 사이즈가 부모패널에 들어가도록 제한됩니다. 이렇게 하여 일종의 자동 줌 효과를 얻을 수 있습니다.

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005">
   <Viewbox>
      <TextBlock FontFamily="Global User Interface">
         Lorem ipsum dolor sit amet, consectetuer adipiscing elit.
      </TextBlock>
   </Viewbox>
</Border>

레이아웃 프로토콜이란 협상의 형태를 취하는 반복적인 프로세스입니다. 이렇게 하여 배치 요소에 관한 요구에 근거하여 모든 요소에 대해서 "충분한" 스페이스를 확보할 수 있습니다. 우선, 측정 프로세스가 실행되어 부모가 자식의 사이즈를 문의하고 자식는 그에 대한 DesiredSize 로 응답합니다. 다음에 배치 프로세스가 실행되어 부모가 ActualSize 성을 사용하여 자식의 사이즈를 지정합니다. 계산시에는 Double.PositiveInfinity 이라는 특수한 값이 "컨텐츠에 맞추어 사이즈를 조정한다" 라는 의미가 됩니다. 이 값을 취급하는 경우는 패널 MeasureOverride과 ArrangeOverride의 두가지 요소를 오버라이드(override) 합니다.

XAML

그래픽 기능을 상세하게 살펴보기 전에, Windows Presentation Foundation에서 XAML사용법에 대해 간단하게 설명하겠습니다. XAML를 사용한 샘플을 몇 가지 보겠습니다. 여기서 중요한 것은 XAML 이 단지 UI 코드를 간단하게 쓰기 위한 언어가 아니고, Windows Presentation Foundation의 필수 구성요소라고 하는 것입니다. XAML로 완성된 것은 C# 나 Visual Basic 등의 .NET 언어에서도 실시할 수 있습니다.

위의 레이아웃 패널을 설명으로 나타낸 최초의 예를 봅시다.

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005">
   <Canvas Background="silver" Margin="20" LayoutTransform="scale 2">
      <Button Canvas.Top="30" Canvas.Left="50">Hello world!</Button>
   </Canvas>
</Border>

Visual Basic 에서는 다음과 같이 기술할 수 있습니다.

Dim myBorder As New Border, myCanvas As New Canvas, myButton As New Button

With myCanvas
   .Background = Brushes.Silver
   .Margin = New Thickness(20)
   .LayoutTransform = New ScaleTransform(2.0, 2.0)
End With

With myButton
   .Content = "Hello World"
End With

myCanvas.Children.Add(myButton)
Canvas.SetTop(myButton, 30.0)
Canvas.SetLeft(myButton, 50.0)

myBorder.Child = myCanvas 
or in C# as:
Border b = new Border();
Canvas c = new Canvas(); 
Button btn = new Button();

c.Background = Brushes.Silver;
c.Margin = new Thickness(20);
c.LayoutTransform = new ScaleTransform(2.0, 2.0);
btn.Content = "Hello World";
            
c.Children.Add(btn);
Canvas.SetTop(btn, 30.0D);
Canvas.SetLeft(btn, 50.0D);

b.Child = c;

this.Content = b;

이 간단한 예만 보아도 XAML가 오브젝트 구축을 위해 일관되게 정리된 계층 모델을 가지고 있어 현재의 Windows Forms 에서 필요로 하는 코드의 비표시 영역이 XAML에서는 불필요하다는 것을 알 수 있습니다.

그러나 XAML는 .NET Framework 언어에 대한 완전한 대체 언어는 아닙니다. XML 마크업 언어를 고도의 구조와 flow control 논리 대신에 이용할 수 없습니다. 또 XAML는 기존의 프로그램 언어와 함께 사용하도록 설계되어 있습니다. XAML를 컴파일 하면 부분 클래스 (1 개의 클래스 정의를 복수의 파일로 분리하기 위한 .NET Framework 2.0 의 신기능) 안의 바이너리 표현에 컴파일 됩니다. 그 클래스의 나머지의 반은 언어를 자유롭게 선택해 구현합니다. 예를 들어, Visual Basic 에서는 다음과 같이 됩니다.

Partial Public Class Window1
    Inherits Window
...
End Class
and in C#:
public partial class Window1 : Window { ... }

작성한 코드에서는 XAML 의 모든 이름 요소에 액세스 할 수 있습니다. 이 동작은 코드내에서 이름 요소를 선언했을 경우와 같습니다. 이러한 액세스가 가능한 것은 코드가 같은 클래스의 일부이기 때문입니다.

XAML를 사용하여 모델과 뷰의 분리 등 뛰어난 아키텍처 원칙이 지원됩니다. 개발자와 설계자가 특수용도의 툴 (예를 들어, 3D 디자인 툴, 설계자용 툴, 개발 툴, 고급 지향의 typography 툴)을 사용하여 공동 작업을 실시할 수 있어 XAML로 출력하여 이들 툴을 조합해 고도의 UI를 구축할 수 있습니다.

그래픽 및 텍스트 서비스

「시작」에서 말한 것처럼, 현재의 Windows 그래픽스 플랫폼 (GDI)은 약 20 년의 역사가 있습니다. 과거 몇 년간 3D 의 분야에서 큰 변혁이 있었습니다만, GDI 의 개발자는 지금까지 그 혜택을 거의 받지 못했습니다. 오늘의 그래픽스 하드웨어의 진보는 3D 파이프라인이 중심이며, Windows Presentation Foundation는 최신의 PC가 가지는 그래픽 기능을 충분히 활용하기 위해, 종래의 2D 기본의 기술에 대신해 전략적으로 배포하기 위한 기술입니다. 2D, 3D, 텍스트, 화상 및 비디오 등의 다른 그래픽스 요소가 모두 같은 파이프라인을 경유합니다.

Windows Presentation Foundation는 응용 프로그램과 컨텐츠를 위한 메인 스트림 그래픽스 서비스를 제공합니다. 또 새로운 그래픽 카드로 일반적으로 지원 되는 3D 하드웨어를 활용하는 응용 프로그램 모델을 제공합니다. Windows Presentation Foundation에서는 벡터 기본의 컨텐츠가 한층 더 중요시되고 있습니다. 또 논리 픽셀에 맵 되어 고 DPI 화면을 지원하는 가상 픽셀을 사용하여, 해상도 의존에서 벗어났습니다. 새로운 렌더링 모델의 부차적인 효과로서 보충의 처리를 실시하지 않아도 화상 변환을 적용할 수 있습니다. Windows Presentation Foundation는 큰 그래픽스 환경 안에 통합된 구성요소로, 예를 들어, 새로운 Windows Vista 디스플레이 드라이버 모델을 활용하거나 프린트 모델과 기능을 공유하거나 터미널 서비스 경유로 고도의 재현을 할 수 있는 리모트 환경을 실현할 수 있습니다.

그림 3 North Face 의 점내 설치용 탐색기 프로토 타입

그림 3은 PDC 2005 컨퍼런스에서 전시된 실감 넘치는 응용 프로그램 경험(experience)를 나타내고 있습니다. 모두 3D로 구현되었습니다. 텍스트는 서브 픽셀 ClearType를 이용하였습니다. 비디오 컨트롤의 작성은 합성에 따라 다른 컨텐츠 타입이 통합되어 상호작용 형식의 경험(experience)이 실현되었습니다.

Windows Presentation Foundation 개발에는 복수의 레이어가 있습니다. 관리형 코드는 대부분의 개발자가 프레임워크 수준으로 작업해 System.Windows.Shapes, System.Windows. Media 등의 이름 공간의 오브젝트를 사용하거나, 기존의 그래픽스 연구 최종 단계 대신으로 하위 비주얼 레이어 수준으로 작업합니다(레이아웃이나 데이터 바인딩 등의 서비스를 이용하지 않고 그림에 원시적으로 액세스 한다). 이미징 코덱이나 효과 등의 서비스에의 액세스나 확장에는 비관리형 코드도 사용할 수 있습니다.

2D 그래픽스

Shapes 는 개발에 사용할 수 있는 가장 기본적인 2D 그래픽 요소로, 브러쉬, 펜, 도형, 변환 등이 포함되어 있습니다. 모든 속성은 의존 속성입니다. 즉, 애니메이션 효과나 데이터 바인딩 등을 적용할 수 있습니다.

For example:
<StackPanel xmlns="http://schemas.microsoft.com/winfx/avalon/2005">
<Slider Name="WidthSlider" Maximum="200" Minimum="10" />
<Rectangle Fill="LinearGradient 0,0 1,1 #FF3366FF #FFFFFFFF" Height="100" 
Width="{Binding ElementName=WidthSlider, Path=Value}" />
</StackPanel> 

(데이터 바인딩에 대해서는, 다음에 자세하게 설명합니다)

이러한 단순한 작업에서도 Win32 에서는 다시 그리기를 해야 하기 때문에, 코드의 양이 큰 폭으로 증가합니다. 사각형등의 형상이 FrameworkElement 에서 파생되어 레이아웃 시스템에 참가하고 있게도 주의해 주세요. 이 때문에, 이하의 코드에서는 사이즈가 커지는 것에 따라, 나머지의 스페이스의 타원이 작아집니다.

<DockPanel xmlns="http://schemas.microsoft.com/winfx/avalon/2005">
   <Slider Name="WidthSlider" DockPanel.Dock="Top" Maximum="200" Minimum="10" />
   <Rectangle Fill="Red" Width="{Binding ElementName=WidthSlider, Path=Value}" />
   <Ellipse Fill="Blue" />
</DockPanel>

Brushes는 도형을 채우는 데 사용합니다. 브러쉬의 종류는 많이 있지만, 잘 사용되는 것은 아마 솔리드, 그라데이션, 타일입니다. 개발의 대부분을 XAML로 실시하는 경우는, 기본으로 솔리드 브러쉬를 사용하는 것도 가능합니다.

그라데이션브라 시는 미묘한 페이드나 드라마틱한 효과를 내기 위해서 사용합니다. 눈의 착각을 이용한 화상을 예로서 설명합니다.

<Grid xmlns="http://schemas.microsoft.com/winfx/avalon/2005">

<!-- Strange optical effect. Stare at this for a while and then change 
     the first gradient stop from Black to LightBlue. For a while, it
     will seem as if the gradient has disappeared altogether. -->

   <Rectangle>
      <Rectangle.Fill>
         <LinearGradientBrush StartPoint="0.0, 0.0" EndPoint="0.01, 0.03" 
                              SpreadMethod="Reflect">
            <LinearGradientBrush.GradientStops>
               <GradientStop Color="Black" Offset="0.3" />
               <GradientStop Color="Silver" Offset="0.8" />
            </LinearGradientBrush.GradientStops>
         </LinearGradientBrush>
      </Rectangle.Fill>
   </Rectangle>
</Grid>

ImageBrush는 코덱 (예를 들어, PNG, JPEG, GIF)이 지원 하는 모든 화상을 브러쉬로서 사용할 수 있는 타일 브러쉬입니다. 다른 타일 브러쉬와 같이 ImageBrush의 컨텐츠는 확대 및 축소, 화상 기울기, 회전, 신축, 변환도 가능합니다.

가장 강력한 브러쉬의 하나가 VisualBrush 입니다. 이것은 모든 비주얼 오브젝트가 컨텐츠가 되는 TileBrush 입니다. VisualBrush 를 사용하면, 라이브의 "보조" 표현이 가능합니다. 또는 브러쉬 자체에 비주얼 컨텐츠가 있어, 그것을 변형할 수도 있습니다.

<StackPanel xmlns="http://schemas.microsoft.com/winfx/avalon/2005" 
  LayoutTransform="scale 2">
      <StackPanel Name="reflectedPanel" Orientation="Horizontal">
         <TextBox Width="300" FontSize="48">Reflections...</TextBox>
         <Button Content="OK" Margin="2" />
      </StackPanel>
      <StackPanel Height="{Binding Path=(StackPanel.ActualHeight),
                                         ElementName=reflectedPanel}">
         <StackPanel.Background>
            <VisualBrush Stretch="None" Opacity="0.75"
              AlignmentX="Left" AlignmentY="Top"
              Visual="{Binding ElementName=reflectedPanel}">
               <VisualBrush.RelativeTransform>
                  <TransformGroup>
                     <MatrixTransform Matrix="1,0,0,-1,0,0" />
                     <TranslateTransform Y="1" />
                  </TransformGroup>
               </VisualBrush.RelativeTransform>
            </VisualBrush>
         </StackPanel.Background>

         <StackPanel.OpacityMask>
            <LinearGradientBrush StartPoint="0.5,0" EndPoint="0.5,1">
               <LinearGradientBrush.GradientStops>
                  <GradientStop Color="#FF000000" Offset="0.0" />
                  <GradientStop Color="#00000000" Offset="0.8" />
               </LinearGradientBrush.GradientStops>
            </LinearGradientBrush>
         </StackPanel.OpacityMask>
      </StackPanel>
   </StackPanel> 

SDK 에는,이 밖에도 VisualBrush 의 사용 방법 샘플이 준비되어 있습니다.

특정의 artwork를 응용 프로그램 전체로 사용하는 경우, 벡터 렌더링 명령을 나타내는 drawing 를 사용할 수 있습니다. 벡터 렌더링 명령은 한 번 선언하면, 몇 번이라도 재사용할 수 있습니다. 그 대표적인 예로서 벡터 그래픽스나 아이콘이 있습니다. drawing 는 비주얼 레이어로 동작하는 경쾌한 오브젝트입니다. 이 오브젝트는 레이아웃 시스템에 참여하지 않기 때문에 성능이 중시되는 경우에 이용할 수 있습니다.

Windows Presentation Foundation가 갖추고 있는 편리한 클래스에 그림과 브러쉬를 1 개에 조합하는 DrawingBrush 클래스가 있습니다. 이것은 2D 또는 3D 표면에 적용할 수 있는 타일 브러쉬이며, 정적 벡터 리소스를 입력해 다른 장소에서 사용할 수 있습니다.

3D 그래픽스

Windows Presentation Foundation가 갖추고 있는 편리한 클래스에 그림과 브러쉬를 하나에 조합하는 DrawingBrush 클래스가 있습니다. 이것은 2D 또는 3D의 표면에 적용할 수 있는 타일 브러쉬이며, 정적 벡터 리소스를 입력해 다른 장소에서 사용할 수 있습니다.

중심적인 오브젝트의 하나로 Viewport3D 라는 3D 컨텐츠를 호스트 하는 2D 요소입니다. 이것은 모델, 조명, 카메라를 나타냅니다. Model3D 는 2D 의 그림에 유사한 3D 오브젝트이며, 특정의 3D 도형을 나타냅니다. 소재는 texture나 조명의 특성으로 나타내집니다. 텍스트, 비디오, 형상, 그림 등 컨텐츠는 모두 소재내에서 브러쉬로 사용할 수 있습니다.

모델을 수동으로 제작하는 일은 귀찮은 작업입니다. 이것을 해결하는 한가지 방법은 Electric Rain 의 ZAM3D 등의 툴을 사용하는 것입니다. 또 3D에서는 데이터 가시화를 위한 사용자 인터페이스 (3D 그래프의 작성, 2D 컨텐츠와 복수의 2D 데이터 세트의 슈퍼 포지셔닝 사이의 이행)에서도 자연스럽게 사용할 수 있습니다.

그림 4 ZAM3D로 렌더링 한 Channel 9 의 마스코트

Windows Presentation Foundation의 3D API는 DirectX를 대신하는 것이 아닙니다. 리얼한 3D 게임, 대규모 3D 응용 프로그램 (예를 들어, CAD), 및 범용적인 GPU 시나리오에는 Direct3D를 사용하여 주세요. Windows Presentation Foundation는 Direct3D 의 "수동"/"스틱 시프트" 모드와 완전히 동일이라고 생각할 수 있습니다.

이미징

Windows Presentation Foundation 는 코덱의 라이브러리 경유로, 대부분의 일반적인 화상 형식을 지원 합니다.

<Image Width="200" Source="sampleImages\apple.jpg" />

화상은 기본적으로는 사각입니다만 기하학적인 도형으로 잘라낼 수 있습니다.

<Border xmlns="http://schemas.microsoft.com/winfx/avalon/2005" Margin="20">
<Image 
  Source="C:\WINDOWS\Web\Wallpaper\follow.jpg" 
  Width="200" Height="150" HorizontalAlignment="Left">
  <Image.Clip>
    <EllipseGeometry
      RadiusX="100"
      RadiusY="75"
      Center="100,75"/>
  </Image.Clip>
</Image>
</Border>

ImageBrush를 사용하고, 화상을 texture로서 적용할 수 있습니다. 이하는 그 예입니다.

  <Ellipse Stroke="Purple" StrokeThickness="5.0">
    <Ellipse.Fill>
      <ImageBrush 
         ImageSource="table-bowl.jpg" 
         TileMode="Tile" 
         Viewport="0,0,.3,.3" />
    </Ellipse.Fill>
  </Ellipse>

ImageSource은 벡터 화상 (DrawingImage) 또는 비트 맵 화상(BitmapSource)의 기본 클래스입니다.

Windows Presentation Foundation는 인프레이스 업데이트를 사용하는 것으로써, 메타데이터에 관해서 풍부하고 확장 가능한 지원을 제공합니다 (JPEG 의 EXIF 데이터를 변경해도, 파일 전체를 읽고 쓸 필요가 없습니다). 또 알기 쉬운 쿼리 기능도 있는데, 예를 들어 다음과 같은 것이 가능합니다.

BitmapMetadata m = ((BitmapMetaData)myImage.Metadata); // get metadata from a JPEG
string focalLength = m.GetQuery("System.Photo.FocalLength"); 
string exposure = m.GetQuery("System.Photo.ExposureTime");

또는 키가 설정되지 않은 메타데이터를 (TIFF 에서) 취득합니다.

string value123 = m.GetQuery("/ifd/{uint=123}"); // from a TIFF

미디어

프레임워크의 요소 레벨에 비디오와 오디오를 지원 하는 MediaElement 라고 하는 오브젝트가 있습니다. 이 오브젝트는, 타임 라인과 클락을 사용해 제어할 수 있습니다 (재생, 일시정지, 시크 등). Windows Presentation Foundation 는 WMV, MPEG, 및 일부의 AVI를 지원 합니다. 또 다음 빌드에서는 미디어를 애니메이션과 동기 할 수 있게 됩니다.

특수 효과

비트 맵 화상의 특수 효과에서는 BitmapSource를 사용하여, BitmapSource 를 반환합니다. 일반적으로는 비트 맵의 특수 효과를 비주얼 트리의 비주얼 오브젝트에 적용합니다. 중요한 것은 이미지의 효과가 확장 가능한 것입니다. 따라서, 독자적인 이미지의 효과를 작성하고, 다른 사용자가 그것을 적용할 수 있습니다.

이하는, 사용 방법의 예입니다.

<StackPanel.BitmapEffect>
   <BlurBitmapEffect Radius="8" />
</StackPanel.BitmapEffect>

애니메이션

의존 속성은 모두 Windows Presentation Foundation 오브젝트상에서도 애니메이션화할 수 있습니다. 애니메이션은 오브젝트 레벨로 실행됩니다만, 조정을 용이하게 하기 위해서, 애니메이션을 스토리 보드 레벨로 사용하는 것이 일반적입니다. 애니메이션은 프레임 기본이 아닌 시간 기본으로, 시간적 해상도에는 의존하지 않습니다 (즉 1초간에 렌더링 되는 프레임수는 문제되지 않기 때문에, 애니메이션 속도는 시스템 성능에 의존하지 않습니다).

스토리 보드는 속성이 아닌 방아쇠에 의해 동작합니다. 방아쇠는 이벤트 가져와 (Button.Click 등) 하나 이상의 동작 (ColorAnimation 나 DoubleAnimation 등)을 제어할 수 있습니다. 즉, 복수의 요소의 속성이 사용됩니다. 다음은 애니메이션을 실행하는 예입니다.

<Page
    xmlns="http://schemas.microsoft.com/winfx/avalon/2005"
    xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005">

  <Ellipse Width="200" Height="200">
    <Ellipse.Triggers>
      <EventTrigger RoutedEvent="Rectangle.Loaded">
        <BeginStoryboard>
          <Storyboard>
            <ColorAnimation
                From="Blue"
                To="Red"
                Duration="00:00:01"
                RepeatBehavior="Forever"
                AutoReverse="true"
                Storyboard.TargetName="gradientStop"
                Storyboard.TargetProperty="Color" />
          </Storyboard>
        </BeginStoryboard>
      </EventTrigger>
    </Ellipse.Triggers>
    <Ellipse.Fill>
      <!-- Animated Linear Gradient -->
      <LinearGradientBrush x:Name="brush" EndPoint="1,1">
        <LinearGradientBrush.GradientStops>
          <GradientStopCollection>
            <GradientStop Color="Blue" Offset="0" />
            <GradientStop x:Name="gradientStop" Offset="0.5" />
            <GradientStop Color="Red" Offset="1" />
          </GradientStopCollection>
        </LinearGradientBrush.GradientStops>
      </LinearGradientBrush>
    </Ellipse.Fill>
  </Ellipse>
</Page>

이 간단한 예에서는 왼쪽 상단에서 오른쪽 하단 걸쳐 원의 이동에 따라 화면의 색이 바뀌고, 완료되면 역방향으로 바뀌기 시작됩니다. 위의 코드의 중앙에서 GradientStop 가 파랑에서 빨강으로 애니메이션화 된 후 반대로 실행됩니다.

애니메이션은 복잡한 토픽으로 이 화이트 페이퍼로 설명할 수 있는 개요 이상의 사항이 많이 있습니다. 코드에서 스토리 보드를 사용하는 방법의 샘플과 상세한 내용은 SDK의 문서를 참조해 주세요.

텍스트

Windows Presentation Foundation 에서는 ClearType 를 사용한 차세대의 텍스트 렌더링이 도입되어 컴퓨터 디스플레이로 텍스트를 한층 더 읽기 쉽게 하기 위한 수많은 신기술이 탑재되어 있습니다.

Windows Presentation Foundation 의 ClearType 에는 특히 다음의 3 살의 신기능이 준비되어 있습니다.

  • 서브 픽셀 포지셔닝
  • 자연스러운 어드밴스폭
  • Y 방향의 에일리어징 제거

Windows 3.1 에 포함되어 있던 “흑백”의 TrueType 폰트가 많고 (예를 들어, Times New Roman 나 Arial)에서는, 자연스러운 어드밴스폭을 변경해 문자의 균정을 정돈하기 위해서, 많은 모양의 힌트가 추가되어 있었습니다. 어드밴스폭은 통상 ±2 픽셀 단위로 변경되었습니다. 흑백의 픽셀의 해상도가 낮은 경우 읽기 쉬움을 확보하기 위해서는, 문자의 균정등이 문자폭의 정확함보다 훨씬 중요하게 됩니다. ClearType에서는 옆 방향의 고해상도가 실현되고, 모양의 균정과 어드밴스폭의 정확함이 양립합니다. GDI는 해상도는 높습니다만, 모양의 폭을 정수 픽셀로 표현한다고 하는 제약 때문에 모든 폭이 근사 픽셀치에 말 수 있습니다.

마이크로소프트에서는 GDI 의 시스템으로 모든 폰트에 ClearType 를 사용하는 것을 목표로 하고 있기 때문에, ClearType on 의 폭을 ClearType off 의 폭과 같게 할 필요가 있었습니다 (폰트 스무딩에서도 실시). 이 동작을 실현하기 위해, 어드밴스폭을 흑백과 같게 설정하여 호환폭 모드를 GDI 에 추가해야 하는데, 그 때문에 모양에 작은 오류가 생깁니다. 이 오류는 모양 형상이 인식할 수록 비뚤어져, 모양사이즈가 작아질수록, 감마 설정의 잘못되어 큰 문제가 됩니다 (Windows XP PowerToy 에 포함되어 있는 ClearType Tuner 에 의해서 완화할 수 있습니다).

GDI 에서는 호환폭과 비호환폭의 어느 쪽이든 선택할 수 있습니다. 호환폭에서는 약간의 오류은 있어도 흑백의 경우나 폰트 스무딩의 경우와 완전히 같은 폭을 작성할 수 있습니다. 비호환폭은 "자연폭" 이라고도 불려 Windows XP SP1 로 사용할 수 있습니다. 이 모드에서는 고품질의 ClearType를 이용할 수 있지만, GDI 에 포함되어 있기 때문에 픽셀치가 정수에 한정되어 있습니다.

Windows Presentation Foundation는 서브 픽셀 포지션의 ClearType 를 사용합니다. 이 때문에 ClearType 가 가지는 완전한 정확함을, 화면상에서 재현할 수 있습니다. 이 옵션을 사용하면 모양의 시점과 종료의 양쪽 모두가 임의의 픽셀 위치로 설정할 수 있습니다. 이것은 특히 kerning와 조합하면, 매우 고품질인 형상을 화면에 표시할 수 있습니다. 고품질의 스페이싱은 화면상에 아름다운 텍스트를 표시하기 위한 중요한 요소입니다. 서브 픽셀 포지셔닝에서는 콘트라스트가 약간 손상됩니다만, 뛰어난 스페이싱이 이것을 보충합니다. 이 고정밀도의 스페이싱에 의해서 텍스트를 디바이스에 의존하지 않는 방법으로 배치할 수 있습니다.

마지막으로 Y 방향의 에일리어징을 제거하여 수직축의 문자 모양의 구석이 매끄럽게 됩니다. 이 축의 RGB 서브 픽셀은 이용할 수 없습니다만, 텍스트 렌더링 제도를 큰폭으로 높입니다.

Windows Presentation Foundation는 모든 텍스트 렌더링에서 합성, 필터, 브랜드를 사용하여 CPU 의 작업 부하를 경감하기 위해, 적절한 그래픽 카드가 사용하여, 하드웨어에 의한 고속처리를 실현할 수 있습니다. Windows Presentation Foundation로 텍스트의 지원이 향상하고 된것은 특히 동아시아 지역의 폰트를 사용하는 사용자에 있어서는 주목할 만합니다. 이러한 폰트에서는 지금까지 ClearType가 지원 되지 않고, 플랫폼을 충분히 활용할 수 없었습니다.

GDI 렌더링을 탑재한 Windows XP
Windows Presentation Foundation

또 Windows Presentation Foundation 는 분수, 임의 또는 문맥의 합자, 작은 폰트의 대문자, 앤티크 문자의 숫자 등 많은 새로운 OpenType 폰트 기능을 지원 합니다. 이하는 이러한 기능으로 문자 품질이 큰 폭으로 향상된 예입니다. 이하의 행을 XamlPad 에 입력하여 텍스트가 어떻게 렌더링 되는지를 테스트해 주세요 (여기서 사용하고 있는 활자는 최신 버전의 Windows Vista 에서만 이용 가능해서, 이 테스트에는 Windows Vista를 사용할 필요가 있습니다).

<RichTextBox xmlns="http://schemas.microsoft.com/winfx/avalon/2005" 
             FontFamily="Segoe Script" FontSize="44" />

"o" 나 "t" 와 같은 개개의 모양이, 완전하게 그 문맥에 따라 변화하는 것을 주목해주세요. 이 변화는 폰트내로 설정된 추가의 힌트 정보가 렌더링 엔진에 대해, 인접하는 문자에 따라 어느 모양을 사용하는지를 지정하는 것에 의해서 생깁니다. 특히 스크립트 폰트에서는 훨씬 자연스러운 "자필" 과 같은 맛이 있는 문자가 표시됩니다.

좀 더 극적인 예로서 이하의 아름다운 필기체의 문자를 봐 주세요. Windows Presentation Foundation 가 Adobe Compact Font Format (CFF)를 지원 하여, 이러한 문자가 가능하게 되었습니다. 이것은 Bickham Script Pro 입니다.

이 예는 문맥에 따른 모양 변화 (r, y, l, g)나 결합 (Th)이 어떻게 행해지고 있을까에 주목해 주세요. 이러한 세련된 기능이 Windows Presentation Foundation 에서는 표준으로 제공됩니다.

Windows Presentation Foundation 에서는 TextBlock 또는 TextFlow 를 사용하여 텍스트 런을 표시할 수 있습니다. TextBlock 가 단순하게 단일 블록의 텍스트를 표시하는데, TextFlow는 XAM를 사용하여, 복수의 패러그래프로 구성되는 컨텐츠를 표시하는데 편리합니다. 비주얼 레이어에서는 DrawingContext.DrawText()가, GDI 의 세계에서의 DrawText 에 상당해, TextRun 나 Glyph 등 개념을 표현하는 클래스가 존재합니다. FormattedText 는 텍스트 API 내에서 특히 편리한 클래스입니다. 텍스트를 입력해 BuildGeometry() 메소드를 사용하여 벡터도형을 추출하면, 통상의 벡터를 사용할 수 있는 장소이면 어디서나 그 벡터도형을 사용할 수 있습니다.

Windows Presentation Foundation 에는 개별의 텍스트 런의 렌더링을 지원 할 뿐만 아니라 읽기 쉽고하기 위한 강력한 제어 기능이 포함되어 있습니다. 예를 들어 SinglePageViewer 클래스는 후로드큐먼트의 컨테이너를 제공해, 그 컨테이너가 다채로운 컨텐츠를 호스트 할 수 있습니다. 이 모델은, 대량의 텍스트 컨텐츠의 표시가 필요한 전자 북 등에 적합합니다.

필요한 경험(experience)에 맞추고 SinglePageViewer 컨트롤의 스타일을 재설정할 수 있습니다 (버튼의 변경 등).

주석

주석은 DocumentViewerBase 에 근거하는 두가지의 문서 컨트롤에 포함되어 있습니다. 이러한 컨트롤은 플로우 컨텐츠에의 위치설정을 지원 하는 SinglePageDocument 와 고정 컨텐츠에의 위치 설정을 지원 하는 DocumentViewer 입니다. 개발에서는 주석의 추가와 삭제를 몇 줄의 코드로 지원 할 수 있습니다. 기정에서는 공개된 스키마를 사용하여 XML 스트림에 보존됩니다. 개발자가 추가 코드를 작성하고, 커스텀 스토어를 구현할 수도 있습니다. 예를 들어 분리한 스토어에 주석을 보존하거나 주석을 공유하기 위해 Web 서비스를 사용하여 리모트 서버에 보존할 수 있습니다.

Windows Presentation Foundation에서는 강조 표시와 메모의 두 개의 주석이 지원됩니다. 강조 표시는 종이에 형광 펜으로 표시를 하는 작업과 같이 컨텐츠의 일정한 범위를 선택해 다른 색을 설정합니다. 한편 메모는 컨텐츠에 잉크나 텍스트 컨텐츠를 추가하여, 코멘트 추가 등을 실시할 수 있습니다. 메모에는 스타일을 설정할 수 있습니다. 예를 들어 사용자가 주석을 설정할 경우에, 메모의 배경색을 바꿀 수 있습니다.

스타일과 데이터 바인딩

응용 프로그램의 스타일은, 리소스, 스타일, 템플릿, 방아쇠, 스토리 보드를 통합하는 넓은 개념의 용어입니다. 스타일은 응용 프로그램의 요소에 대해 외관과 상호작용 형식의 동작을 일원적으로 정의합니다.

Windows Presentation Foundation는 응용 프로그램의 외관과 조작감을 결정하는 강력한 기능을 갖추고 있어 용이하게 complex system를 배제할 수 있습니다. 뛰어난 응용 프로그램 설계란, 작성하는 응용 프로그램과 대상의 사용자에 적절한 설계이며, 미적 센스와 높은 활용도, 몇 백 회 사용해도 싫증나지 않는 설계입니다.

스타일

스타일에 의해서 모든 컨텐츠의 외관과 조작감이 정해집니다. 스타일에는 이름을 붙이고, 그 이름에 의해서 사용할 수 있는 것도 있으면, 특정의 컨트롤 타입으로 사용되는 것이나 (Button), 그 양쪽 모두의 성질을 가지는 것도 있습니다. 스타일은 다른 스타일을 기본으로 작성할 수도 있습니다. 이하에 버튼 스타일을 작성하는 간단한 예를 나타냅니다.

<StackPanel xmlns="http://schemas.microsoft.com/winfx/avalon/2005" xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005"
   Margin="15" LayoutTransform="scale 2" >
   <StackPanel.Resources>
      <Style x:Key="MyStyle" TargetType="{x:Type TextBox}">
         <Setter Property="Background" Value="Green" />
         <Setter Property="Foreground" Value="White" />
      </Style>
   </StackPanel.Resources>

   <TextBox Style="{StaticResource MyStyle}">TextBox 1</TextBox>
   <TextBox Style="{StaticResource MyStyle}">TextBox 2</TextBox>
   <TextBox>Unstyled</TextBox>
</StackPanel> 

이 코드에서는 TextBox 컨트롤을 대상으로 하는 단일의 이름 스타일이 들어간 리스소 사전를 지정하고 있습니다. 스타일내에는 전경과 배경의 두 개의 속성을 설정해 있습니다. 이것을 이용하려면 텍스트 박스를 설정하고, 리소스 사전에 있는 스타일을 사용할 뿐입니다. 3 번째의 텍스트 박스는 이름 스타일을 참조하지 않았기 때문에, 디폴트 스타일로 지정됩니다.

템플릿

템플릿은 컨트롤 또는 데이터 형의 비주얼 구조를 기술하는 것에 의해서 스타일을 확장합니다. 이렇게 하여 Windows Presentation Foundation 가 가지는 다양한 표시 기능이 실현됩니다. 템플릿에서는 합성을 통해 오브젝트의 비주얼 트리를 기술할 수 있습니다. 이하의 예는 디폴트의 버튼 스타일을 스타일 첨부의 타원으로 변경하고 있습니다.

<StackPanel xmlns="http://schemas.microsoft.com/winfx/avalon/2005" 
xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005">
   <StackPanel.Resources>
      <Style x:Key="MyStyle" TargetType="{x:Type Button}">
         <Setter Property="Background" Value="SkyBlue" />
         <Setter Property="Foreground" Value="White" />
         <Setter Property="Cursor" Value="Hand" />
         <Setter Property="Template">
            <Setter.Value>
               <ControlTemplate TargetType="{x:Type Button}">
                  <Grid>
                     <Ellipse Name="rect" 
                        Fill="{TemplateBinding Property=Background}" />

                     <ContentPresenter Margin="20,0,20,0"
Name="content" TextElement.Foreground="{TemplateBinding Property=Foreground}" 
TextElement.FontSize="{TemplateBinding Property=FontSize}"
                                             VerticalAlignment="{TemplateBinding Property=VerticalContentAlignment}" 
                                          
   HorizontalAlignment="{TemplateBinding Property=HorizontalContentAlignment}" />
                  </Grid>
                  <ControlTemplate.Triggers>
                     <Trigger Property="IsMouseOver" Value="true">
                        <Setter TargetName="rect" 
Property="Fill" Value="LightBlue" />
                        <Setter TargetName="content" 
Property="TextElement.Foreground" Value="Black" />
                     </Trigger>
                  </ControlTemplate.Triggers>
               </ControlTemplate>
            </Setter.Value>
         </Setter>
      </Style>
   </StackPanel.Resources>
   <Button Height="200" Width="400" FontSize="24pt" Style="{StaticResource 
MyStyle}">Click here</Button>
</StackPanel>

이 예에서는 ContentTemplate 안의 ContentPresenter 에 오브젝트의 실제 컨텐츠가 들어가 있는 것을 알 수 있습니다. 또 타원내의 속성 일부를 바인딩하여, 개발자가 값을 버튼으로 설정하면, 그 기본으로 되는 적절한 요소가 변경됩니다.

방아쇠와 스토리 보드

방아쇠와 스타일, 템플릿을 병용 하면, 사용자와 응용 프로그램의 사이로, 다채롭고 동적인 상호작용이 가능하게 됩니다. 방아쇠는 지정한 조건이 true가 되면 기동됩니다 (위의 예는 버튼 위에 마우스 포인터 가져가면 방아쇠가 기동합니다). 다음의 예는 요소에 포커스가 옮기면 배경색이 변화합니다.

<Trigger Property="IsFocused" Value="true">
   <Setter Property="Background" Value="Purple" />
</Trigger>

셋타프로파티내에서 TargetName="ContentBorder" 를 사용하고, 오브젝트의 특정의 서브 요소 (예를 들어, ListBox 내의 요소)를 대상으로 할 수 있습니다.

이벤트 방아쇠를 사용하면, 애니메이션을 실행하기 위한 스토리 보드를 지원 할 수 있습니다. To 와 From 의 양쪽 모두의 속성을 설정하지 않는 경우, 이 이벤트가 다른 설정 이벤트를 오버라이드(override) 해도 문제 없이 동작합니다.

<EventTrigger RoutedEvent="Mouse.MouseEnter">
   <EventTrigger.Actions>
      <BeginStoryboard>
         <Storyboard TargetProperty="MaxWidth">
            <DoubleAnimation Duration="0:0:1" To="150" />
         </Storyboard>
      </BeginStoryboard>
   </EventTrigger.Actions>
</EventTrigger>

데이터 바인딩

응용 프로그램은 어떤 것에서도, 어떠한 폼을 사용합니다. Windows Presentation Foundation는 데이터를 응용 프로그램에 바인드 하거나 응용 프로그램에서 데이터를 조작할 수 있도록 풍부한 데이터 서비스세트를 제공하고 있습니다.

대부분의 시스템에서는 사용자 인터페이스와 데이터가 논리 구조면에서 분리되어 있습니다. 데이터 바인딩은 이들 두개의 엔티티를 연결시킵니다. 그러나 현재 많은 플랫폼에서의 데이터 바인딩에는 기능이 블랙 박스화되는 복수의 데이터 모델 (XML, 관계형, 오브젝트)을 완전하게 지원 하지 않아 확장 곤란 등의 문제가 있습니다. 그 결과 많은 개발자가 플랫폼에 의한 데이터 지원을 무시하고, 독자적인 데이터 메커니즘을 작성합니다.

Windows Presentation Foundation 에서는, 최초부터 데이터가 가장 중요한 구성요소이며, 속성 엔진으로 데이터를 지원 할 뿐만 아니라, XAML에서 선언된 데이터를 지원 합니다. Windows Presentation Foundation에서는 1 회 한정 (서버 갱신무시), 일방향 (독해 전용), 쌍방향 (읽고 쓰기 가능)의 3 종류의 데이터 바인딩을 지원 하고 있습니다.

기본적인 데이터 바인딩

우선 필요한 것은 데이터 공급자를 작성하는 것입니다. 데이터 공급자는 XML, 관계형, 오브젝트의 각 데이터 소스에 접속하기 위해서 사용합니다. DataSourceProvider 추상 클래스에서 파생하고, 독자적인 공급자를 작성할 수도 있습니다.

아래의 예는 인 라인 XML 데이터를 사용하여 공급자를 작성합니다.

<XmlDataProvider x:Key="nodePrototype" XPath="AuctionItem">
<AuctionItem Description="AuctionItem" StartPrice="3.50">
</XmlDataProvider>

다음은 단순하게 바인드 합니다.

<TextBox>
   <TextBox.Text>
      <Binding XPath="@Description" Source="{StaticResource nodePrototype}" />
   </TextBox.Text>
</TextBox>

부모컨테이너에 복수의 바인딩이 보관 되어 있는 경우 DataContext 를 소스로 설정해 두면, 바인딩마다 소스를 설정할 필요가 없어집니다. 마지막으로 마크 업 확장 바로 가기를 사용하고, 오브젝트 안에「Value="{Binding XPath=@StartPrice}"」라고 기술합니다.

컨텐츠 목록 표시 이용

많은 경우, 개별의 항목에 바인드 하는 것 만으로는 불충분합니다. 일반적으로는 오브젝트의 콜렉션에 바인드 하고, 정리해하여 표시하는 방법이 이용되고 있습니다. Windows Presentation Foundation에서는 이 정보를 표시하기 위한 독자적인 뷰를 생성할 수 있는 ItemsControl 가 준비되어 있습니다. 예를 들어, 이하와 같은 데이터 소스가 존재한다고 합니다.

<AuctionItems>
   <Item Title="Slightly unwashed, tatty teddy bear" />
   <Item Title="Threadbare pair of socks" />
   <Item Title="A used tea towel" />
   <Item Title="Packet of cereal, mostly uneaten" />
   <Item Title="A dead stick insect" />
</AuctionItems>

이하의 코드를 사용하여 바인드 합니다.

<StackPanel xmlns="http://schemas.microsoft.com/winfx/avalon/2005" xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005">
   <StackPanel.Resources>
      <XmlDataProvider x:Key="myItems" Source="c:\mydata.xml" XPath="/AuctionItems" />
   </StackPanel.Resources>
<Border>
   <ItemsControl ItemsSource="{Binding Source={StaticResource myItems}, XPath=/AuctionItems/Item}"
      DisplayMemberPath="@Title" >
   </ItemsControl>
</Border>
</StackPanel>

ItemsControl 가 기본으로 되는 데이터의 변경을 취득해, 뷰를 직접 갱신합니다. 각 항목에 대하고 이것이 반복해져 각 항목에 대해서 ContentControl 가 생성됩니다. ContentControl를 사용하고, 개개의 데이터를 자유롭게 표시할 수 있습니다. 이 예에서는 기정의 표시 방법을 사용하고 라벨과 함께 @Title XPath 쿼리에 바인드 된 값을 표시합니다.

데이터의 프레젠테이션

Windows Presentation Foundation에서는 개발자가, 바인딩 자체에서 데이터를 추출할 경우에, 그 데이터의표시 방법을 선택할 수 있습니다. 데이터 항목의 표시 방법은 데이터 템플릿에 의해서 제어합니다. 데이터 템플릿에서 데이터형을 정의하면, 이 데이터의 모든 인스턴스가 지정한 방법으로 표시됩니다.

Windows Presentation Foundation를 사용하고, XAML 에 의한 RSS 브라우저를 작성합니다.

<DockPanel xmlns="http://schemas.microsoft.com/winfx/avalon/2005" 
xmlns:x="http://schemas.microsoft.com/winfx/xaml/2005" Margin="10">
   <DockPanel.Resources>
      <XmlDataProvider x:Key="Blog" Source="http://blogs.msdn.com/tims/rss.aspx" />

      <DataTemplate x:Key="TitleTemplate">
         <TextBlock Text="{Binding XPath=title}"/>
      </DataTemplate>
   </DockPanel.Resources>

   <Label Content="{Binding Source={StaticResource Blog}, XPath=/rss/channel/title}" 
FontSize="24" FontWeight="Bold" DockPanel.Dock="Top" />      
   
   <Label Content="{Binding Source={StaticResource Blog}, XPath=/rss/channel/description}" FontSize="18" DockPanel.Dock="Top" />

   <DockPanel DataContext="{Binding Source={StaticResource Blog}, XPath=/rss/channel/item}" >
      <ListBox DockPanel.Dock="Left" ItemsSource="{Binding}" ItemTemplate="{StaticResource TitleTemplate}" IsSynchronizedWithCurrentItem="True" />
      <Frame Source="{Binding XPath=link}" Width="Auto" />
   </DockPanel>
</DockPanel>

데이터 템플릿을 사용하고, 리스트 박스내의 항목의표시 방법을 정의합니다. 이 예에서는 TextBlock를 사용하여 데이터에 바인드 된 항목을 표시합니다만, 그래픽스나 미디어, 하이퍼 링크 그 외의 컨텐츠 타입을 표시하듯이 간단하게 확장할 수 있습니다. 상세히 표시하기 위해서, IE 의 호스트로서 Frame 컨트롤을 사용합니다.

물론 모든 기능을 가진 RSS 브라우저 구축에는 한층 더 많은 작업이 필요합니다. 항목의 캐시, 미독/기독 상태, 복수의 피드, 보기 쉬운 스타일, 그 외 많은 요소가 필요하게 됩니다. 그러나 데이터 바인딩만을 사용하고, 여기에 표시된 기본적인 피드 리더를 작성할 수 있다는 것만으로도 XAML 의 능력을 충분히 증명하고 있습니다.

데이터의 프레젠테이션의 정리

데이터의 필터링, 그룹화, 늘어놓아 바꾸어는, 개발자가 요구하는 기능입니다. Windows Presentation Foundation 에서는 이러한 기능이 CollectionView 오브젝트에 의해서 지원 되고 있습니다. 이것에 의해, 같은 콜렉션을 동시에 다른 뷰로 표시할 수 있습니다. 이 기능은 IEnumerable 를 지원 하는 데이터 폼이라면, 어느 것으로 대해도 이용할 수 있습니다. 또 ICollectionView 를 구현하면 독자적인 필터링, 그룹화의 알고리즘을 사용할 수 있습니다.

리소스 섹션에 이하의 어느 쪽에든 추가합니다.

<CollectionViewSource x:Key="SortByName" Source={StaticResource Blog}"
<CollectionViewSource.Sort>
<scm:SortDescription PropertyName="@title" Direction="Ascending" />
</CollectionViewSource.Sort>
</CollectionViewSource>
 
<CollectionViewSource x:Key="GroupByDate" Source={StaticResource Blog}"
<CollectionViewSource.GroupBy>
<scm:PropertyGroupDescription PropertyName="@pubdate" StringComparison="OrdinalIgnoreCase" />
</CollectionViewSource.GroupBy>
</CollectionViewSource>

새로운 키명에 바인드 할 뿐입니다. 기본으로 되는 데이터 소스에 바인드 할 필요는 없습니다.

그룹화 하려면 그룹 헤더의 표시에 사용하는 그룹 스타일을 다음과 같이 지정할 필요가 있습니다.

<ItemsControl ItemsContainerStyle="" ItemsSource="{Binding Source={StaticResource myItems}">
   <ItemsControl.GroupStyle>
      <GroupStyle HeaderTemplate="{StaticResource groupingHeaderTemplate}" />
   </ItemsControl.GroupStyle>
</ItemsControl>

데이터의 프레젠테이션의 커스터마이즈

데이터를 리스트에 표시하지 않는 경우는 어떻게 하면 좋을까요? 예를 들어, 정보를 그래프에 표시하는 경우 등을 생각할 수 있습니다. Windows Presentation Foundation에서는 이러한 표시도 가능합니다. Windows Presentation Foundation 의 데이터 바인딩 지원에서는 모든 컨텐츠 컨트롤이 대상이 됩니다. 예를 들어, Button, Window, ToolTip, Label 은 모두 ContentControls 입니다. ListBox, ComboBox, TabControl는 모두 ItemsControl에서 파생합니다.

문서 서비스

Windows Presentation Foundation 자체뿐만이 아니라, Windows Vista 프레젠테이션 기술에는 문서와 인쇄 라이프 사이클을 처리하는 두가지의 새로운 사양이 포함되어 있습니다.

  • Open Packaging Conventions은 일련의 파일 형식의 패키징 사양 및 임의의 응용 프로그램으로 사용할 수 있는 관련의 서비스를 정하고 있습니다. Open Packaging Conventions 의 사양은 ZIP 파일에 근거하고 있어 거기에 따라서 파트/릴레이션 쉽의 추출과 ZIP 파일에 액세스하기 위한 서비스가 실현됩니다.
  • XML Paper Specification은 Open Packaging Conventions 의 사양에 근거하는 고정의 페이지 문서에 대해서, 마크 업과 렌더링의 룰을 정하고 있습니다. XML Paper Specification 안에는XPS Document 이라는 특정 고정 형식의 구현도 포함되어 있습니다.

Open Packaging Conventions

Open Packaging Conventions 를 사용하는 경우는 다음의 3 개의 주된 시나리오가 상정됩니다.

  • 커스텀 파일 형식의 구축
  • XPS 문서와 Office 12 컨텐츠에의 직접 액세스
  • XPS 문서, Office 12, 또는 커스텀 파일의 문서 해상도의 지정

Open Packaging Conventions 는 사용자 독자적인 파일 형식에 대해서 사용할 수 있습니다. 그 경우 준비되어 있는 공통 서비스를 이용할 수 있습니다.

패키징 모델은 파일 형식의 기반을 제공합니다. 이것은 Open Packaging Convention Specification (현재, v0.75)에 정해져 있습니다. 패키지는 모든 응용 프로그램으로 이용 가능합니다. 또 복수 구현이 현재 개발중입니다. 그 중에서도 Office 12 는 새로운docx,.xlsx,.pptx 형식에 이 사양을 사용합니다. 이 파일의 내용에 액세스 하려면, 패키징 서비스 (파트와 릴레이션 쉽)를 사용하거나 표준의 ZIP 유틸리티를 사용합니다.

파일 rels.relx 는 일련의 파일의 마스터 인덱스로, 메타데이터프로파티, 문서 본체등이 들어가 있는 다른 XML 파일에의 링크가 포함되어 있습니다.

Open Packaging Convention API 는 System.IO.Packaging 네임 스페이스 (WindowsBase 어셈블리내)에 있습니다. 여기에서는 Package, PackagePart, PackagePartCollection 등의 클래스에 액세스 할 수 있습니다. API 는 다음에 나타나듯이 패키지의 오픈과 클로우즈, 파트와 릴레이션 쉽의 작성과 삭제, 파트의 이름이나 컨텐츠 타입 및 스트림의 취득, 파트 스트림의 읽고 쓰기 및 릴레이션 쉽의 ID 나 타입 및 URI 의 취득이 가능합니다.

const string relType = "http://schemas.microsoft.com/xps/2005/06/fixedrepresentation";

Package p = Package.Open("c:\\package.container", FileMode.Open);            
PackageRelationshipCollection packRels = p.GetRelationshipsByType(relType);

foreach (PackageRelationship pr in packRels)
{
   Console.WriteLine(pr.RelationshipType);
   PackagePart part = p.GetPart(
      PackUriHelper.ResolvePartUri(new Uri("/", UriKind.Relative), pr.TargetUri));
   Console.WriteLine(part.ContentType + part.CompressionOption);
   // do something with part.GetStream() here.
}

패키징 된 컨텐츠의 헤더에는 세가지의 주된 서비스를 이용할 수 있습니다. 이것들을 사용하여 문서의 인증과 컨텐츠라고 하는 공통의 개념을 공유할 수 있습니다. 세가지의 주된 서비스는 다음과 같습니다.

  •  중요한 속성의 공통 메타데이터: 이하와 같은 속성의 공통 세트가 있습니다.
    • 카테고리
    • 컨텐츠의 상태
    • 컨텐츠 타입
    • 작성자
    • 작성일
    • 최종 변경일
    • 설명
    • 키워드
    • 최종 변경자
    • 타이틀
  • 디지털 서명은 서명한 컨텐츠가 수정되지 있지 않은 것을 검증하기 위한 방법입니다. 부정이 있었을 경우는 최종 사용자는 컨텐츠를 거부할 수 있습니다. 이것은 모든 Open Packaging Convention 형식에서 이용 가능합니다. 증명서는 XML 디지털 서명과 호환성이 있어 X.509 표준에 따릅니다. 서명 대상의 파트는 서명 정책에 의해서 결정됩니다. 예를 들어, XPS Document Viewer 정책에서는 정의된 모든 파트와 릴레이션 쉽에 서명됩니다. 증명서는 그 파트내에 보존하는 일도 증명서의 권리내에 포함되는 서명 파트에 포함할 수 있습니다. PackageDigitalSignatureManager 클래스를 사용하여 서명합니다. PackageDigitalSignatureManager 클래스는 서명 자체를 나타내며 서명의 검증에도 사용할 수 있습니다.
  • 권리 관리 Open Packaging Conventions 에서는 특정의 권리 관리 솔루션의 사용은 필수가 아닙니다. 다만 기정의 솔루션이 준비되어 있습니다. 이 솔루션은 Windows Vista를 대상으로 한 모든 코드로 사용할 수 있습니다. 이 기정의 솔루션은 Windows Rights Management Services로 불립니다. 이 API 는 System.Security.RightsManagement 를 사용하여 패키지를 구현하는 데이터 파일에의 권리 관리 컨트롤을 적용할 수 있습니다.

XML Paper Specification

XPS Document 형식은 커스텀 파일 형식의 일례로서 파악할 수 있습니다. XPS 문서에는 이하와 같은 파트가 포함되어 있습니다.

  • FixedDocumentSequence (루트)
  • FixedDocument (문서 마크 업)
  • FixedPage (페이지 마크 업)
  • Font (매입 폰트)
  • Image (매입 이미지)
  • Thumbnail (페이지 엄지손가락 이미지)
  • PrintTicket (프린터 설정)

XPS Document 내에 문서 솔루션의 패키지 API 에 옮겨지는 특정 API 가 있습니다. 이것들은 XpsDocument, IDocumentSequenceReader, IFixedDocumentReader 등입니다. 이러한 API 를 사용하면, 문서의 조작, 파트의 추가와 삭제, 중요한 속성의 취득과 설정을 실시할 수 있습니다. 이러한 API 는 기본 파트 API 보다 사용하기 쉽게 되어 있습니다.

XPS Documents 는 마크 업의 호환성을 이용해 확장이 가능합니다. 이것은, XAML 의 마크 업의 호환성과 같이, Ignorable, ProcessContent, AlternateContent, 및 MustUnderstand 를 설정할 수 있습니다.

응용 프로그램 모델

Windows Presentation Foundation 는 응용 프로그램 안의 논리 플로우를 관리하기 위한 원시적을 제공합니다. 기존의 응용 프로그램 프레임워크는, 그 대부분이 어떠한 형태로 제약되고 있습니다. 예를 들어, MFC 는, 응용 프로그램이 MFC 의 구조에 적절하고 있는 한, 응용 프로그램 구축이 뛰어난 프레임워크입니다. 그러나 그 한계를 넘어MFC 자체가 장해가 되는 경우도 적지 않습니다. 경우에 따라서 일반적인 사용자 경험(experience) 모델을 위한 인프라가 결핍되어 있기도 합니다 (예를 들어, Web 브라우저에 의해서 입력되는 네비게이션 모델). 응용 프로그램 레벨이 뛰어난 관리 기능을 가지는 플랫폼은 별로 존재하지 않습니다 (예를 들어, Win 32 에서는, 다른 윈도우에의 메시지의 포스트가 필요하게 되는 것이 적지는 않습니다. Web 모델에서는 문제를 개선하는 AJAX 등의 기술이 사용되어 있지 않기 때문에 포스트백 지연이 큰 문제가 됩니다).

대부분의 응용 프로그램은, 이하의 서비스를 필요로 합니다.

  • 응용 프로그램 전체의 스테이트 정보 (응용 프로그램의 유효기간 전체에 걸치는 변수의 추적)
  • OS 와의 상호작용 (응용 프로그램의 슛다운 등)
  • 윈도우와 리소스의 관리
  • 파일과 사용자 데이터의 보존
  • 사용자 인터페이스 모델
  • 호스트와 배포

Windows Presentation Foundation 응용 프로그램 모델이 중시하는 영역을 나타내고 있습니다.

일반적인 응용 프로그램 서비스

Windows Presentation Foundation 는 데이터 관리, 시스템 interaction 및 UI 모델을 위한 일련의 오프트인 서비스를 제공하고 있습니다. 또, 대부분의 응용 프로그램이 필요로 하는 공통 서비스 (예를 들어, 리소스 서비스)도 준비되어 있어 Windows Presentation Foundation로 추상화 할 수 있습니다. 가장 중요한 것은 기본 응용 프로그램의 작성을 단순화 할 필요가 있는 것입니다 (응용 프로그램 프레임워크가 생길 때까지, 표준의 Windows 의 "hello world" 응용 프로그램을 작성하는데, 수백 행의 코드가 필요했던 일을 기억하실 것입니다..

모든 응용 프로그램의 기본 클래스는 요소입니다. 응용 프로그램의 라이프 타임 (OnStartup, OnExit)와 리소스 관리가 추상화 되어 세션 데이터 (ASP.NET 가 제공하는 세션 데이터에 가까운 데이터)를 보존하기 위한 속성 가방이 제공됩니다. 또 Application 의 서브 클래스를 작성하고, 기능을 확장할 수도 있습니다. Application 클래스는, Win32 가 많은 WM_ 메시지를 관리 대상이 되는 이벤트에 대해 추상화 합니다 (예를 들어, 응용 프로그램의 액티브화 또는 비액티브화).

어셈블리에 파묻히고 있는 경우 <Image Source="Mushroom.jpg" />
응용 프로그램 디렉터리에 로컬에 보존되어 있는 경우 <Image Source="Mushroom.jpg" />
응용 프로그램의 서버에 보존되어 있는 경우 <Image Source="pack://siteoforigin:,,,/Images/Quiche.jpg" />
다른 어셈블리내에 파묻히고 있는 경우 <Image Source="Food;Component/Egg.jpg" />

(위의 3 번째의 방법 siteoforigin는 서버명의 플레이스 홀더가 아닌 고정의 키워드를 나타냅니다)

첫 번째의 편리한 서비스는 응용 프로그램 스토리지입니다. 기존의 응용 프로그램의 데이터는 파일 시스템에 보존되는 경우가 많아, 그 옵션이 Windows Presentation Foundation 에도 남아 있습니다. 응용 프로그램은 격리된 스토리지 영역에 데이터를 보존할 수도 있습니다. 이 경우 쿼터 기본의 모델이 제공되어 부분 신뢰의 시나리오로 지원 됩니다. 이것은 IsolatedDataFileStream 오브젝트를 사용합니다. 혹은 .config 파일이나 레지스트리(설정용), 경우에 따라서는 쿠키 (Web 기본 응용 프로그램 용무)를 사용할 수도 있습니다.

Windows Presentation Foundation가 제공하는 3 번째의 서비스에서는 싱글 문서 인터페이스 (SDI)와 네비게이션 기본의 인터페이스의 양쪽 모두를 포함한 복수의 사용자 경험(experience) 모델을 지원 합니다. 다이얼로그 기본의 SDI 모델에서는 윈도우나 다이얼로그, 컨트롤이 사용되어 기능은 메뉴에 의해서 사용자에 제시됩니다. 네비게이션 기본의 응용 프로그램은 Page, Hyperlink, NavigationWindow 등의 Windows Presentation Foundation 클래스를 사용하고, Web 은유에 밀접하게 합치하는 모델을 제공합니다. Windows Presentation Foundation 에서는 응용 프로그램이 하나의 모델만을 사용하도록 할 수 없습니다. 응용 프로그램으로 모델을 하나만 사용하는 것은Windows 를 기반으로 위저드나 그 외의 "순서를 나타내는" 태스크에 페이지 기본의 모델을 사용하는 응용 프로그램에서는 일반적인 일입니다. Windows Presentation Framework 는 MDI (멀티 문서 인터페이스)를 네이티브에 지원 하고 있지 않습니다. 설계자에게는 탭 모델인가 (Visual Studio 에 의한다), 멀티 윈도우 모델 (Microsoft Word 에 의한다)의 사용을 추천 합니다.

Web 기본의 응용 프로그램

Windows Presentation Foundation의 대상은 Windows 기본의 응용 프로그램 만이 아니고, 브라우저 기본의 응용 프로그램도 지원 합니다. Web 브라우저 응용 프로그램 (XBAP)은, 보안 샌드 박스에서 실행되고 있습니다.특권이 설정된 서비스를 호출할 수 없기 때문에, 보안이나 설치 prompt는 불필요합니다.또, 종래의 의미로의 설치 하행 깨지지 않기 때문에, [시작] 메뉴에 표시되는 일도 Program Files 디렉터리에 파일이 작성되기도 없습니다.이 응용 프로그램은 ClickOnce 에 의해서 배포 됩니다. XBAP 는 온라인만의 응용 프로그램이므로 "단속적으로 접속되는" 시나리오에는 적합하지 않습니다.

브라우저에 의해서 호스트 되는 응용 프로그램과 독립 실행형의 응용 프로그램 양쪽 모두에 단일 플랫폼을 사용하는 이점의 하나는 양쪽 모두의 프로그래밍 모델이 같다는 점입니다. 예를 들어 Outlook 에서는 풍부한 기능을 가지는 클라이언트 응용 프로그램과 Web 응용 프로그램 (Outlook Web Access)용으로 완전하게 별개의 코드 기본이 존재합니다만, 그것과 비교하여 이 모델은 Web 와 씬 클라이언트 접근를 지원 하는 응용 프로그램에 있어서 분명하게 이점이 있습니다.

XBAP 는 어떻게 작성하는 할까요? Visual Studio 2005에 부속의 템플릿을 사용하는지, 단순하게 아래의 세가지 속성을 프로젝트 파일로 설정합니다.

<HostInBrowser>True</HostInBrowser>
<Install>False</Install>
<TargetZone>Internet</TargetZone>

기존의 응용 프로그램을 변환하는 경우는 조건식에 의한 체크 (#if (XBAP)...#else...#endif)하여 액세스 허가 레벨의 실행시 체크를 사용하고, 샌드 박스에 적합하지 않는 코드를 삭제할 필요도 있습니다.

고성능 응용 프로그램 작성

Windows Presentation Foundation는 풍부한 기능을 탑재한 응용 프로그램을 작성하기 위한 강력한 기능을 갖추고 있습니다만, 동시에, 대상의 컴퓨터의 특성의 차이를 고려해 응용 프로그램을 설계하지 않으면, 성능 상의 문제가 생길 가능성이 있습니다.

Windows Presentation Foundation는 하드웨어 렌더링을 적절히 이용합니다. Direct3D를 사용하고 DirectX 7 이상으로 고속화된 렌더링을 실시해, DirectX 9 또는 Pixel Shader 2.0 그래픽 카드로는 그 이상의 최적화가 실현됩니다 .이러한 기능을 가지지 않는 컴퓨터에서는 CPU 기본의 SSE 및 SSE2에 의해서 최적화된 래스터라이저를 사용하고, 소프트웨어 렌더링을 합니다. 소프트웨어 렌더링은 Windows Presentation Foundation 로 하드웨어 파이프라인에 의한 렌더링을 할 수 없는 경우에도 사용되어 컴퓨터의 하드웨어 구성에 관련되지 않고, 항상 렌더링 출력이 보증됩니다.

이 결과 Windows Presentation Foundation 에는 하드웨어와 소프트웨어의 양쪽 모두의 파이프라인으로, 각각이 다른 퍼포먼스 특성을 가지게 됩니다. 즉 두 개의 코드 패스가 있어, 성능 예측이 곤란합니다. Windows Presentation Foundation 는 단순한 실행시 하드웨어 검색을 지원 하여, 리소스 사전을 사용하고, 응용 프로그램을 플랫폼에 맞추어 조정할 수 있습니다.

다음의 드를 사용합니다. 

// tier will be 0, 1 or 2 where 2 is full hardware and 0 is software
int wpfTier = System.Windows.Media.RenderCapability.Tier >> 16;
 
// in this example, simply switch between software and hardware rendering
if (wpfTier == 0)
Resources.MergedDictionaries.Add(softwareRenderingDictionary);
else
Resources.MergedDictionaries.Add(hardwareRenderingDictionary);

Tier 의 상위 비트에는 Tier 번호에 가세해 트랩 가능한 TierChanged 이벤트가 포함되어 있습니다 (예를 들어, 하위의 전원 관리 모드에의 폴 백). 0x20000 는 고급 지향 하드웨어의 지원, 0x10000 는 기본 하드웨어 렌더링, 0x00000 는 소프트웨어 렌더링입니다. Tier 2 개발 머신에서는 컨트롤 패널의 Display Properties 애플릿의 [Troubleshooting] 탭을 사용하고, 하위층으로 전환할 수 있습니다.

Tier 를 분별하는 것은 간단합니다만 적절한 컨텐츠를 제작 하는 것은 곤란합니다. 정적 2D 컨텐츠와 단순한 2D 애니메이션에는 Tier 0 머신을 사용합니다. Tier 1 머신이나 복수의 애니메이션, 불투명도의 설정, 큰 전부 칠해 영역에 사용할 수 있습니다. Tier 2 는 복잡한 3D 컨텐츠나 방사선장의 그라데이션에 최적입니다.

성능 문제 디버그

소프트웨어 렌더링은 응용 프로그램이 Tier 2 하드웨어로 동작하고 있는 경우에 임의의 조작에 사용되는 것에 주의해 주세요. 예를 들어 TileMode=Tile 와 설정하면, 요소가 소프트웨어 래스터라이저 경유로 렌더링 됩니다.

Perforator 는 SDK 의 새로운 툴로 실행중의 Windows Presentation Foundation 응용 프로그램에 접속해 성능을 측정합니다. 또, Windows Presentation Foundation 의 렌더링을 리얼타임으로 변경하고, 성능 상의 문제를 진단할 수도 있습니다. Perforator를 사용하면, 실행중의 Windows Presentation Foundation 프로세스에 접속하고, 소프트웨어 렌더링에 폴 백한 모든 요소를 특정의 색으로 표시할 수 있습니다.

다른 하나의 툴은 ETW 입니다. tracelog, racerpt, mofcomp 등의 툴은 ETW 이벤트의 기록과 처리가 가능합니다. 문서에는 지원 하는 이벤트가 표시됩니다.

또 종래의 프로 파일링을 실행하고, 응용 프로그램의 보틀 넥을 특정할 수 있습니다. Visual Studio 2005 에 부속의 Enterprise Profiler Tool 에는 샘플링 모드와 실행 모드가 있습니다.

게다가 CLRProfiler (마이크로소프트의 Web 사이트에서 제공되는 기존의 툴)를 사용하고, 관리 대상의 heap 할당의 문제와 거기에 따르는 성능 비용을 조사할 수 있습니다.

성능 향상 팁

가상화는 대량의 데이터 처리가 필요한 응용 프로그램의 성능을 높이는 적절한 방법입니다. Windows Presentation Foundation 에서는 VirtualizingStackPanel 컨트롤에 의해서 UI 의 가상화가 가능합니다. 항목수가 많은 경우, StackPanel 의 70 배도 고속으로 StackPanel 와 같은 동작도 가능합니다. 모든 오브젝트를 항상 트리에 놓아둘 필요가 없기 때문에, 최적인 효과를 얻을 수 있습니다.

XAML 리소스와 코덱 리소스 사전을 사용하고, 공통 리소스를 재사용할 수 있습니다. 이것은 몇 번이나 재사용되는 컨트롤의 경우, 특히 중요합니다. 또, 고정 가능한 오브젝트 (브러쉬 또는 펜등)는 변경할 필요가 없는 경우에는 일정한 상태로 사용할 수 있습니다. 이렇게 하면 리소스의 사이즈가 축소되어 (변경된 이벤트 처리기를 Windows Presentation Foundation 로 추적할 필요가 없도록), 성능이 향상합니다.

상호 운용성 및 이행

Windows Presentation Foundation를 알고 있는 개발자는, 기존의 응용 프로그램에 대한 영향의 가능성을 염려합니다. 다음과 같은 의문을 있을 것이라고 생각됩니다. 모든 것을 제로에서 작성 다시 할 필요가 있는지, 더 간단한 방법이 있는지. 플러그 인이나 컨트롤은 어떻게 하는 것인지. 그것들도 다시 작성할 필요가 있는 것인지 등등

Windows Presentation Foundation 는 뛰어난 상호 운용성을 갖추고 있습니다. Windows Presentation Foundation 를 기존의 코드 안에서 사용하는 일도 기존의 코드를 Windows Presentation Foundation 안에서 사용할 수도 있습니다. 다만 풍부한 기능을 충분히 활용하려면 Windows Presentation Foundation 만으로 구성된 경험(experience)를 사용하는 것을 추천 합니다. 데이터 바인딩이나 애니메이션, 모든 요소를 대상으로 한 레이아웃 서비스 등, 공존 환경에서는 실현될 수 없는 이점을 이용할 수 있기 때문입니다.

상공

컨텐츠의 일부를 다른 컨텐츠 위에서 렌더링 하는 것은, 경우에 따라서는 매우 곤란합니다. 예를 들어 알파 브랜드는 적절 상태가 되지 않는 경우가 많이 있습니다. 상공의 개념은,"기술에 의한 1 픽셀" 입니다. 상공은 사각일 필요는 없고, HREGIONS 가 지원 되지만, 모든 목적으로 대응하는 레이어드 윈드우 (WS_EX_LAYERED)는 지원 되지 않습니다.

여기에서는 응용 프로그램으로 Windows Presentation Foundation 의 이점을 활용하고, 모든 것을 다시 작성하지 않도록, 기능을 향상시키기 위한 아이디어를 소개합니다. 첫 번째 방법은 Windows Presentation Foundation를 사용하여 크롬 (메뉴, 툴 박스, 위저드, 헬프 시스템)의 외관을 새롭게 할 수 있습니다. 두 번째의 방법은 응용 프로그램 캔버스에 Windows Presentation Foundation를 사용할 수 있습니다. 세 번째 방법은 응용 프로그램이, HTML 등의 출력 형식을 생성하는 경우, XAML 의 지원을 추가해, 개발/설계 워크 스페이스에 통합하는 방법이 있습니다. 기존의 컨트롤을 Windows Presentation Foundation 로 랩 하면, 보다 광범위한 사용자를 이용할 수 있게 됩니다.

/clr 에의 이행

기존의 Win32 C++ 응용 프로그램을 Windows Presentation Foundation 로 이행하기 위한 최초의 순서는 코드를 Visual C++ 2005 로 이행해, 끝임없이 관리형 코드의 통합 기능을 이용하는 것입니다. Visual C++ 로 이행하는 것에 의해서, 보안 (/gs)이나 신뢰성의 점에서도 이점이 있습니다. 이 시점에서는 ISO 표준의 준거 사항이 엄격하여, 호환성에 영향을 주는 변경점이 라이브러리나 헤더에 생긴 결과, 아마 compile error가 발생합니다. 더하고, 보안의 문제나 64 비트에 대응하고 있지 않는 코드에 관해서 수많은 컴파일 경고가 발생할 가능성이 있습니다. 이 최초의 순서는 조금 번거롭지만, 적절한 결과를 얻을 수 있습니다.

/clr 를 추가하면 문제 없게 컴파일 할 수 있습니다만, /clr 를 사용하는 장소에 대해서는 주의가 필요합니다. /clr 는 필요한 원시 파일에서만 사용하는 것을 추천합니다. 불필요한 파일에까지 추가하면, 컴파일에 시간이 걸려, 필요 이상의 작업이 생깁니다. 예를 들어, C 의 파일은 C++ 로서 컴파일 할 필요가 있어, 거기에 따라 소스의 수많은 문제가 밝혀지는 일이 있습니다. 이것과는 별도로 포함되어 있는 헤더 파일의 어셈블리 코드에 관해서 문제가 생기는 일도 생각할 수 있습니다. 또, DllMain 에 관리형 코드가 존재하는 것에 따르는 문제도 있습니다. 자세한 내용은 Visual C++ 의 매뉴얼을 참조해 주세요.

/clr 스위치를 지정해 DLL 의 컴파일을 실시했을 때와 같이, 디버거 모드를mixed 로 설정해 주세요. 부정한 디버거가 선택되지 않은 것을 확인해 주세요. (Visual Studio는 실행 가능 형식에 근거해 체크하기 때문에)

Win32 응용 프로그램에의 Windows Presentation Foundation 포함

이것을 잘 기능시키려면, Windows Presentation Foundation 응용 프로그램 논리를 HWND 의 안쪽에 둡니다. HwndSource 를 작성하면, Windows Presentation Foundation 가 사이즈의 큰 HWND 와 같이 동작합니다.

HwndSource source = new Source.RootVisual();

최초로 컴파일시에 /clr 스윗치를 추가하고, CLR 의 지원을 추가할 필요가 있습니다. WinMain를 [System::STAThreadAttribute] 로 마크 합니다. PresenationCore.dll, PresentationFramework.dll, System.dll, UIAutomationTypes.dll 에 참조를 추가합니다. 여기서 관리형 코드의 네임 스페이스를 추가합니다.

namespace ManagedCode
{
   using namespace System;
   using namespace System::Windows;
   using namespace System::Windows::Interop;
   using namespace System::Windows::Media;
}

여기에서는 새로운 HwndSource 를 작성할 필요가 있습니다. 이것에는 이하의 코드를 사용합니다.

HwndSource^ source= gcnew HwndSource(...);
UIElement^ page = gcnew AvClock::Clock();
source->RootVisual = page;
return (HWND) source->Handle.ToPointer();

과제

위에서 소개한 순서를 실행하기 전에 다음의 과제에 대해 검토하는 것을 추천합니다.

  • Windows Presentation Foundation 의 네이티브인 응용 프로그램을 재작성하는 경우와 비교하여, 초기 비용이 적은 대신에 장기적인 비용이 듭니다. Win32 와 Windows Presentation Foundation 의 사이의 경계를 넘는 경우는 항상 상호 운용성의 문제에 대처할 필요가 있습니다.
  • 혼합 모드의 응용 프로그램에서는 부분 신뢰의 코드를 사용할 수 없기 때문에, Web 브라우저 응용 프로그램에 레가시 코드를 묻을 수 없습니다. 이 모델을 사용하는 경우는 네이티브의 Windows Presentation Foundation 응용 프로그램으로서 코드를 작성해 주세요.
  • XAML 와 C++ 를 같은 어셈블리 내에서 사용할 수 없습니다. 다른 어셈블리로 이것들을 사용하여, Win32 C++ 호스트에서 XAML를 로드하는 것은 가능합니다.
  • 경우에 따라서 WinFX 가 설치 된 머신과 Win32 만이 설치 된 머신의 양쪽 모두가 혼재하는 환경에서 응용 프로그램을 실행하는 일이 있습니다. 최신 릴리스에 들어있는 이하의 코드를 사용하고, WinFX 를 체크할 수 있습니다.
if (Registry.LocalMachine.OpenSubKey("SOFTWARE\\Microsoft\\WAP" != null)
 // WinFX Runtime Components are installed

정리

Windows Presentation Foundation는 응용 프로그램 개발자나 설계자에게 있어 새로운 강력한 툴입니다. 다음 버전 릴리스의 Windows 전략적 프레젠테이션 기반으로서 그래픽 하드웨어의 성능을 충분히 활용해, 독립 실행형 응용 프로그램에서, Web 브라우저 기본의 응용 프로그램이나 문서까지 모든 것을 지원 합니다. 풍부한 기능을 가진 실감에 넘친 응용 프로그램 사용자 경험를 요구하는 개발자나, Web 모델의 한계에 부딪쳐 있는 개발자에게, Windows Presentation Foundation 의 조기 도입은 특히 큰 이익이 될 것 입니다.

참조

Authoring Tools

Windows Presentation Foundation 블로그

  

Top of Page Top of Page


Microsoft