몇 개 안되는 MSDN 토픽 번역하느라 한달이 흘러갔네요.
이제 좀 더 쓸모있는 WPF 애플리케이션 작성에 대한 글을 써볼까! 하고 모처럼의 휴일에도 일찍 일어나서 PC앞에 앉았는데... VS2005+WPF익스텐션의 버그가 절 반갑게 맞이하네요.ㄱ-

우선 작성하려던 프로그램은 이렇습니다.
1. 비-시각형(Non-rectangular) 윈도 만들기 : http://gongdo.tistory.com/58#윈도 형태에서 비시각형 윈도 스타일 참고.
2. Path가 아닌 Image를 사용한 비-사각형 윈도 만들기
3. 이미지의 불투명한 부분만 윈도의 영역으로 취급되도록(클릭되도록) 처리
4. 이미지를 왼쪽 마우스 버튼으로 드래그 하여 윈도 옮기기
5. 이미지를 왼쪽 더블클릭하면 애플리케이션 종료.

있는 그림가지고 쓰면 재미가 없잖아요?
간만에 예술혼을 불태워 그림까지 직접 그렸죠.
그 그림은...

more..

중요한건 이게 아니고;
WPF에서는 위와 같은 요구 사항의 프로그램을 매~우 쉽게 작성할 수 있습니다.
원래는 이 주제로 포스팅을 했어야 하는데 쩜쩜쩜.

자세한 코드 설명은 생략하고 문제의 화면은 다음과 같습니다.


VS2005의 WPF 익스텐션에서 특정 XAML 키워드를 IDE의 XAML 디자인 뷰(코드명 Cider였죠?)에 표시할 수 없는 문제가 있습니다.

위의 상황에서는 Windows 엘리먼트의 AllowsTransparency 어트리뷰트를 사용하면 XAML 디자인 뷰에서 Whoops! 하고 울부짖으면서 표시를 못하고 에러를 뿜습니다.

하지만 이 상태에서도 XAML 문법이 틀린 것은 아니고 따라서 빌드 및 실행은 정상적으로 되는데요, 기껏 디자인 뷰가 있는데 볼 수 없다면 안타깝잖아요?
한번 문제의 AllowsTransparency 어트리뷰트를 지워봤습니다.


네, 예상대로 디자인 뷰에 정상적으로 표시되는군요.

한번 더 꼼수를 부려 이상태에서 다시 XAML 코드 뷰에 AllowsTransparency를 넣으면...


오우! 디자인뷰가 살아있네요?!
실행을 한번 해볼까요?

의도대로 불투명한 영역(그림이 있는 부분)을 마우스로 드래그 하여 옮길 수 있고 더블클릭하면 종료됩니다.

하.지.만. VS2005의 WPF 익스텐션에서 디자인 뷰는 디자인 뷰가 활성화 될 때 다시 렌더링 되는 것 같습니다. 그래서 디자인 뷰를 선택하면 도로 Whoops!를 보게되지요.
결국 버그는 버그. 방법이 없습니다.

전 이럴 때 버그를 해결하기 위해 구글 신에게 간절히 기도하곤 합니다.
문제의 에러 메시지로 기도했더니 아니나 다를까 이 문제로 고민하고 있는 사람들이 있었습니다.
http://forums.microsoft.com/MSDN/ShowPost.aspx?PostID=1371261&SiteID=1

답변은 조금 실망스럽게도, 2005 IDE에서는 아직 WPF를 개발하기엔 좋지 않으니까 Orcas를 써볼래? 정도네요.

뭐 이때까지만 해도 Orcas가 새로 나온 익스텐션인줄 알고 올타꾸나하곤 링크를 타고 들어갔는데요.
            ┘└
            ┐┌

┓━



차기 버전의 Visual Studio의 베타판을 말하는거였군요.
용량은 무려 4G를 훌쩍 넘기고... 후우...

선택의 여지가 없네요. 일단 설치. 설치에 관한건 http://gongdo.tistory.com/68 에서 간단히 리뷰했습니다.

아직 Orcas라고 해도 2005와 크게 달라진 부분은 없었고 2005에서 작성했던 프로젝트를 훌륭하게 컨버전할 수 있었습니다.
기대를 걸고 프로젝트를 열어봤더니...


Whoops!

...후우...MS 우리 이제 편하게 좀 살자 응?

이번엔 다른 어트리뷰트에서 인식 문제가 발생하네요.
물론 이 문제도 빌드가 잘 됩니다.
이전과는 좀 다른게 위에서 문제되는 어트리뷰트는 이미지의 소스 경로를 지정하는 부분인데요,
"pack://siteoforigin:,,,/res/만년삼.gif"가 바로 불러올 이미지의 경로를 말하고
약간은 생소하지만 pack://siteoforigin,,,은 간단하게 말해서 대상 리소스가 디자인 타임에 결정될 수 없고 런타임에 해당 경로에서 검색된다는 것을 의미하는데요.
예를 들어 애플리케이션에서라면 프로그램의 실행경로 혹은 절대경로가 될 수 있겠고 웹 애플리케이션이라면 URL주소가 될 수 있겠죠. 자세한건 http://gongdo.tistory.com/57를 참고.

어쨌든, 이 문제는 VS2005 IDE에서보다 더 심각합니다.
왜냐면 디자인뷰의 Whoops!를 무시하고 빌드한 후 실행해보면 진짜로 해당 리소스의 경로를 인식하지 못하여 화면에 표시해줄 수 없기 때문입니다.
아마도 Orcas에서는 pack://siteoforgin,,,이라는 키워드를 인식하지 못하거나 처리에 버그가 있거나 혹은 사용 규칙이 바뀌었을 수 있을 것 같습니다.

Orcas와 WPF 그리고 siteoforgin에 대해 구글 신에게 간절히 기도했지만, 아직은 별다른 정보가 없네요. 혹은 제가 못찼았거나.

결국은 Orcas에서의 외부 리소스 사용은 단순히 프로젝트에 해당 리소스를 추가시켜서 쓸 수밖에 없었습니다.


오른쪽 프로젝트 뷰에서 추가된 이미지 리소스를 확인하실 수 있을거에요.

아마도 대부분의 샘플 프로젝트나 개념 설명 등에서 간단하게 하기 위해 이미지 같은 리소스를 프로젝트에 포함시키고 Source="이미지.bmp" 이런식으로만 사용했을 것 같습니다.
저라도 단순함 샘플 프로그램은 저렇게 했을거에요.


정리.
1. VS2005 + WPF 익스텐션에서는 XAML 디자인뷰 상의 버그로 AllowsTransparency 어트리뷰트가 포함된 Window 엘리먼트롤 표시할 수 없다. 단, 빌드는 정상적으로 수행되며 실행도 정상적으로 수행된다.
2. Orcas 2007 3월 CTP에서는 AllowsTransparency 어트리뷰트가 정상적으로 렌더링된다. 하지만 pack://siteoforigin,,, 형식의 Pack URI를 제대로 인식하지 못하는 문제가 있고 이것은 빌드를 정상적으로 해도 런타임에 해당 URI를 로딩하지 못한다.
3. 2의 문제는 버그가 아닌 Pack URI 스펙의 변경일 가능성도 있지만 아직 자세한 정보를 찾지 못했다.

끄~읕.

P.S.
혹시라도 이 글을 보시는 WPF 고수님, 부디 이 문제를 해결할 수 있는 한줄의 가르침을...

신고
Posted by gongdo


티스토리 툴바