정말 오랜만에 강좌를 올립니다. 역시 일이 바쁘다 보니 블로그 관리할 시간이 제대로 없네요. 에궁~~
이번 강좌는 이전 강좌였던 다른 xaml파일 활용하기(http://blog.daum.net/sonstein/15706325)를 기반으로 확장시켜볼까 합니다.
이렇게 가정해 봅시다. 하나의 프로젝트 내에서 복수의 xaml파일을 이용해서 개발을 합니다. 그런데 xaml파일이 엄청 많을 경우에 개발자는 다수. 모든 개발자들이 하나의 프로젝트 파일을 이용해서 개발을 한다면 정말 프로젝트 관리가 엄청 힘이 들겠죠. 그렇다면 각자에게 맡겨진 프로젝트 파일을 이용해서 개발을 한다고 해도 결국 하나로 모으기 위해서도 엄청나게 많은 시간과 노력을 필요로 할 것입니다. 때문에 silverlight에서는 외부에서 작성된 XAP파일을 내부로 읽어 들일 수 있는 좋은 기능을 가지고 있습니다.
이번 강좌에서는 정말 심플하게 이러한 기능을 하나 만들어 보겠습니다.
프로젝트 명은 RemoteContentControl이라고 하겠습니다.
시작점인 Page.xaml의 레이아웃을 위의 그림과 같이 만듭니다. 소스는 아래를 참조하세요.
<UserControl x:Class="RemoteContentControl.Page"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Width="400" Height="300">
<Grid x:Name="LayoutRoot" Background="White" ShowGridLines="True">
<Grid.RowDefinitions>
<RowDefinition />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition MaxWidth="100" />
<ColumnDefinition />
</Grid.ColumnDefinitions>
<Button Content="Remote" Margin="5,5,5,5" Height="50" VerticalAlignment="Top" Name="btnRemote" Click="btnRemote_Click"></Button>
<Button Content="Local" Margin="5,60,5,5" Height="50" VerticalAlignment="Top" Name="btnLocal" Click="btnLocal_Click"></Button>
<ContentControl x:Name="Desktop" Grid.Column="1" />
</Grid>
</UserControl>
로컬의 XAML파일을 읽어 들이는 것과 리모트의 XAP파일을 읽어 들이는 두 개의 버튼을 만들었습니다.
로컬의 XAML파일을 읽어 오는 부분은 이전의 강좌를 참조하시면 되구요 이번에는 주로 원격지에 있는 파일을 읽어오는 것에 집중해서 하겠습니다.
새로운 SilverLight 프로젝트를 하나 만들어서 자유롭게 Page.Xaml을 만들어 보세요. 꼭 Page.Xaml 이라고 할 필요는 없습니다. 하지만 Xaml파일과 연결된 클래스명은 반드시 기억해 두세요. 나중에 사용하게 됩니다.
그리고 컴파일을 해서 생성된 XAP파일을 만듭니다.
Remote라는 버튼의 이벤트를 작성하고 본격적으로 코드를 만들어 갑니다.
원격지에 XAP파일이 존재한다는 것은 XAP파일을 로컬로 다운받아야 한다는 것을 의미합니다. 다운로드를 위해서 사용되어지는 WebClient라는 클래스가 있습니다. 이 클래스를 활용해서 다운로드를 하게 됩니다.
다운로드를 위한 자세한 설명은 이 곳(http://msdn.microsoft.com/ko-kr/library/cc189021(VS.95).aspx )을 참조하세요. 패키지 다운로드라는 부분이 있는데 샘플이 전혀 없네요 ^^; (이게 이 강좌를 만든 이유이기도 합니다.)
WebClient downloader = new WebClient();
downloader.OpenReadCompleted += new OpenReadCompletedEventHandler(downloader_OpenReadCompleted);
downloader.OpenReadAsync(new Uri(strXAPPath, UriKind.Relative));
OpenReadCompleted 이벤트는 OpenReadAsync함수를 호출했을 때 발생하게 됩니다. 즉 원격지에 존재하는 파일의 다운로드가 완료되면 발생을 합니다. 다운로드할 파일의 위치 지정은 OpenReadAsync함수의 파라미터에 지정하게 됩니다. 파라미터를 보면 URI 클래스입니다. 즉 XAP파일이 위치하는 웹의 경로를 지정하는 것을 말하죠.
저는 RemoteContent.xap라는 파일을 만들었습니다. 여기서 중요한 포인트. 반드시 파일을 ClientBin에 복사를 해야 합니다. 그리고 일단
strXAPPath = “RemoteContent.xap”;
로 작성해 주세요. 이 부분을 유동적으로 활용하기 위한 방법은 아래에 다시 설명을 해 두겠습니다.
URI클래스를 만들 때 파일명 경로와 이 경로가 절대경로인지 상대경로인지를 지정하게 됩니다. 여기서 절대경로를 지정하게 되면 에러가 발생합니다. MSDN에서도 상대경로로 지정하라고 나와있는데요. 음… 나중에 여기에 대해서 다시 썰을 풀어볼까 생각중입니다. 일단 위의 소스와 같이 작성을 하시고 나면 이제는 이벤트에 대해서도 코드를 구현해야 겠죠?
void downloader_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
Uri uri = new Uri(strXAPPath.Replace("xap", "dll"), UriKind.Relative);
StreamResourceInfo xapPackageStream = new StreamResourceInfo(e.Result, null);
StreamResourceInfo assemblyStream = Application.GetResourceStream(xapPackageStream, uri);
AssemblyPart assemblyPart = new AssemblyPart();
Assembly assembly = assemblyPart.Load(assemblyStream.Stream);
UserControl objUserControl = (UserControl)assembly.CreateInstance(strClassName);
if (objUserControl != null)
{
remotePages.Add(objUserControl);
this.Desktop.Content = remotePages[0];
}
}
StreamResourceInfo와 Application.GetREsourceStream은 도움말 파일을 활용해 보시면 아주 자세하게 설명이 되어 있습니다. 허접한 제가 설명하는 것보다 더 도움이 많이 될 것입니다.
여기서 체크하고 넘어가야 할 부분이 2가지 있습니다.
첫번째. strXAPPath.Replace("xap", "dll") 다운로드를 위해서는 xap까지 작성된 확장자가 필요하지만 xap내부에 있는 dll파일에 대해서 참조를 하기 위해서는 URI의 경로에 있는 xap파일의 명을 dll로 변경시켜 줘야 합니다. 왜 이 부분이 필요한지는 저도 아직 잘 모르겠지만 저의 삽질의 결과라고 생각해 주세요. --;
두번째. 클래스 이름에 대한 부분입니다. 앞에서 클래스 명을 기억하라고 한 부분이 있었죠? CreateInstance에 적용할 클래스명은 [어셈블리명.클래스명] 이런식으로 작성을 해야 합니다.
컴파일 해서 실행시켜 보면 아래와 같은 화면의 결과를 나타냅니다.
그런데 꼭 반드시 외부 XAP파일을 ClientBin폴더 이외에 두는 것은 가능한가요?
네 가능합니다. 웹 루트보다 상위로 갈 수는 없어요(아주 당연한 이야기지만…) 그 아래로는 얼마든지 가능합니다. 단 가능하게 하려면 WebClient 클래스의 속성가운데 BaseAddress가 있는데요. 이 속성은 기본적으로 컴파일 한 후에 배포된 웹의 주소를 가지게 됩니다. 이 속성을 수정하지 않으면 http://localhost/RemoteContentControl/ClientBin/RemoteContentControl.xap라는 값을 가지게 됩니다. (이 값은 각자의 개발 환경에 따라 조금씩 차이가 있을 겁니다.) 이 속성을 자신이 XAP파일을 두고자 하는 경로의 값으로 지정하면 조금은 자유롭게 설정을 하는 것이 가능합니다.
소스를 추가해 두었습니다. 다양하게 적용시켜 보세요.
'SilverLight' 카테고리의 다른 글
[실버라이트 팁] 크롬에서도 실버라이트가 가능하다. (0) | 2008.12.17 |
---|---|
[실버라이트 팁] 한글 도움말 나왔어요 ^^; (0) | 2008.12.11 |
[실버라이트 팁] 일본어 도움말이 나왔네요 (0) | 2008.11.13 |
[실버라이트 강좌]사용자 스플래쉬 스크린 (0) | 2008.10.29 |
[실버라이트 팁]실버라이트 툴킷 (0) | 2008.10.29 |