145 Results for '실버라이트'

  1. 2008.11.17 실버라이트 3 떡밥 (5)
  2. 2008.11.06 XAP사이즈, 압축하지 않겠는가? (7)
  3. 2008.11.05 Sandcastle을 사용한 간단 문서화 (8)
  4. 2008.11.04 IsolatedStorage를 사용하면 Blend에서 디자인이 안보인다? (1)
  5. 2008.11.03 SyntaxHighlighter, 예쁜 코드를 달아봅시다. (1)
  6. 2008.11.03 Blend에서 열었는지 여부를 코드로 식별하기
  7. 2008.10.29 실버라이트 2 모바일
  8. 2008.10.29 Silverlight Tools for Visual Studio 2008 SP1 최종 릴리즈
  9. 2008.10.29 실버라이트 툴킷 공개! from PDC2008 (1)
  10. 2008.10.28 실버라이트 서비스를 위한 서버의 준비사항 총정리 (3)
  11. 2008.10.25 Loaded이벤트와 템플릿 적용의 완료 타이밍
  12. 2008.10.25 컨트롤 라이프사이클과 타이밍 (2)
  13. 2008.10.24 리소스 종류와 상대 URI 평가 방법 정리 (5)
  14. 2008.10.23 크로스 존Cross-zone 접근 제약에 관하여 (3)
  15. 2008.10.21 실버라이트 2 개발자 런타임에 관하여 (2)
  16. 2008.10.17 Blend 2 SP1의 희한한 버그 (1)
  17. 2008.10.16 Windowless 모드에서는 IME가 동작하지 않는다!? (5)
  18. 2008.10.15 빌드 넘버의 비이밀...
  19. 2008.10.14 Silverlight 2 RTW 및 Tools RC1 릴리즈[추가]
  20. 2008.10.14 실버라이트 2 공식 릴리즈를 알리는 마이크로소프트 컨퍼런스 콜(떡밥 첨부) (6)
  21. 2008.10.13 스캇 거쓰리의 마이크로소프트 컨퍼런스 콜
  22. 2008.09.26 실버라이트 2 RC0 관련 리소스 (1)
  23. 2008.09.26 실버라이트2 베타2 RC0 브레이킹 체인지
  24. 2008.09.26 [속보/업데이트] 실버라이트2 베타2 RC0 릴리즈!
  25. 2008.09.24 시계 방향으로 회전하면서 보여주기 (2)
스캇구 횽님이 실버라이트 3에 대한 떡밥을 살포하셨네요. 이런 건 물어주는게 예의죠^^
그냥 스크린 샷만 봐도 배가 부를 떡밥이에요.
바빠서 세줄 요약.
  • 내년에 실버라이트 3 출시 계획
  • H.264 지원, 하드웨어 가속 지원 등의 미디어/그래픽 처리 향상
  • Visual Studio의 Design 뷰에서 직접 오브젝트 편집 지원
한줄 요약.
블렌드는? 블렌드는? 블렌드는?
Posted by gongdo

실버라이트 애플리케이션을 배포하는 것에서 가장 중요한 원칙은 뭘까요? 밑줄 긋고 외웁시다.

배포 사이즈를 작게 더 작게!

우리는 XAP 파일이 표준 ZIP 압축 알고리즘을 쓰고 있다는 점을 알고 있죠. 그런데 Delay’s Blog의 포스팅에 의하면 실버라이트 2의 XAP 파일은 압축률이 일반적으로 사용되는 것보다 낮다고 해요. 7-Zip의 압축률을 기준으로 1~3 단계 정도면 용량도 더 줄어들면서 압축 시간은 거의 차이가 없는데 여튼 여기에 착안해서 XAP의 압축률을 변경하여 압축하는 것만으로도 약 20~22% 정도의 용량이 줄어드는 마법(!)같은 효과를 얻을 수 있다는 군요.

저도 예전에 실버라이트 1때에는 7-zip command line 툴을 이용해서 비스무레한 일을 했던 적이 있는데 아무래도 2에서는 XAP을 자동으로 만들어줘서 그러려니 했었죠.

여튼 WEB-SNIPPETS 블로그에서는 이 작업을 좀 더 쉽게 해주는 유틸리티를 공개했는데요, 간단하게 옮겨 보죠.

  1. ReXapper를 다운로드
  2. 받은 파일의 압축을 풀어 임의의 장소에 복사(예 : D:\Utils\ReXapper\ReXapper.exe)
  3. 실버라이트 프로젝트의 Properties(속성)을 열어 Build Event탭의 Post-build event command line 박스를 찾아가서
  4. 다음의 코드를 붙여 넣기
    D:\Utils\ReXapper\ReXapper.exe –xap "$(TargetDir)$(TargetName).xap"

일단 저도 하나만 테스트를 해 봤지만, 348,854 bytes가 268,154 bytes로 약 20% 줄어드는 효과를 봤어요!

그러니…

Posted by gongdo

오늘은 땡스빌을 외치며 시작하죠. 그리고 코드 플렉스에도 감사를.

개발자를 지긋지긋하게 괴롭히는 것 중 하나는 문서 작업이죠. 어쩌겠습니까 뭐.

최근에 회사에서 라이브러리를 정리하면서 '위키로 라이브러리를 정리하자!'하고 막상 위키를 개설해 놨더니… 뭐 결과는 다 아시잖아요? 문서 만드는게 죽도록 귀찮은 일이라서…

이럴 시간에 한 줄이라도 더 쓰지 OTL

음음.

그래서 한동안 잊고 있었던 샌드캐슬 프로젝트를 혹시나 하고 기웃거려 봤더니 코드플렉스로 죄다 이사를 갔더군요. 그리고 기대를 져버리지 않고 닷넷 3.5까지 잘 지원을 하고 있었어요. 앗싸~

여튼, 슬슬 이 글 쓰는 것도 귀찮아지고 있어서 아주 초간단하게 준비물과 해야 할 일을 주욱 늘어놓고 끝내도록 하죠.

준비물

[필수]

[툴]

[옵션]

와우, 죄다 코드 플렉스로 이사갔네요. 요즘은 마이크로소프트랑 관계된 오픈 소스 프로젝트는 거의 대부분 코드 플렉스에 있는 것 같아요.

간단하게 설명하자면 Sandcastle은 일종의 라이브러리이고 Sandcastle을 사용하여 여러 가지 프로젝트들이 각기 다른 방법으로 문서화나 빌드를 하는 툴 혹은 프로젝트를 진행하고 있죠.

실제로 사용할 툴은 Sandcastle Help File Builder(SHFB) 또는 DocProject에서 진행하고 있는 건데요 서로 다른 특성을 가지고 있어요.

SHFB는 GUI 툴로 프로젝트 파일을 추가하고 연관된 어셈블리 들을 넣어주면 헬프 파일을 만들어주는데 단점은 의존성 있는 어셈블리를 일일이 추가해 줘야 한다는 것과 편집 옵션이 전체 헬프 파일 서머리와 네임스페이스 별 서머리만을 지원하고 나머지는 그냥 기본이라는 점. (이 외에 다른 방법이 있는 것 같은데 귀찮습니다. … ㅠ.ㅜ)

이에 반해 DocProject는 의존성 있는 어셈블리를 별도로 지정할 수 있어서 간편하고 좀 더 편리한 편집 툴도 제공해서 더 좋은 것 같아요. 하지만 C# 프로젝트 형식이라서 별도의 솔루션을 만드는 것이 좋고 해서 스탠드얼론 방식을 좋아하는 분에게는 별로겠죠.

여튼 선택은 자유…이지만 설명은 DocProject만 할께요.

헬프 파일 스타일은 헬프 파일의 디자인의 몇몇 템플릿인데요, MSDN말고도 다른 스타일로 할 수 있죠. 이건 뭐 말 그대로 옵션.

마지막으로 MS 헬프 2.0 형식의 파일(.HsX)는 CHM과는 다르게 곧바로 볼 수 없고 별도의 등록 과정을 거쳐야만 Document Explorer에서 볼 수 있죠. 근데 이게 또 만만치가 않아요. =_=;

 

설치 과정

 

사용 방법

DocProject를 기준으로, 기본적으로 릴리즈 노트에 잘 설명이 되어 있으니,

…라고 하고 싶습니다만, 실버라이트용 프로젝트에서는 약간 더 손대야 할 부분이 있어서 그 부분만 언급하고 넘어갈께요;; 길어서 접어둡니다.

더보기

Posted by gongdo

Source 먼저 x:Name 어트리뷰트가 "Output"으로 설정된 TextBlock만을 가진 MyUserControl이라는 유저 컨트롤의 코드 비하인드에 다음의 코드를 입력하고 다른 유저 컨트롤(Page)에 MyUserControl을 추가 했어요.

using System;
using System.Windows.Controls;
using System.IO.IsolatedStorage;

namespace IsolatedStorageCrashInBlend
{
    public partial class MyUserControl : UserControl
    {
        public MyUserControl()
        {
            InitializeComponent();

            // 디자인 모드가 아닐 경우에만 처리
            // 설정을 읽어 Output에 출력
            if (IsolatedStorageSettings.ApplicationSettings.Contains("LastGuid"))
            {
                Output.Text = IsolatedStorageSettings.ApplicationSettings["LastGuid"].ToString();
            }
            else
            {   // 설정이 없으면 새 값을 저장
                IsolatedStorageSettings.ApplicationSettings["LastGuid"] = Guid.NewGuid().ToString();
            }
        }
    }
}

Incorrect IsolatedStorage와 관련된 코드를 포함하는 컨트롤 자체는 블렌드에서 디자인이 잘 보여요. 이유는 이 전에 포스팅 했고요.

Correct 그러나 IsolatedStorage와 관련된 코드를 포함하는 컨트롤을 다른 컨트롤의 XAML에서 추가했을 때 블렌드에서 디자인이 안보이면서 복장터지는 에러 메시지만 내뿜죠.

Solution 이 문제는 이 전 포스팅에서 얘기했듯이 DesignerProperties를 사용하여 피해갈 수 있어요.

using System;
using System.Windows.Controls;
using System.IO.IsolatedStorage;
using System.ComponentModel;

namespace IsolatedStorageCrashInBlend
{
    public partial class MyUserControl : UserControl
    {
        public MyUserControl()
        {
            InitializeComponent();

            // 디자인 모드일 때에는 임의의 값 출력
            if (DesignerProperties.GetIsInDesignMode(this) == true)
            {
                Output.Text = Guid.NewGuid().ToString();
            }
            else
            {
                // 디자인 모드가 아닐 경우에만 처리
                // 설정을 읽어 Output에 출력
                if (IsolatedStorageSettings.ApplicationSettings.Contains("LastGuid"))
                {
                    Output.Text = IsolatedStorageSettings.ApplicationSettings["LastGuid"].ToString();
                }
                else
                {   // 설정이 없으면 새 값을 저장
                    IsolatedStorageSettings.ApplicationSettings["LastGuid"] = Guid.NewGuid().ToString();
                }
            }
        }
    }
}

잘 나오죠? 하지만 위의 코드는 좋은 패턴이 아니에요. 약간만 리팩터링을 해보죠.

using System;
using System.Windows.Controls;
using System.IO.IsolatedStorage;
using System.ComponentModel;

namespace IsolatedStorageCrashInBlend
{
    public partial class MyUserControl : UserControl
    {
        public MyUserControl()
        {
            InitializeComponent();

            // 디자인 모드일 때에는 임의의 값 출력
            if (DesignerProperties.GetIsInDesignMode(this) == true)
            {
                Output.Text = Guid.NewGuid().ToString();
            }
            else
            {
                // 디자인 모드가 아닐 경우에만 처리
                InitializeApplicationData();
            }
        }

        private void InitializeApplicationData()
        {
            // 설정을 읽어 Output에 출력
            if (IsolatedStorageSettings.ApplicationSettings.Contains("LastGuid"))
            {
                Output.Text = IsolatedStorageSettings.ApplicationSettings["LastGuid"].ToString();
            }
            else
            {   // 설정이 없으면 새 값을 저장
                IsolatedStorageSettings.ApplicationSettings["LastGuid"] = Guid.NewGuid().ToString();
            }
        }
    }
}

네, 다른 모든 코드도 마찬가지지만 특히 IsolatedStorage와 관련된 코드는 별도의 코드 블럭으로 빼주는 것이 좋아요.
아니, 반드시 그렇게 해야 해요.
이 외에도 블렌드에서만 발생하는 문제가 가끔 있는데요, 그 문제가 코드와 연관된 것이라면 DesiginerProperties를 사용하여 회피할 수 있어요.

샘플을 첨부했으니 한 번 이렇게 저렇게 테스트 해 보세요.


Posted by gongdo

오늘도 구글신과 오픈소스의 성인들에게 감사하는 마음으로, 살짝 경건하게 SyntaxHighlighter를 달아봅시다.

티스토리가 가장 마음에 드는 건 역시 블로그 페이지의 구성을 <!DOCTYPE…부터 시작해서 모든 코드를 내가 마음대로 손댈 수 있고 <script>나 <object> 등에 대한 제한도 없다는 거죠. 그래서 이래저래 위젯이나 스크립틀릿도 마음대로 달 수 있고요.

여튼, 전에 잠깐 달았다가 스킨 바꾸면서 까먹고 있었던 SyntaxHighlighter를 다시 달았어요. 티스토리뿐만 아니라 <head>태그에 접근이 가능한 모든 블로그에서 사용할 수 있는 방법이니 필요하신 분은 한 번 따라해 보아요.

참고로 SyntaxHighlighter는 간단하게 말해서 HTML의 <pre>나 <textarea>에 삽입된 코드에 색상을 입혀주는 스크립틀릿인데요, C# 하일라이팅에는 가장 적합하고 기능도 강력하죠. 처음엔 독립 프로젝트로 시작했다가 지금은 구글 코드 프로젝트로 이사했네요.

1. 코드 다운로드

SyntaxHighligter 프로젝트 홈으로 가서 Downloads에서 최신 파일을 받아 적당한 위치에 압축을 해제합니다.

 

이런 구조로 되어 있을 거에요.

Scripts에는 필요한 각종 스크립트가 주석이 제거되고 최소화된 버전으로 있고, 클립보드 복사에 필요한 swf 애플리케이션이 있으며, Styles에는 필요한 스타일이, 마지막으로 Uncompressed에는 주석이 온전하게 달린 스크립트가 있어요.

2. 코드 업로드

SyntaxHighlighter는 상당히 많은 양의 코드로 구성되어 있어서 그냥 <script>블럭으로 붙여넣기에는 비효율적이에요. 가급적 웹서버에 업로드 해놓고 쓰는 걸 권장해요.

웹서버에 적당한 폴더를 만들고 필요한 파일을 업로드 해야 하는데요, 필수와 옵션을 구분해보자면…

필수

  • Scripts/shCore.js
    코어 스크립트
  • Styles/SyntaxHighlighter.css CSS
    스타일

선택

  • Scripts/shBrush#####.js
    하일라이팅을 할 언어의 브러쉬(사용할 것만 넣는게 낫겠죠)
  • Scripts/clipboard.swf
    클립보드에 복사할 때 필요한 플래시 애플리케이션

이 파일들을 웹 서버에 적당히 업로드 해둡니다.

3. 블로그 스킨 수정(혹은 HTML 디자인 수정)

티스토리를 기준으로 설명하자면…

  1. 관리자 메뉴에서 [스킨]->[HTML/CSS 편집]에 들어갑니다.
  2. <head>블럭 사이에 다음의 코드를 삽입합니다. js파일은 여러 개가 될 수 있겠죠?
    <link rel="stylesheet" type="text/css" href="http://자신의 웹 서버에 올린 css 파일의 URL" />
    <script type="text/javascript" src="http://자신의 웹 서버에 올린 필요한 js 파일의 URL" />
  3. <body>블럭이 닫히기 전(</body>의 앞)에 다음의 스크립트 블럭을 삽입합니다.
    <script type="text/javascript">
    dp.SyntaxHighlighter.ClipboardSwf = "웹 서버에 업로드한 clipboard.swf 파일의 URL";
    dp.SyntaxHighlighter.BloggerMode();
    dp.SyntaxHighlighter.HighlightAll('code');
    </script>
  4. 저장 끝.

 

4. 블로그에서 SyntaxHighlighter 사용하기

코드를 사용하고자 하는 곳에 다음과 같은 HTML 코드를 넣으면 됩니다.
예를 들어 C#을 보자면…

<pre name="code" class="c#:firstline[1]">
여기에 코드를 있는 그대로 삽입
</pre>
class에는 몇 가지 옵션이 들어갈 수 있는데요,
자세한 옵션은 http://code.google.com/p/syntaxhighlighter/wiki/Configuration 여기를 참고하세요.
5. 테스트!
잘 되나요?
C# 예제
using System.Windows.Controls;
using System.Windows.Media;
using System.ComponentModel;

namespace DesignPropertiesSample
{
    public partial class MyUserControl : UserControl
    {
        public MyUserControl()
        {
            InitializeComponent();
            TextBlock tb = new TextBlock();

            if (DesignerProperties.GetIsInDesignMode(this) == true)
            {
                // Design-time
                LayoutRoot.Background = new SolidColorBrush(Colors.Blue);
                tb.Text = "in Design";
            }
            else
            {
                // Run-time
                LayoutRoot.Background = new SolidColorBrush(Colors.Green);
                tb.Text = "in Runtime";
            }

            LayoutRoot.Children.Add(tb);
        }
    }
}

XAML(XML) 예제(헉... XAML은 잘 안되는군요 -_-)

  
    
    
  

Posted by gongdo

컴퍼넌트 및 컨트롤 개발자/디자이너에게 반드시 필요한 기능이죠. 보통 우리가 컨트롤을 디자인 할 때에는 특히, 데이터 바인딩을 사용하는 컨트롤의 경우에는 실제 데이터가 표시될 자리에는 아직 아무런 데이터가 들어가지 않았기 때문에 디자이너들이 그 곳에 임의의 값이 어떤 형태로 들어갈지 알 수 없다는 문제점이 있죠. 바로 이럴 때 System.ComponentModel.DesignerProperties 클래스를 유용하게 사용할 수 있어요.

우선 샘플 프로젝트부터 받아 보시죠.

먼저 간단하게 유저 컨트롤을 하나 만들어서 테스트 해 보죠. 컨트롤의 이름은 MyUserControl이라고 하고 크기는 100x100으로 아무것도 없는 컨트롤이에요. 그리고 코드 비하인드에 다음과 같이 간단한 코드를 넣어보죠.

public MyUserControl()
{
    InitializeComponent();
    TextBlock tb = new TextBlock();

    if (DesignerProperties.GetIsInDesignMode(this) == true)
    {
        // Design-time
        LayoutRoot.Background = new SolidColorBrush(Colors.Blue);
        tb.Text = "in Design";
    }
    else
    {
        // Run-time
        LayoutRoot.Background = new SolidColorBrush(Colors.Green);
        tb.Text = "in Runtime";
    }

    LayoutRoot.Children.Add(tb);
}

DesignerProperties.GetIsInDesignMode() 메서드는 주어진 UIElement가 현재 디자인 모드에서 렌더링 되고 있는지 여부를 반환해요. 해당 UIElement가 디자인 모드 즉, Blend에서 렌더링 되고 있다면 true를, 웹브라우저 등에서 렌더링 되고 있다면 false를 반환하는거죠.

위의 코드는 컨트롤이 인스턴스화 될 때 디자인 모드에서는 파란색으로 컨트롤을 채우고 "in Design"이란 문자열을 출력하고 런타임에서는 녹색으로 컨트롤을 채우고 "in Runtime"이란 문자열을 출력하도록 작성되었어요.

비주얼 스튜디오에서 MyUserControl을 볼까요?

아무것도 안나오죠? 이것은 비주얼 스튜디오의 XAML 뷰어(코드명 사이더)는 해당 UserControl을 새로 생성하는 것이 아니라 단지 XAML을 분석하여 보여준다는 것을 알 수 있죠.

블렌드의 경우도 마찬가지에요.

 

자, 다음으로 MyUserControl을 XAML에서 추가하여 사용하는 Page.xaml을 한번 볼까요?

비주얼 스튜디오의 XAML 뷰어에서는 디자인 모드가 아닌 런타임으로 판단하는군요. 이것은 아마도 버그내지는 잘못된 판단이 아닐까 싶어요. 아무리 사이더에서 실제로 디자인 하는게 불가능하더라도 엄연히 이 시점은 '디자인'상태니까요.

반면, 블렌드에서는 디자인 모드를 정상적으로 인식하는 것을 볼 수 있죠.

그렇다면 브라우저에서는? 당연히 런타임으로 나오겠죠?

 

DesignerProperties 클래스가 유용하게 쓰이는 경우는 앞에서 말했던 것처럼 동적으로 변경되는 값의 샘플 값을 디자이너에게 보여주고 싶을 때인데요 이 외에도 이 클래스를 반드시 써야 하는 경우도 있어요. 바로 몇몇 코드는 블렌드에서 처리할 수 없어서 에러를 발생시키는 원인이 되기도 해요.

이렇게 말이죠. 이게 당해보면 진짜 환장할 노릇이거든요. 왜냐면 유저 컨트롤 그 자체에서는 잘 보이는데 그 컨트롤을 사용한 다른 컨트롤의 디자인에서만 안보이니까요.

어떤 경우에 위와 같은 에러가 나오는지 완전히 정리되지는 않았지만 한가지 확실한 것은 IsolatedStorage가 사용되었을 때에요. IsolatedStorage를 쓸 때의 주의점과 해결 방법은 다음 포스팅에서 설명할께요.

Posted by gongdo
요즘 PDC2008에서 정보들이 쏟아져 나오네요. 뭐 사실 가장 큰 뉴스는 윈도우즈7에 대한 것이지만 뭐어...

음음. 거두 절미하고, 정말로 의외네요. 제가 생각했던 것보다 실버라이트 2 모바일이 훨씬 더 빠르게 다가오고 있어요.
실버라이트 2 모바일에 대해 소개하고 있는 http://silverlightuk.blogspot.com/2008/10/silverlight-2-for-mobiles.html 이 글에서 그대로 따옵니다.
YOU DO NOT HAVE TO DO ANYTHING TO MAKE YOUR SILVERLIGHT APPLICATION TO MAKE IT WORK ON THE MOBILE, NO RECOMPILING, NOTHING
정말 의외에요. 실버라이트 애플리케이션을 모바일에서 돌리기 위해 컴파일이든 뭐든 아무것도 할 필요가 없대요! 믿기지가 않네요.

실버라이트 2 모바일의 첫번째 CTP는 아마도 2009년 1분기에 나올 것으로 예상된다고 하고요, 아마도 MIX09에 맞춰 발표되지 않을까...하는 군요.

몇 가지 내용을 간추려보자면,
디바이스가 달라지면 사용자 경험도 달라져야 한다.
실버라이트 2 모바일이 실버라이트 2 애플리케이션을 그대로 돌릴 수 있다고 해도 화면 사이즈나 디바이스의 제약등을 고려해야 한다는 얘기죠.

키보드 인터랙션
뭐 핸드폰 등의 입력 장치를 고려한 키보드 인터랙션이 들어갈거라는군요. 예를 들어 숫자만 입력하기 라던가...

제스쳐
이제 휴대 디바이스에서 터치는 대세가 아닌 필수가 되는 느낌이죠. 터치 디바이스에서 제스처 기능은 매우 유용한데요,  실버라이트 2 모바일의 SDK나 코드플렉스에서 표준화된 제스처를 지원하...기를 바란대요-_-;

디바이스
모바일 디바이스들은 실버라이트를 플러그인 형태로 지원한다고 하는데요, 바로 브라우저의 방식과 같이 말이죠.
마이크로소프트는 디바이스 벤더들이 실버라이트 플러그인을 번들하도록 유도하고 있고 실버라이트 플러그인이 번들된 디바이스는 브라우저와는 달리 별도로 설치할 필요가 없대요.

모바일 기능
카메라 캡쳐 등을 지원...뭐 이것도 미래의 일이니까요. 아직은 확실치 않고요.

CTP...
아직 CTP가 나오지 않았지만 실버라이트 2 애플리케이션 개발 경험이 있다면 사이즈만 잘 조절하면 곧바로 실버라이트 2 모바일 개발이 가능한거죠. CTP까지는 이런식으로 시뮬레이션이 가능... 

이제 남은건 모바일 디바이스 벤더가 실버라이트를 심은 디바이스를 출시하는 것 뿐!
Pigmap on mobile도 기대하세요 ^^
Posted by gongdo
[철수네 소프트웨어 세상]에 올라온 따끈한 정보^^
Download details: Silverlight Tools 다운로드 주소로 가보면 한국어를 선택할 수 있지만 날짜가 조금 오래된 거죠. 한국어 버전은 아직 업데이트 되지 않았으니 주의하시길. 아마도 1주일 정도면 업데이트 될테니 조금만 기다리세요 :)

노파심에 덧붙이지만, 기존 개발툴을 모두 제거한 후 설치하는 게 좋고 Silverlight Tools만 설치하면 필요한 런타임, SDK, 툴이 모두 설치돼요.

참고로 실버라이트 2 RTW의 런타임은 변경이 없이 여전히 2.0.31005.0이고요 혹시 런타임만 지웠다가 다시 설치하려면,
반드시 디버깅에 필요한 어셈블리가 포함된 개발자용 실버라이트 2 런타임을 설치하시는게 좋겠죠?
다운로드는  http://go.microsoft.com/fwlink/?LinkId=127693 여기에서...
Posted by gongdo

한창 PDC2008에서 소식이 쏟아져 나오고 있는데요, 관심 있는 주제들은 많은데 둘러 볼 시간이 없네요. 저는 한창 프로젝트 막바지에 이르러서요… 그래도 실버라이트 관련해서 그냥 지나칠 수 없는 소식이 있어요.

전에 실버라이트 2를 공식으로 발표한 컨퍼런스 콜에서도 나왔던 얘기지만 코드 플렉스를 통해 실버라이트 툴킷이 공개되었어요.

이번에 공개된 툴 킷에는 12개의 컨트롤과 6개의 테마를 포함하고 있으며 모두다 유닛 테스트와 문서화가 완벽하게 이루어져 있어요. 여느 오픈 소스와는 질적으로 다른 게 바로 유닛 테스트와 문서화라고 생각해요.

 
MSDN 스타일의 표준화된 문서화야 말로 마이크로소프트 기술의 강점중 하나!

 
진짜 프로젝트를 이 정도로만 깔끔하게 만들면 하산해도 될거에요. 앞으로 실버라이트 컴포넌트를 만들 때의 교과서가 될 듯. 저도 이번 프로젝트 끝내고 빨리 공부해보고 싶군요.

실버라이트 툴킷 프로젝트에서는 컨트롤을 4개의 퀄러티 대역으로 구분하고 있네요.

  • Experimental ; 실험적이고 평가를 위해 작성된 컨트롤.
  • Preview ; 기본적인 사용 시나리오를 미리 보기 위한 퀄러티로 피드백에 따라 많은 수정이 있을 수 있음.
  • Stable ; 90% 이상의 완성도로 이 후 브레이킹 체인지는 거의 없는 퀄러티.
  • Mature ; 풀 릴리즈를 위해 준비된 퀄러티.

이번에 공개된 컨트롤은 다음과 같아요.

Preview 퀄러티

  • AutoCompleteBox
  • NumericUpDown
  • ViewBox
  • Expander
  • ImplicitStyleManager
  • Charting

Stable 퀄러티

  • TreeView
  • DockPanel
  • WrapPanel
  • Label
  • HeaderedContentControl
  • HeaderedItemsControl

네, WPF를 하셨던 분이라면 익숙한 몇몇 컨트롤도 있고 새로 추가된 컨트롤도 있네요. 특히 썩 아름답지는 않지만 쓸만한 차트가 포함된 것도 고무적이고요.

또 특이한 점으로는 기존 컨트롤에 쉽게 테마를 입힐 수 있도록 준비된 ImplicityStyleManager인데요, 자세한 사항은 Theming에서 확인해 보세요. 간단하게 눈으로만 봐도 무슨 내용인지 파악할 수 있을 거에요.

아우아우… 바빠 죽겠는데 새로운 것들은 쏟아져 나오고… 진짜 정신 없네요!

Posted by gongdo

후우… 이건 뭐 챙피도 보통 챙피가 아니네요.
아무리 해봐도 퍼가기에서 애플리케이션이 동작을 안하길래 1시간 동안 별 쌩쑈를 다 했는데… 결국 서버에 해줘야 할 가장 기본적인 설정을 안해줘서 생긴 문제였어요.

이 기회에 실버라이트 서비스를 위해 필요한 서버측의 준비 사항을 정리해봅니다.

 

[필수]

올바른 MIME-TYPE 등록과 Content-type 응답

먼저 서버에는 반드시 다음과 같이 XAP에 대한 MIME-TYPE이 등록되어 있어야 해요.

확장자 : XAP
MIME-TYPE : application/x-silverlight-app

IIS6의 경우 MIME-TYPE이 없을 경우 애초에 다운로드부터 실패하므로 비교적 원인을 빨리 찾을 수 있는데요,
Tomcat 등으로 돌린 호스트는 MIME-TYPE을 등록하지 않더라도 기본적으로 다운로드를 허용하죠. 그래서 웹 디버깅 툴로 HTTP 200 떨어지는 걸 보고는 MIME-TYPE 문제는 아닐 것이다…라고 안심하고 다른 곳에서 삽질한거죠.

또한 실버라이트 2에서는 서버가 XAP에 응답할 때에는 반드시 올바른 Content-Type을 헤더에 포함하고 있어야 해요.

예)
HTTP/1.1 200 OK
Content-Length: 321175
Content-Type: application/x-silverlight-app
…생략…

자 외쳐봅시다!

프로젝트 시작하면 MIME-TYPE 등록!
다운되는 XAP도 다시 보자!

(참고로 고맙게도 IIS7에서는 XAP에 대한 올바른 MIME-TYPE이 처음부터 등록되어 있어요)

[크로스 도메인에 따른 옵션]

크로스 도메인에 대한 리소스 접근 허용시 clientaccesspolicy.xml 등록

만약 실버라이트 애플리케이션이 크로스 도메인을 넘어 서버에 리소스를 요청할 때에는 반드시 해당 도메인의 최상위 경로에 clientaccesspolicy.xml이 있어야 해요. 물론 크로스 도메인 접근을 허용하지 않는다면 없어도 되겠죠.

참고 : http://timheuer.com/blog/archive/2008/04/06/silverlight-cross-domain-policy-file-snippet-intellisense.aspx
참고 : http://msdn.microsoft.com/en-us/library/cc197955(VS.95).aspx

 

크로스 도메인에서 실버라이트 실행시 스크립트 사용 허용

만약 실버라이트 애플리케이션이 크로스 도메인 영역에서 실행되고 있다면 기본적으로 스크립트 관련 기능이 사용 불가능 상태가 되는데요, 코드에 따라 다음의 설정들이 필요할 수 있어요.

  • AppManifest.xml에 설정 추가

모든 스크립트 관련 기능을 사용하려면 다음 그림과 같이 실버라이트 애플리케이션 프로젝트의 Properties 아이템을 확장해보면 AppManifest.xml 파일이 보이는데요, 여기에 아래의 설정을 추가해 줘야 해요.

 <Deployment xmlns="http://schemas.microsoft.com/client/2007/deployment"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    ExternalCallersFromCrossDomain="ScriptableOnly">
    <Deployment.Parts>
    </Deployment.Parts>
</Deployment>

  • enableHtmlAccess 설정

HtmlPage 클래스에서 호스트 HTML 페이지에 접근하려면 실버라이트 <object>태그의 <param>중에 다음의 설정을 추가해야 해요.

<param name="enableHtmlAccess" value="true" />

 

  • allowHtmlPopupWindow 설정

HtmlPage.PopupWindow 메서드를 사용하여 팝업을 할 필요가 있다면 실버라이트 <object>태그의 <param>중에 다음의 설정을 추가해야 해요.

<param name="allowHtmlPopupWindow" value="true" />

 

이런 설정들이 없을 때 나오는 증상은 대체로 화면이 허옇게 나오면서 아무것도 안나오거나, Alert이나 Popup이 안되거나, 휠 마우스가 안된다거나, Scriptable로 등록한 JavaScript 오브젝트와의 통신이 안된다거나 하는 현상이에요. 이런 현상을 겪더라도 쫄지마시고 순서대로 짚어 보세요.

Posted by gongdo

Wolf schmidt씨가 Loaded event timing in Silverlight에서 실버라이트와 WPF의 Loaded 이벤트 발생 시점의 차이와 이에 따른 workaround에 대해 설명했는데요, 실버라이트는 FrameworkElement.Loaded 이벤트가 템플릿이 적용되기 전에 발생하지만 WPF에서는 템플릿이 적용된 후에 발생한다고 해요.

MSDN 문서에서는 실버라이트의 Loaded 이벤트에 대해 “FrameworkElement가 레이아웃을 잡는 과정을 완료하고, 렌더링 되고, 인터랙션을 할 준비가 완료되었을 때”라고 설명하고 있는데요, 이것보다는 “FrameworkElement가 생성되고 오브젝트 트리(비주얼 트리)에 추가되었을 때 발생”이 더 적합한 설명이므로 차후 SDK에서는 설명을 변경하겠다는군요.

이 차이는 개발자들에게 혼란을 주는데요 왜 이런 차이를 주었는지에 대한 것은 모르겠어요.

여튼, 실버라이트는 Loaded 이벤트에서는 아직 템플릿이 적용되지 않은 상태이므로 템플릿이 적용된 명확한 시점을 알 수 있는 방법이 없는데요, Wolf씨는 다음과 같은 workaround를 소개하고 있어요(날림 번역 발동). 각각의 workaround는 가능성과 한계가 다르므로 상황에 맞춰서 써야겠죠.

  1. 컨트롤을 서브클래싱한다면 Loaded 이벤트를 핸들링하는 것보다 OnApplyTemplate을 오버라이드 하는 것이 낫습니다.
    OnApplyTemplate은 템플릿으로 부터 비주얼 트리를 얻었고 이제 그 비주얼들을 사용하거나 조정하려고 하는 상황을 위해 명확하게 의도된 콜백입니다.
    이 방법의 한계는 이 서브클래싱된 컨트롤을 사용하는 코드에서는 OnApplyTemplate의 정의를 바꿀 수 없고 또한 OnApplyTemplate이 호출되는 시점에 다른 추가적인 처리를 할 수 없다는 점입니다.
  2. Loaded를 사용할 수도 있습니다. 그렇지만 사용자는 첫번째 호출되는 Loaded 이벤트 핸들러에서 Control.ApplyTemplate을 명시적으로 호출해야 합니다. ApplyTemplate은 동기적인 메서드이기 때문에 이 호출이 완료된 후에는 템플릿에서 만들어진 비주얼 트리를 사용 가능한 상태가 됩니다.
    다만 ApplyTemplate을 호출하는 것은 이미 Loaded 이벤트에서 일어났던 여러가지 실버라이트의 서브시스템(렌더링, 레이아웃 등)에 중복하여 적용되지 않습니다. 이런 시도를 사용하려면 해당 엘리먼트는 FrameworkElement와는 달리 Control일 필요가 있고 실제 템플릿과 엮여 있어야 합니다. 그래서 이 상황은 보통 ContentControl이나 ItemsControl에 적합합니다. (왜냐면 ContentControl이나 ItemsControl은 항상 비주얼 트리의 결정이 템플릿이 적용된 이후에 이루어지기 때문이죠.)
  3. 또한 Loaded 이벤트 대신에 LayoutUpdated 이벤트를 이용할 수 있습니다. LayoutUpdated는 실버라이트 UI에서 컨트롤을 만드는 과정 중에서 가장 마지막에 일어나는 “오브젝트 라이프타임”이벤트입니다. 중요한 제한은 LayoutUpdated가 일련의 초기화 과정 중에서 단 한번만 발생하지는 않는다는 점입니다. LayoutUpdated는 레이아웃의 변화(예를 들어 레이아웃 안에 있는 요소가 사이즈가 변경되는 등)와 연관되어 발생할 수 있기 때문입니다. 따라서 아주 작은 프로퍼티의 변화가 있더라도, 심지어 비주얼 트리의 변화가 없더라도 이 이벤트가 발생할 수 있으므로 LayoutUpdated 이벤트가 실제로 의미 있는 변화가 있었는지를 결정하는 로직이 따로 필요할 것입니다.

그럼 제 경우는 어떻게 하느냐…

기본 컨트롤의 경우는 어쩔 수 없지만 새로 작성하는 모든 커스텀 컨트롤은 ControlBase라는 기반 클래스에서 파생되도록 하고 있어요. 그리고 이 ControlBase 클래스는 Control에서 파생되었으며 OnApplyTemplate을 좀더 기대되는 타이밍에 수행될 수 있도록 오버라이드 했어요.

 public abstract class ControlBase : Control
    {
        /// <summary>
        /// 템플릿 바인딩이 완료되었는지 여부를 설정하거나 반환합니다.
        /// </summary>
        public bool IsTemplateApplied { get; private set; }
 

        /// <summary>
        /// 템플릿 적용이 완료되었을때 발생합니다.
        /// </summary>
        public event EventHandler TemplateApplied;

        /// <summary>
        /// 기본 메서드는 적절한 이벤트 처리를 위해 숨깁니다. 오버라이딩된 메서드를 이용해야 합니다.
        /// </summary>
        public sealed override void OnApplyTemplate()
        {
           this.OnApplyTemplate(this); 

            IsTemplateApplied = true;           

            if (TemplateApplied != null)
                TemplateApplied(this, EventArgs.Empty);
        }

        /// <summary>
        /// 템플릿 적용이 완료된 시점에서 수행할 동작을 정의합니다.
        /// 기본 메서드는 구현 내용이 없습니다.
        /// </summary>
        protected virtual void OnApplyTemplate(object sender)
        {
        }
    }

사실 또 한가지 의문이라면 OnApplyTemplate이란 메서드가 도대체 왜 public인가인데요, 이 부분은 좀 더 공부를 해 봐야 겠네요.

정리하자면, Custom Control을 사용할 때엔 템플릿이 적용되는 시점 제어를 세심하게 해야 한다는거죠.

Posted by gongdo

Dave Relyea’s Silverlight Blog에 10월 11일에 올라온 글인데 왜 놓쳤는지 몰라요. 엄청 중요한 내용이라 그대로 옮겨 볼께요. 이 글은 실버라이트의 컨트롤이 생성되고 속성이 설정될 때 어떤 이벤트들과 오버라이드들이 어떤 타이밍으로 호출되는지를 설명합니다.

동작 XAML에서 만든 컨트롤 코드에서 만든 컨트롤
컨트롤의 생성자Ctor 시작 태그가 파싱되자 마자. new로 인스턴스를 생성할 때.
명시적인 스타일 적용됨 Style 속성이 XAML에서 설정되었다면 종료 태그가 파싱되자 마자 적용. Style 속성이 설정되자 마자.
빌트인 스타일(generic.xaml) 적용됨 명시적인 스타일이 적용된 후 종료 태그가 파싱되자마자. 이것은 명시적인 스타일을 덮어쓰지 않음. 컨트롤이 비주얼 트리에 들어갈 때. 이것은 명시적인 스타일을 덮어쓰지 않음.
프로퍼티 설정됨 어트리뷰트가 파싱되었을 때. 해당 속성을 설정했을 때.
Loaded 이벤트 엘리먼트가 비주얼 트리에 추가되었을 때 전달됨. 이벤트는 다음 프레임이 렌더링 되기 전에 발생되고 레이아웃 변경 전에 일어남. (XAML과 동일)
템플릿 적용됨(컨트롤의 비주얼이 템플릿에서 만들어진 경우) 레이아웃 측정 과정.
컨트롤이 비주얼 트리를 가지고 있지 않다면 템플릿 프로퍼티가 적용됨. 컨트롤은 비주얼 트리 없이 라이프 사이클을 시작하고 템플릿 프로퍼티가 설정될 때 비주얼 트리가 클리어됨. ApplyTemplate을 호출하여 명시적으로 지시할 수 있음.
(XAML과 동일)
OnApplyTemplate 호출됨 템플릿이 적용된 시점. 기반 클래스의 OnApplyTemplate을 호출할 필요는 없지만, 사용자가 구현한 커스텀 컨트롤을 상속 할 때에는 필요할 수 있음. (XAML과 동일)
비주얼이 최초로 사용 가능하게 됨. OnApplyTemplate에서 GetTemplateChild로 획득한 비주얼에 대해서. (XAML과 동일)
MeasureOverride 호출됨 레이아웃 측정 과정.
만약 측정 과정중에 템플릿이 확장된 경우 MeasureOverride는 템플릿 확장이 끝난 후 호출됨.
(XAML과 동일)
ArrangeOverride 호출됨 컨트롤의 정렬 과정. 측정 과정이 완료된 후 발생. (XAML과 동일)
SizeChanged 이벤트 측정과 정렬 과정이 완료된 후. (XAML과 동일)
LayoutUpdated 이벤트 SizeChanged 이벤트가 발생된 후. (XAML과 동일)
Posted by gongdo

실버라이트 2에서 상대 URI를 평가하는 기준은 아주 심플하게 말하자면,

“XAP파일이 호스팅되어 있는 웹 서버의 URL”이에요.

끝~~~~

 

 

 

 

이러면 해피하겠지만, 실버라이트는 각 리소스 종류에 따라 상대 URI를 평가하는 방법이 달라져요. 정확히 말하자면 어떤 상대 URI를 가진 리소스를 가져올 때에는 정해진 절차가 있다…가 되겠죠.

 

리소스의 종류

우선 실버라이트가 사용할 수 있는 리소스의 종류는 크게 다음과 같이 나눌 수 있어요.

  1. Resource
  2. Embedded Resource
  3. Content
  4. Site of Origin

Resource

Resource는 비주얼 스튜디오 IDE에서 Build Action 속성이 Resource로 설정된 프로젝트 아이템을 말해요.
Resource는 프로젝트가 컴파일 될 때 해당 프로젝트의 타겟 어셈블리에 포함되므로 별도로 배포할 필요가 없어지지만 대신 어셈블리의 용량이 그만큼 늘어나게 되겠죠. 따라서 아주 필수적인 요소만을 Resource로 설정해야 해요.

※ Build Action의 설정은 다음 그림과 같이 프로젝트 아이템을 선택하고 속성Properties 창에서 할 수 있습니다.


Embedded Resource

Embedded Resource는 Resource와 거의 동일한 속성을 갖지만 애플리케이션에서 접근하는 방법이 달라요. 실버라이트에서는 사용되지 않는다고 봐도 무방해요. 아니, 실버라이트 프로젝트에서는 쓰지 않기를 권장해요. 정말로 불편하기만 하니까요.

Content

Content는 비주얼 스튜디오 IDE에서 Build Action 속성이 Content로 설정된 프로젝트 아이템을 말하죠.
Content는 실버라이트 프로젝트가 컴파일 될 때 XAP 패키지 파일에 직접 포함이 되므로 역시 따로 배포할 필요가 없어지죠. 그러나 마찬가지로 XAP 패키지의 크기가 늘어나는 원인이 되므로 필수 요소만을 Content로 설정해야 해요.

Resource와 Embedded Resource와 Content가 비록 그 정의와 특성이 다르긴 하지만 하나의 프로젝트의 아이템이므로 같은 위치에 같은 파일 명으로는 단 하나의 종류만 존재할 수 있어요. 요컨대, MyImage.png라는 파일이 동시에 Resource와 Content의 형태로 존재할 수 없다는 거죠.

※단, 위의 가정은 어디까지나 비주얼 스튜디오 IDE를 사용할 경우를 말합니다. 기술적으로 MyImage.png는 Resource와 Content로 존재할 수 있지만 실제로 그렇게 하는 경우는 없다고 단언할 수 있을 만큼 없기 때문에 위와 같이 말 할 수 있습니다.

Site of Origin

이건 참 할 때마다 우리말로 옮기기가 애매한 건데요, 굳이 말하자면 ‘XAP파일을 호스트하는 서버의 위치’라고 할 수 있죠. 쉽게 얘기해서 실버라이트 패키지, XAP 파일이 올라갈 웹 서버에 있다는 것을 의미해요. Site of Origin 위치에 있는 리소스 파일은 당연하게도 실버라이트 패키지 내에 포함되지 않으므로 그 파일이 존재할 것이라고 확신할 수 없어요. 따라서 이 위치에 있는 리소스를 접근할 때에는 반드시 예외 처리가 필요하겠죠. 웹의 특성상 대부분의 이미지, 동영상, XML 등이 Site of Origin 리소스로 배치될 거에요.

 

URI 표현식

실버라이트는 어떤 리소스의 위치를 지정하는데 URI(Uniform Resource Identifyer)를 사용하죠. URI는 크게 상대 URI와 절대 URI로 구분할 수 있는데요, 절대 URI는 일반적인 URL을 지정하는 방법과 같다고 할 수 있으므로 상대 URI의 표현에 대해서 집중하도록 하죠. 상대 URI의 표현에는 몇 가지 규칙이 있어요.

예제를 들기 위해 실버라이트 애플리케이션이 http://hugeflow.com/Silverlight/Test.xap에서 다운로드 되었다고 가정합니다.

상대 URI는 Site of Origin 즉, 웹 사이트가 아닌 Resource또는 Content를 우선적으로 가리킵니다.

단, 적용 방식은 살짝 특이한데 이 부분은 아래에 설명합니다.

 

상대 URI의 절대적 기준은 XAP 파일의 현재 위치가 됩니다.

ex) /Image.png => http://hugeflow.com/Silverlight/Image.png

 

상대 경로는 '/'로 시작하는 것과 그렇지 않은 것이 동일한 위치를 가리킵니다.

ex) Image.png  => http://hugeflow.com/Silverlight/Image.png

ex) /Image.png => http://hugeflow.com/Silverlight/Image.png

 

..표현식으로 상위 경로를 지정할 수 없으며 이 표현은 무시됩니다.

ex) ../../Image.png => http://hugeflow.com/Silverlight/Image.png

 

Resource는 명시적으로 리소스가 포함된 어셈블리를 지정할 수 있습니다.

ex) /MyAssembly;component/Image.png => MyAssembly안에 있는 Image.png 리소스를 가리킴

 

동작 테스트

이외에도 다른 규칙들도 있지만 실제 사용에서 가장 중요한 내용은 이 정도라고 봐요. 자, 지금껏 말만 많이 했는데 역시 실제 동작 코드를 봐야 쉽게 이해가 가겠죠? 다음 이미지는 각 경로에 따라 로드되는 리소스의 종류를 표현하고 있는데요, 일단 보죠.


코드도 함께 곁들이는 건 어떨까요? :)

 

이 프로젝트는 다음과 같은 구조를 가지고 있어요.

 
 - 크게 세개의 프로젝트

ImageLibrary
실버라이트 라이브러리

UriRuleTest
ImageLibrary를 참조하는 실버라이트 애플리케이션 프로젝트

UriRuleTest.Web
UriRuleTest 실버라이트 애플리케이션을 호스팅하는 웹 서비스


- 실버라이트 애플리케이션 프로젝트와 웹 프로젝트는 각각 동일한 위치에 같은 파일 명으로 이미지 리소스 파일 존재

- 각 리소스가 포함된 위치는 색상으로 구분
(파랑 ; 실버라이트 애플리케이션
빨강 ; 실버라이트 라이브러리
녹색 ; Site of Origin 웹 프로젝트)

- 상대 URI로는 실버라이트가 호스팅되는 위치 바깥의 경로를 접근할 수 없다는 것을 보여주기 위해 웹 프로젝트에는 또다른 위치에 리소스들을 포함
(Web/Images 폴더)


결과를 보면 직관적으로 어떤 식으로 리소스가 로딩 되는지를 확인할 수 있을 거에요. 하나하나 설명하는 것 보다는 특이한 몇 가지 결과만 얘기해 보도록 하죠.

  • '/'로 시작하지 않는 리소스의 경우 Resource를 먼저 검색하고 만약 Resource가 없을 경우 Site of Origin을 시도합니다. 즉 두 파일이 모두 존재할 경우 항상 Resource가 선택됩니다. 또한 이 경우 Content에 대해서는 시도하지 않습니다.
  • '/'으로 시작하는 리소스의 경우 Content를 먼저 검색하고 만약 Content가 없을 경우 Site of Origin을 시도합니다. 즉 두 파일이 모두 존재 할 경우 항상 Content가 선택됩니다. 또한 이 경우 Resource에 대해서는 시도하지 않습니다.
  • Site of Origin의 경우 '/'의 유무는 영향을 주지 않습니다.
  • 위와 같은 특징이 혼란을 줄 가능성이 있으므로 Resource는 반드시 다음과 같이 명시적인 리소스 경로를 사용하는 것이 좋습니다. 이렇게 하면 참조하고 있는 다른 어셈블리의 리소스도 가져올 수 있습니다. 
    /UriRuleTest;component/Images/Resource.png
  • Embedded Resource는 오직 코드를 통해 특별한 방법으로만 접근이 가능합니다. 사실 Embedded Resource를 쓸 이유가 없습니다.
  • 다른 라이브러리 어셈블리에 있는 Content는 가져올 수 있는 방법이 없습니다. 이 파일은 사실상 컴파일시 버려집니다.
  • 웹 서버에서 XAP 파일이 있는 경로를 벗어난 위치에 있는 리소스를 접근하기 위해서는 절대 URI를 사용하는 방법 밖에 없습니다. 사용법은 코드를 참고하세요.
  • ../../../../… 와 같이 ..를 아무리 많이 중첩하더라도 결코 XAP 파일의 위치에서 벗어날 수 없으며 해당 표현은 무시됩니다.

사실 이 정책이 Beta2때 바뀌었다가 RC0이후로 다시 위와 같이 돌아왔죠. 실버라이트 애플리케이션의 의미상 위의 정책이 올바르다고 생각해요. 실버라이트 애플리케이션이 웹 서버의 루트 경로나 상대 경로를 가정하고 동작하는 것은 좋지 않은 판단일테니까요.

어쨌든 이젠 헤깔리지 마시고 그냥 위의 표를 참고하세요^^

Posted by gongdo
경험있는 개발자라면 절대로 해서는 안될 말 중에 ‘어? 제 PC에서는 되던데요…’가 있죠. 저도 평소에 절대로 이런 말을 하지 않으려고 노력하지만 이번에 또 저질러 버렸네요.

아마 실버라이트 개발 해봤다면 localhost에서는 잘 되었던 애플리케이션이 웹 서버에만 올리면 잘 안되었던 경험이 있을 거에요. 99.9% 이상의 확률로 명백하게 개발자의 실수인데요, 보통은 하드 코딩된 URI나 크로스 도메인, 혹은 웹 서버의 세팅 문제 등이죠.

하지만 이번에 제가 겪었던 것은 절대로 그런 문제가 아니었어요. 모든 URI는 세팅 파일을 통해 완전하게 컨트롤 되고 있고 크로스 도메인에 있는 리소스는 clientaccesspolicy.xml 파일을 통해 올바로 가져올 수 있으며 웹 서버의 세팅도 완벽했죠. 그런데 이상하게 제 PC에서는 되고 고객사의 PC에서는 안되는 거였어요.

기억을 더듬어 가능성이 있는 모든 설정이나 세팅, 코드를 수 차례 확인 했지만 역시 찾을 수 없었는데 한 가지 특이한 사항이라면 심지어 깨끗하게 새로 설치한 시스템에서도 해당 애플리케이션이 잘 돌아가는 걸 확인 했는데 유독 고객사의 PC에서만 그런 현상이 일어난거죠.

바로 이런 경우라면 십중 팔구 고객사의 네트워크 환경이나 특정 설정 등에 문제가 있다고 봐도 좋아요.

여튼 문제 해결을 위해 삽질도 좀 하고 다른 개발자들과 수다를 떨면서토의을 하면서 알아낸 것은!

 

 

바로 고객사의 PC에서는 해당 크로스 도메인 사이트를 ‘신뢰할 수 있는 사이트’에 등록해뒀던 거였어요. 왜 보통 자기 회사 사이트는 이것저것 보안 경고 뜨는 것도 귀찮고 해서 신뢰할 수 있는 사이트에 등록할 때도 있잖아요. 그게 문제였던 거죠.
(문제 해결에 큰 도움을 준 훈스닷넷 서동진 시삽님에게 감사^^)

그게 왜 문제나고요? 한번 다음의 애플리케이션을 통해 알아보죠.

이 애플리케이션은 Shiverlight.net에 있는 XAP파일을 받아서 실행되고 Hugeflow.com에 있는 이미지 파일을 가져오게 되어 있어요. 전형적인 크로스 도메인 시나리오죠.

아마도 휴즈플로우의 로고가 보일거에요. 자, 이제 hugeflow.com을 익스플로러의 도구->인터넷 옵션->보안->신뢰할 수 있는 사이트->사이트 버튼을 눌러 등록해 보세요. 그리고 브라우저를 새로 고침 해보세요.

아마도 이젠 이미지를 가져오는데 실패했다는 에러 메시지가 뜰거에요.

하지만 반대로 shiverlight.net만 신뢰할 수 있는 사이트로 등록할 경우는 문제 없이 되는 걸 확인할 수 있죠. 정리하자면…

[인터넷 영역] --- NOT OK ---> [신뢰할 수 있는 영역]

[신뢰할 수 있는 영역] –-- OK ---> [인터넷 영역]

[신뢰할 수 있는 영역] --- OK ---> [신뢰할 수 있는 영역]

[인트라넷 영역] --- OK ---> [신뢰할 수 있는 영역]

이러한 특성은 실제로 당하게 되면 굉장히 당황할 수 있어요. 보통 웹 디버깅 때 피들러를 많이 사용하는데요, 피들러에서 위 애플리케이션을 보면…

(hugeflow.com이 신뢰할 수 있는 사이트가 아닐 때)

(hugeflow.com이 신뢰할 수 있는 사이트일 때)

보는 것 처럼 심지어 크로스 도메인의 유효성 확인을 위한 clientaccesspolicy.xml 파일 조차 요청하지 않는 것을 알 수 있죠.

이 말은 크로스 존 접근 제약은 크로스 도메인 접근 제약에 우선한다는 걸 의미해요.

여튼 오늘도 한 건 해결. 이제 다른 일 해야지.

Posted by gongdo

실버라이트 2 RTW는 최종 사용자를 위해 디버깅 관련 어셈블리들이 제거된 약 4.6메가 정도의 런타임이 배포 되죠.
하지만 개발자용 런타임은 이런저런 어셈블리들이 더 추가되어 있어서 약 6.5메가 정도로 배포 되고요.

만약 개발자가 개발자용 런타임을 설치하지 않고 일반 사용자용 런타임만을 설치한 경우 비주얼 스튜디오에서 디버깅으로 실행할 때 다음과 같은 메시지를 만나게 되죠.

Unable to start debugging. The Silverlight managed debugging package isn't installed.

그럼 개발자용 런타임은 어디있냐고요?

기본적으로 Silverlight 2 Tools for Visual Studio(Silverlight_Tools.exe)를 설치하면 SDK와 다른 패치들과 함께 개발자용 런타임이 설치되죠. 그러나 이 과정은 정말로 오래 걸리므로 그냥 개발자용 런타임만 따로 얻으려면 다음의 링크에서 받으면 돼요.

http://go.microsoft.com/fwlink/?LinkId=127693

그런데 위의 링크는 Silverlight_Tools.exe의 압축을 푼 후 그 안에 있는 ParameterInfo.xml 파일을 열어서 얻을 수 있었는데요, 구글에서 Silverlight 2 Developer Runtime으로 검색하면 위와는 다른 링크를 던져주는군요.

http://go.microsoft.com/fwlink/?LinkId=119972

어느게 맞는 건지는 모르겠는데 아무래도 위쪽의 링크가 더 정확하겠죠?
정확히 아시는 분 제보를 바랍니다. :)

P.S.
런타임 다시 깔 때 꼭 Visual Studio를 닫아 두세요. 가끔 띄워 놓은 상태에서 런타임 깔다가 비주얼 스튜디오가 죽을 때가 있어요.


Posted by gongdo
Belnd 2 SP1이 정식으로 릴리즈 되면서 우리 회사에서도 드디어 디자이너와 개발자의 협업이 제대로 시작되었죠. 바로 개발자가 만들어둔 커스텀 컨트롤을 디자이너가 블렌드로 상당히 자유롭게 디자인을 할 수 있기 때문인데요, 보통 블렌드에서 커스텀 컨트롤의 스킨을 변경할 때에는 해당 오브젝트에서 Edit a copy 메뉴를 통해 이미 존재하는 기본 템플릿을 복사하여 작업할 때가 많죠.

그런데 몇몇 커스텀 컨트롤들은 이런 기능이 정상적으로 동작하지 않더군요. 아무리 테스트를 해봐도 실행이나 다른 문제는 없는데 유독 스타일 카피만 실패하는 현상이 나왔어요.

첨부한 파일을 블렌드로 연 뒤 MediaPlayer, NewMediaPlayer 및 HappyPlayer를 각각 Edit a copy 를 사용하여 템플릿을 새로 만들어보면 MediaPlayer와 NewMediaPlayer는 기본 템플릿을 복사해 오는데 실패하지만 HappyPlayer는 성공하죠.

각 플레이어의 차이점이라고는 오직 템플릿을 구성하는 엘리먼트 중 하나만 다를 뿐인데요, 바로 그 구성요소들 또한 커스텀 컨트롤이에요. 그런데 그 구성요소들 조차 이름을 제외하고는 차이점이 없어요.

정말 이상하죠? 그런데 진짜로 이름에 따라서 문제가 생기는 걸로 보여요.
바로 커스텀 컨트롤의 이름이 'Extension'으로 끝날 때 그 컨트롤이 다른 부모 커스텀 컨트롤에 포함될 경우 부모 커스텀 컨트롤의 기본 템플릿을 블렌드에서 Edit a copy로 복사해 올 수 없다는 문제가 있는거죠.

이 문제는 실버라이트 포럼에 올렸고 Expression Blend Team에 이 리포팅을 전달한다고 하네요.
아주 심각한 문제점은 아니라서 근시일내에 패치가 나올 것 같지는 않으니 다른 분들은 단지 커스텀 컨트롤을 작성할 때 'Extension'으로 끝나는 이름을 피해주시기만 하면 돼요.

Further reading : http://silverlight.net/forums/p/38793/111618.aspx

Posted by gongdo
ivoryguard님이 오래 전에 이 문제를 제기했었죠.

Windowless Mode 시 TextBox에서 한글이 입력되지 않는 문제

- 베타2에서 이미 알려진 버그라 수정되었을 줄 알았는데 여전히 작동하지 않더군요. 다만... 제 경우에는 실버라이트 위에 일반 HTML 태그 이외에 ActiveX도 올렸는데 이게 영향이 있는지 모르겠네요.

실버라이트 포럼에 보면 같은 문제로 고민하는 (아마도)한국 분이 질문을 올렸더군요. 결과는 이것은 버그나 문제가 아닌 설계가 그렇다고 합니다. 실버라이트 프로그램 매니저 중 한 사람인 Mark Rideout씨에 의하면,

This is correct. For IME to work on the Windows platform we require the plug in to be in windowed mode (windowlessmode=false).

By design. You need to set Windowlessmode = false.
후우... 왜 그래야만 하는지를 물어봤는데 영어실력이 미천해서 그런지 답변은 두 번째 문장밖에 없더군요. 달랑 한줄 요약; 2시간 동안 고민해서 글을 썼다가 허탈감만...

어쨌든, Windowless 모드에서 IME를 지원할 생각은 전혀 없어 보이네요. 저 확고한 답변으로 봐서는요.
남은건 유저들이 알아서, 재주껏, workaround를 만드는 수 밖에요.
아마도 HTML 태그를 올리거나 key-stroke를 받아서 한글로 다시 조합하는 방법이 있을거에요.
어느 방법이든 괴롭긴 마찬가지지만요.

Further reading : http://silverlight.net/forums/p/35684/108519.asp
Posted by gongdo

실버라이트 2 RTW의 정확한 빌드 넘버는 2.0.31005.0 이죠.
과연 이 빌드 넘버는 어디에서 왔을까요?

우리가 14일에서야 받을 수 있었던 실버라이트 2의 릴리즈 런타임은 사실 10월 5일에 이미 완료가 되어 있었다는 사실! 두두둥!!
아마도 런타임 외에도 블렌드나 실버라이트 Tools 등의 조율 및 베타 테스팅에 시간이 필요했을 테니까요.

... 그럼 앞에 3은 뭥미? 고건 모르겠네요.
참고로 Beta 1은 2.0.30226이었고
Beta 2는 2.0.3.0523.6이었죠^^

further reading : http://silverlight.net/forums/t/37344.aspx

Posted by gongdo

실버라이트 2 RC0이전 버전(베타1, 베타2)로 서비스를 만들었거나 근시일 내에 릴리즈할 분들은 지금 당장 http://silverlight.net/GetStarted/에서 필요한 도구를 다운 받으세요 :D

현재 실버라이트 2는 이미 RTW(Release To Web) 상태이지만 아직 개발 도구는 RC1에 머무르고 있어요. 정식 개발도구는 몇 일 이내에 릴리즈 될 거에요.

또한 Expression Blend 2 SP1 역시 preview 딱지를 떼고 나왔고 DeepZoom Composer도 10월 13일자로 릴리즈 되었으니 확인해 보세요.

고고씽!

[추가]
참고로 실버라이트 2 런타임의 배포 용량은 단 4.6MB이고 설치 완료된 용량은 언인스톨러에서 확인해보면 대략 12MB 정도에요.

[추가 ; 인증샷!]


Posted by gongdo
컨퍼런스 콜 시작
처음엔 그냥 걸었어... 관두죠 -_-;
한번쯤 해보고 싶었는데 전화번호가 00798로 시작해서 유료 국제전화인줄 알고 스카이프 깔고 만원씩이나 결재해놓고 만반의 준비를 해뒀는데... 알고보니 00798은 무료전화고 스카이프에서는 이 전화번호로 걸 수 없더군요. 오밤중에 뭔 삽질이야 이거...

여튼 궁금해서 걸어봤어요. 시작부터 충격과 공포가 몰려오더군요.
그게 이 전 글에서 패스코드로 "Silverlight"를 말해야 한다고 했죠? 전 당연히 음성 인식에 기반한 자동 응답일거라고 예상을 했는데요, 사람이 받더군요 뜨엇... ∑(=∇=)

후우... 처음에 걸고 뭐라고하자마자 "Silverlight" 한마디 내뱉고 가만히 있었는데 이게 가만 들어보니 자동응답이 아닌거였던 거죠. 뭐 이름이랑 회사 이름이랑 꽤나 귀찮게 물어보는데 갑작스레 당해서 무지 당황했어요. 처음엔 이름을 공도라고 말 했다가 성이랑 이름 따로 얘기하라고 해서 다시 본명을 말하고 회사 이름은 발음도 안되고 스펠링 불러주고 .... 아오 화끈 거려... -_-;

여튼 접속까지는 성공하고 잠시 대기하니 익숙한(?) 스캇 거쓰리의 목소리가 들려서 나름 안심하고 들었는데... 뭐 아시다시피 제가 영어실력이 한 미천해서 뭔소리 하는지 들리지는 않고 점점 소리가 멀어지면서 졸리기는 하고... 딱 고2때 국어 수업 듣는 기분이더라고요.

실버라이트 2 공식 릴리즈!
기본적으로 발표 내용은 예상했던(?) 실버라이트 2의 공식 릴리즈(RTW ; Release To Web)의 발표와 약간의 광고성 멘트 -뭐어... 메이저 업체들이 실버라이트 적용하고 지원하고 어쩌고...- 를 좀 날려주시고요. 네, 실버라이트 2 공식 릴리즈 버전이 미국 태평양 표준시(서머타임) 2008년 10월 14일(화)에 http://www.microsoft.com/silverlight에서 다운로드 가능할 거래요. 아마 우리 시간으로는 대략 15일 새벽 정도가 되겠지요.

실버라이트 2 공식 릴리즈와 함께 블렌드 2 SP1 및 실버라이트 개발 도구도 릴리즈 되는데요, 특징적인 것은 무료 비주얼 스튜디오인 비주얼 스튜디오 익스프레스 웹 버전용 실버라이트 개발 도구도 함께 출시된다는군요.

또한 조만간 Silverlight Control Pack(SCP)라는 이름으로 실버라이트의 빌트인 컨트롤들과 DockPanel, ViewBox, TreeView, Accordion 및 AutoComplete 등의 추가 확장 컨트롤을 Microsoft Permissive License로 공개할거래요. 그 뿐만 아니라 MSDN에서 XAML Vocabulary를 Open Specification Promise(OSP)하에 출판한다는데요, 솔직히 이건 뭔지 모르겠지만 여튼 서드파티 ISV 파트너들이 좀더 실버라이트 개발을 하는데 용이하게 만들어준다는군요.

eclipse4SL!
여기에 또 한가지, 이거야 말로 충격과 공포인데 자바에 익숙한 개발자를 위하여 이클립스에서 실버라이트를 개발할 수 있는 툴이 Microsoft Permissive License로 공개되었어요. 라이선스의 정체는 졸려서 찾아보기 귀찮네요. 여튼 이름하야 eclipse4SL! http://www.eclipse4sl.org/ 여기에서 자세한 내용을 살펴볼 수 있는데요, 아직 커뮤니티 프리뷰인 것 치고는 꽤 완성도 있는 모습(스크린 샷)을 보여주네요.

아쉽게도(?) eclipse4SL은 이클립스 IDE를 사용하긴 하지만 실버라이트를 Java로 개발 하는 것은 아니고 C# 및 javaScript를 사용하여 개발할 수 있게 되어 있어요. 저는 Java에 대해서는 일면식도 없지만 전에 자바 개발 꽤 오래했던 아저씨 보니깐 C# 코드도 금방 쓰시더군요. 제는 사실 Java 개발자와 C# 개발자을 가로막는 것은 다름아닌 IDE 습관의 차이가 아닐까 생각하고 있어요. 익숙한 IDE 환경이라면 설사 언어가 조금 다르더라도 개념이 유사한 C#가 Java의 차이는 금방 극복할 수 있을 거라고 봐요.

또한 기존 Java 개발자를 배려하는 지원으로 Java로 구축된 서버사이드와의 네트워킹을 더욱 쉽게 해주는 라이브러리와 도구를 제공할 거라는군요.

이 프로젝트는 마이크로소프트가 펀딩과 아키텍쳐 가이드 및 관리를 하고 Soyatec라는 곳에서 분석과 개발을 진행하는데요
, 어찌보면 이클립스는 비주얼 스튜디오의 경쟁자(?)라고 할 수도 있지만 결과적으로는 실버라이트라는 유연한 웹 플랫폼 구축에 이런 경쟁자까지 지원하고 이용할 수 있다면 실버라이트에 대한 접근 경로가 더욱 다양해지고 더 많은 가능성을 제공하게 되겠죠.

iPhone, Android, Linux, Chrome...
Q&A때 의외의 떡밥이 나왔는데요, 당연하게도 Silverlight on iPhone은 현재로서는 택도 없는 일이라고 하네요. 아시다시피 iPhone의 OS는 폐쇄적인데다가 브라우저에 플러그인 형태의 서드파티 제품을 올릴 생각도 없다는거죠. 플래시든 뭐든요. 하지만 미래에 어찌 될지도 모른다는 떡밥을 솔솔 뿌려주시는 센스. 아마도 그렇게 되면 플래시 라이트랑 함께 지원을 하게 되겠죠 뭐.

구글의 앤드로이드는 얘기가 다른게 개방형 OS를 채택한데다가 모든 개발자들에게 열려 있어서 사실 마음만 먹으면 앤드로이드에서 구동되는 실버라이트도 전혀 문제가 없겠죠. 이와 관련해서 리눅스에서 실버라이트를 구현하는 문라이트 프로젝트가 릴리즈를 향해 열심히 달리고 있다는 떡밥도 잊지 않고 던져주셨죠. 여러가지 문제가 있겠지만 일단 문라이트가 릴리즈되면 앤드로이드 위에 실버라이트가 올라가는 것은 시간 문제일거라고 생각해요.

구글 크롬의 현재 베타 버전에서는 실버라이트가 정상적인 렌더링을 하지 않는 문제가 있지만 이것은 조만간 고쳐지고 훌륭하게 동작할거랍니다. 이 부분은 의심할 여지가 없죠^^

어찌되었든,
Winded up anchor, the Silver will be a foot!

관련 링크
http://www.microsoft.com/presspass/press/2008/oct08/10-13Silverlight2PR.mspx
http://www.nathanbrouwer.nl/default.aspx?e=275
Posted by gongdo
http://www.microsoft.com/presspass/press/2008/oct08/10-10GuthrieSilverlightMA.mspx

스캇 거쓰리가 PDT, 태평양 표준시(서머타임)기준 2008.10.13 오전 9시에 열리는 마이크로소프트 컨퍼런스 콜에서 실버라이트와 관련된 중요한 발표를 할 것이라고 하네요. 과연 무슨 발표이길래 '중요한significant'이라고 하는걸까요? 아마 대충은 눈치 챌 수 있을 거에요. 이제 더 바빠질 거란걸 말이죠. ;D

한국 시간으로는 14일 오전 1시(맞나요?).
한국 지역 접속 번호는, 00798-14800-6607
...이거 무료전화 아니죠? ㅎㄷㄷ...

어쨌든 참석하기 위해서는 전화가 연결된 후 "Silverlight"라고 말해야 한다는데요, 아마도 음성 인식을 통한 패스 코드겠죠. 재밌겠네요. 전화 관련 제어는 제 전직이기도 해서요^^
Posted by gongdo
  • 먼저 다운로드는?

http://silverlight.net/GetStarted/sl2rc0.aspx

여기에서 Visual Studio Tools for RC0(Silverlight_Tools.exe)한방이면 관련 런타임은 죄다 설치할 수 있고요,
Expression Blend 2.5도 Expression Blend 2 SP1 RC0로 이름이 바뀐 것에 주목하세요.

  • 변경 사항은?

Mike Snow의 글초고속 날림 번역을 참고하세요.

  • 업데이트 된 내용은?

오랫만의 스캇구 횽님의 실버라이트 관련 포스팅을 참고하세요.

요약 하자면…

새로운 컨트롤

  • PasswordBox
  • ProgressBar
  • ComboBox
  • MessageBox

새로운 컨트롤 스킨

좀 더 깔끔해진 기본 스킨의 모양. 최종 버전에서는 더욱 쓸만한 모양이 되도록 노력한다는군요.

그리고 당연하게도 Beta2 –> RC0 –> RTM은 자동으로 업데이트 되므로 기존에 서비스를 하고 있는 제품이 있다면 미리미리 준비해야 해요.
정확하게는 Beta2->RTM의 경우 자동 업데이트 메시지가 나오지만 RC0의 경우 개발자를 위한 버전이므로 엔드 유저에게 배포해서는 안된다는군요! 오해 없으시길!!

Posted by gongdo

먼저 당연하겠지만 지금은 영문 버전에서만 되니깐 한글 버전 Visual Studio 에서 왜 안되냐고 땡깡부리지 마세요 :)
내용 엄청 기니까 Ctrl+F를 활용하시길. 웬만하면 영어 문서 참고하시고요.

더보기

Posted by gongdo

헉… 아무런 예고도 없이 갑작스럽게… 후덜덜…

http://silverlight.net/blogs/msnow/archive/2008/09/25/silverlight-version-2-rc0-released.aspx

여기에 필요한 Visual Studio 2008 Tools for RC0, Runtime, Blend를 받을 수 있어요.
자세한 리뷰는 써보고 올리지요. :D

업데이트!
2008/09/26 11:50 현재, 위의 링크는 사라져서 보이지 않게 되었네요.
과연 무슨 일이 있었던 걸까요!!

Posted by gongdo

왜 파워포인트 같은 데에서 애니메이션 만들다 보면 시계방향으로 보여주기 같은 거 있죠?
한번 실버라이트로 만들어봤는데 스토리보드만으로 만드는 것은 영 마음에 들지 않더군요.

우선 작동 완구와 소스 코드 부터…

시계 방향으로 회전하는 클리핑 애니메이션을 구현 하는 방법은 여러가지가 있는데요, 그 중에서 저는 삼각형 4개를 사용하여 순차적으로 삼각형의 한 꼭지점이 이동하는 방식을 사용했어요.

Clip 속성을 PathGemetry로 설정하고 그 안에 4개의 삼각형 Path를 통해 목표 엘리먼트를 사분면으로 분할했죠. 만약 특정 사분면을 완전히 보이지 않게 하려면 삼각형의 한 꼭지점을 다른 꼭지점과 겹쳐놓으면 되고 완전히 보이게 하려면 한 꼭지점을 두 선분이 직각을 이루도록 옮기면 되죠.

위의 작동 완구를 보시면 알 수 있듯이 왼쪽의 애니메이션은 클리핑의 진행속도가 일정하지 않은 것을 알 수 있어요. 왼쪽의 애니메이션은 다음과 같은 방법으로 작동해요.

1사분면에 있는 삼각형이 단순하게 첫번째 꼭지점에서 두번째 꼭지점으로 직선적으로 이동을 하는거죠.

이 방법의 장점은 오직 블렌드만 가지고도 비교적 간단하면서도 효과적으로 시계 방향 회전 애니메이션을 구현할 수 있다는 것이고요, 단점은 앞서 얘기한 것처럼 중앙부분에서 가장 빠르고 양 끝에서 살짝 느려지는 현상이에요.

이 문제를 해결하려면 다음과 같이 삼각형의 꼭지점이 원궤도를 따라서 이동하게 해야 하죠.

OnEnterFrame, Gameloop와 같은 FPS엔진을 하나 돌리고 매 프레임 마다 특정 좌표(중심점)를 기준으로 회전하는 좌표를 계산하여 각 삼각형을 이루는 클리핑 Path의 점을 이동하면 되죠. 공식은… 솔직히 수학에 젬병이라 모르겠고 ‘회전 좌표 계산’등으로 검색하면 공식과 함께 매우 간단한 소스코드도 널려 있어요. 허접하지만 제 코드를 참고할 수도 있겠고요.

물론 후자가 정확한 속도로 움직이므로 더 완벽하다고 할 수 있겠지만 추가적인 코드 작업이 필요하다는 단점이 있죠. 그래서 간단하게 ContentControl로 시계 방향으로 회전하면서 클리핑하는 패널을 만들어 봤어요. 사용 법도 간단해서 XAML에서도 사용 가능하죠.

<CircularClipper Duration="00:00:04" IsActivated="True">
    <Grid>
        <!—넣고 싶은 모든 종류의 비주얼 -->
    </Grid>
</CircularClipper>

그렇지만 딱 한번 쓰고 말거라면 그냥 스토리보드로 만드는 것도 나쁘지 않을 것 같아요. 무엇보다 머리 안쓰고 금방 만들 수도 있으니까요.

언제나 그렇지만, 테스트 해 보시고 더 좋은 방법이 있다면 공유해보아요~ ^^

Posted by gongdo


티스토리 툴바