본문 바로가기

IT 살이/04. 기술 - 프로그래밍

11 WPF 리소스

이 포스트는 MSDN 메거진에 실린 아티클을 번역한 글의 일부이다.

지금까지 애플리케이션 어셈블리에 임베딩되는 페이지드에 대해서 이야기했다. 그러나 컨텐트는 다양한곳으로부터 로딩될 수 있다. 소스 코드가 있는 어셈블리에 같이 포함(embedding)되어 있을 수도 있지만 참조되는 어셈블리에 있을 수도 있고, 또는 어셈블리에 포함되어 있지 않은 다른 자유로운 파일(loose file)들로 되어 있을 수도 있다. 그런 자유로운 파일들은 로컬 디스크, 파일 공유 서버, 또는 웹 사이트에 있을 수 있다. 그리고 컨텐트가 어셈블리에 포함되어 있든 자유로운 파일로 존재하든간에 그것이 꼭 페이지(Page)일 필요는 없다. 컨텐트는 이미지, 비디오, 오디오 같은 다양한 미디어를 가질 수 있다. 그리고 컨텐트는 반드시 특별한 애플리케이션에 소속될 필요도 없다. 다른 웹 애플리케이션에 포함된 HTML 페이지도 컨텐트가 될 수 있는 것이다.

이런 유연함은 개발자가 실세계를 좀 더 쉽게 다룰 수 있도록 해준다. 때로는 컨텐트가 어떤 애플리케이션에서만 사용될 수도 있다. 그런 경우는 컨텐트를 애플리케이션 어셈블리에 바로 임베딩시켜서 배포하는 것이 합리적일 것이다. 그러나 때로 어떤 애플리케이션들은 규칙적으로 변경되는 컨텐트를 가질 수 있다. 그렇다고 계속해서 다시 빌드를 한 후 재배포를 한다는 것은 불합리하다. 또 어떤 경우는 여러 애플리케이션에서 컨텐트를 공유하는 경우도 있을 것이다. XBAP 애플리케이션은 필요없는 다른 어셈블리를 다운받지 않고도 이런 자유로운 컨텐트를 사용할 수 있다.

이런 유연성을 활성화시키기 위해서 WPF는 리소스를 고유하게 결정(identify)할 수 있는 새로운 메커니즘을 포함하고 있다. 컨텐트가 어디에 있는지 그것이 임베딩형인지 아니면 자유로운 형태인지는 상관없다. 이런 모든 경우를 대처할 수 있는 Pack URI 스킴을 구현하고 있다. 이것을 사용하면 애플리케이션의 자원에 고유한 URI를 부여할 수 있게 된다. WPF Pack URI 스킴을 사용해서 몇가지 다른 그러나 흔히 있을 수 있는 컨텐트 로딩에 대한 시나리오를 지원한다

이 문서의 샘플 코드에서 윈도우와 페이지를 결정하는데 Application.StartupUri 또는 Hyperlink.NavigateUri를 사용한다.

<!--App.xaml (markup)-->

<Application ...="" StartupUri="HomePage.xaml" />

이 예제의 URI값은 사실 Pack URI의 상대적 버전이다. 우리가 익숙한 방식대로 이렇게 간단한 형태로 쓸 수 있지만 이것의 절대 버전은 다음과 같은 형태를 취한다.

pack://application:,,,/HomePage.xaml

절대 Pack URI 3개의 주요 부분으로 구성된다: 스킴(pack://), authority ( application: ) 그리고 경로(,/HomePage.xaml). authority는 리소스를 가지고 있는 컨테이너의 타입을 말한다. 반면에 경로는 그 컨테이너에 상대적인 리소스 위치를 말한다. application:컨테이너는 사실은 어셈블리가 된다. 그리고 그 경로는 어셈블리의 루트에 대한 상대적인 리소스 위치이다.

Pack URI가 절대적이든 상대적이든 간에 그것이 가리키는 컨텐트는 어셈블리에 임베딩될 수도 있고 자유로운 XAML 파일로서 애플리케이션 실행파일로부터의 상대적인 위치에 있을 수도 있다. Whether an absolute or relative Pack URI is used, the content that it refers to can either be embedded within an assembly or exist as a loose XAML file that is stored in a location relative to the application executable. 애플리케이션 실행파일고 같은 폴더에 있는 자유로운 XAML 페이지의 경우 그 Pack URI는 다음과 같다.

pack://application:,,,/HomePage.xaml

흥미로운 것은 자유로운 XAML 파일에 대한 Pack URI는 같은 이름의 임베딩 파일의 Pack URI와 같은값을 갖는다. 이 두가지를 구분하기위해서 WPF는 먼저 임베딩된 리소스를 찾기 위해서 어셈블리 내부를 먼저 검색하고 다음으로 자유로운 리소스를 찾는 간단한 방법을 사용한다

Pack URI는 참조되는 어셈블리에 임베딩되어 있는 리소스에 접근하기 위해서도 사용될 수 있다. 그러나 그 모양은 약간 다르다.

pack://application:,,,/BoxApplicationLibrary;component/HomePage.xaml

이것의 상대 버전의 Pack URI는 다음과 같다.

/BoxApplicationLibrary;component/HomePage.xaml

Pack URI는 애플리케이션의 원래 사이트 즉 애플리케이션이 구동된 곳에서 리소스를 찾고 로딩하는데도 사용할 수 있다. 웹 서버로부터 구동된 XBAP 애플리케이션의 경우는 애플리케이션을 게시한 위치에 새로운 컨텐트를 복사해 넣는 것만으로도 애플리케이션의 컨텐트를 최신 상태로 유지시켜 줄 수 있다. 원래 사이트에 있는 리소스에 접근하기 위해서는 다른 형태의 Pack URI를 사용한다. 이때는 항상 절대적 버전만을 사용할 수 있다.

pack://siteoforigin:,,,/HomePage.xaml

임베딩 페이지든 아니면 자유로운 페이지든간에, 마치 HTML 페이지 네비게이션에서처럼 페이지의 부분으로 네비게이션할 수 있다. 페이지에는 다음처럼 XAML 요소에 Name이라는 어트리뷰트를 설정해서 이동할 부분을 정의한다.

<Page ...="" >

  <TextBlock Name="Paragraph1" TextWrapping="Wrap">

  ...

  </TextBlock>

</Page>

그리고 페이지의 정의된 이 부분으로 네비게이트하기 위해서는 페이지 URI"#XAMLElementName"형태의 값을 첨부하는 방식을 사용한다

HelpPage3.xaml#Paragraph1

'IT 살이 > 04. 기술 - 프로그래밍' 카테고리의 다른 글

12 PageFunction  (0) 2009.04.23
10 Frame  (0) 2009.04.23
09 XAML Browser Applications  (0) 2009.04.23