'Silverlight2'에 해당되는 글 11건
- 2008/03/25 웹서비스 호출
- 2008/03/16 한 Silverlight Page 내에서 정상작동하는 MediaElement의 개수는 123개다.
- 2008/03/14 훈스닷넷 8회 정기 세미나 - 닷넷과 함께하는 차세대 웹 전략 (1)
- 2008/03/12 QuadTree (1)
- 2008/03/12 Silverlight 2 디버깅 중 중단점 안먹을 때 시도해 볼 것
- 2008/03/08 Downloader 대신 WebClient (1)
- 2008/03/06 HtmlTimer 대신 뭘 쓰면 될까요? (2)
- 2008/03/06 Image.Source는 어떻게 쓰나
- 2008/03/06 BrowserHost야 어딜 간거니??? (4)
- 2008/03/06 와우!! SeaDragon을 위한 Deep Zoom Composer!!
- 2008/03/06 Silverlight 2 Beta1 is available!
어디선가 아래와 같이 비동기 호출을 하면, 가수 '비'의 동기가 나오지는 않죠? (^^;;; 죄송합니다.)
mySvc.MyWebService1 svc = new mySvc.MyWebService1();
AsyncCallback cb = new AsyncCallback(MyMethodCallback);
svc .BeginMyMethod(myParam1, myParam2, ... , cb, svc);
메서드가 수행된 후 아래와 같이 비동기 호출 콜백 함수(MyMethodCallback)가 수행되면서
EndMyMethod로부터 수행 결과를 받아써야 했습니다.
{
// mySvc : 웹 레퍼런스로 등록한 이름
mySvc.MyWebService1 pf = (mySvc.MyWebService1)ar.AsyncState;
// 수행 결과
string[] array = pf.EndMyMethod(ar);
ShowResult(array);
}
실버라이트 2
실버라이트 2에서는 이벤트 방식으로 변경이 되어, 일관성 있어지고, 사용이 쉬워졌습니다.
일단 Web Reference 가 Service Reference로 개념이 바뀌었습니다.
만든 Web Service를 Add Service Reference 하셔서 쓰시면 됩니다.
자신이 등록한 WebService Class 이름을 namespace로 하는 *SoapClient 인스턴스를 만들어 사용합니다.
// MyWSClass : 웹서비스 클래스
mySvc.MyWSClassSoapClient svc = new mySvc.MyWSClassSoapClient ();
svc.MyMethodCompleted += new EventHandler<MyWSProject.MyWSClass.MyMethodCompletedEventArgs>(_svc_MyMethodCompleted);
svc.MyMethodAsync(myParam1, myParam2, ...);
그럼 아래 이벤트 핸들러에서 결과를 받아서 씁니다.
{
// 수행 결과 에러 또는 취소 판단이 가능
if (e.Error != null || e.Cancelled == true)
return;
// 수행 결과 (e.Result)
ShowResult(e.Result.ToArray());
}
한 Silverlight Page 내에서 정상작동하는 MediaElement의 개수는 123개다.

예를 들어 어떤 곡에서 270여 개의 음원을 사용하는 이유로,
이 음원에 대한 MediaElement를 미리 270개 생성해 놓고 사용하고자 하였습니다.
그 곡을 재생시켜보자 군데군데 연주되지 않는 음이 발견되었습니다.
왜그런가 테스트를 해보다가 123번째 MediaElement 이후에 생성된
MediaElement들은 Play() 메서드가 제대로 작동하지 않는 것을
발견하였습니다.
시뮬레이션
다음은 직접 문제를 체험해 볼 수 있는 샘플입니다.
스피커를 켜고 테스트를 해 보십시오.
소스
아래 링크를 클릭하여 다운받으십시오.
실험의 결론
Silverlight 2 Beta1에서는 123개 이하의 MediaElement만 만들어 사용해야 합니다.
123개 이상의 MediaElement가 필요한 경우에는 이미 생성해 놓은 MediaElement를
Source만 변경하여 재활용해야 합니다.
예를들어 한 Silverlight Page 내에 123개를 초과하는 동영상, 음악이 존재하는 경우에는
초과분에 해당하는 미디어는 재생을 시킬 수 없습니다.
다른 테스트를 통해 다음과 같은 사실도 추가적으로 알 수 있었습니다.
1) XAML에 <MediaElement ...> 형태로 추가를 해도 124번째부터는 작동을 안 합니다.
2) MediaElement마다 서로 다른 Source를 입력해 주어도 결과는 같습니다.
원인이 무엇인지 궁금합니다.
원인에 따라 차후에 발표되는 Beta2나 정식 릴리즈에서
개선될 수도 있고, 개선되지 않을 수도 있겠네요.
포럼 피드백
실버라이트 포럼에도 같은 글을 게시해 놓고 피드백을 기다리고 있습니다.
http://silverlight.net/forums/t/11735.aspx
훈스닷넷에서 오랫만에 정기 세미나를 여네요. 그간 UX 커뮤니티 세미나에서도 매번 100여명 이상의 많은 분들이 열정적인 모습을 보여주셨는데요, 훈스닷넷에서는 UX 커뮤니티 세미나가 끝난 후에도 정기적인 세미나를 준비할 예정이에요.
이번 세미나에서는 MIX08 이후 열리는 최초의 커뮤니티 세미나로 특히 실버라이트 2.0에 대한 소개와 간단한 데모가 있을 예정이니 많은 참여바래요. :)
http://www.hoons.kr/seminarJoin.aspx
![]() | ||||||||||||||||||||||||||||||
| - 일시 : 2008년 03월 15일(토) 13시 00분 - 장소 : 한국마이크로소프트 (포스코 센터 5층) - 참가비 : 무료 - 세미나 신청: http://www.hoons.kr/SeminarJoin.aspx | ||||||||||||||||||||||||||||||
| 세미나 Agenda | ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
| 발표 내용 소개 | ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
| 진행자 소개 | ||||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
| 세미나 장소 | ||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||
| 경품안내 | ||||||||||||||||||||||||||||||
|
| ||||||||||||||||||||||||||||||
| 스폰서 | ||||||||||||||||||||||||||||||
![]() | ||||||||||||||||||||||||||||||
QuadTree 형식의 자료 구조가 구현되는 것이 바람직합니다.
예를들면 방대한 영역에 존재하는 데이터 중,
보이는 화면영역에 해당하는 데이터만 빨리빨리 찾아와야 할 때 유용합니다.
QuadTree는 4개의 자식을 갖는 트리구조입니다.
평면을 계속 4분할해 나가면서 트리가 구성됩니다.
1개의 Cell은 maximum capacity를 가지고 있어서, 그 값이 넘게 자식이 존재해야할
필요성이 있을 때 또 분할됩니다.
수직선, 수평선이란 자식까지 정의하여 총 6개의 자식을 갖도록 설계하는 경우도 있습니다.
(CAD/CAM 프로그래밍 할 때 그렇게 했었음.)
한번 이렇게 구성된(Build) QuadTree는 영역에 대한 검색을 실시 할 때,
유용하게 사용됩니다.
5년동안 MFC로 CAD/CAM 프로그래밍하는 동안 매일 만지작거려왔는데,
이제는 실버라이트에서도 사용하기 위해서 QuadTree를 C#으로 포팅할 때가 된 것 같습니다.
그전에 혹시 쓸만한 좋은 소스가 있는지 코드플렉스를 뒤져봤습니다.
XNA 관련된 소스만 찾을 수 있었습니다.
XNA에서는 QuadTree가 어떻게 활용되고 있는지
Youtube에 올라와 있는 데모 동영상을 보시죠.
사실 이 동영상에는 쿼드트리 이상의 것이 들어있어서 요점을 흐릴 수 있습니다만,
쿼드 트리가 없으면 퍼포먼스가 엄청 떨어지는 데모입니다.
ClientBin, bin 디렉토리 내용물 지우기,
'다시 빌드' 해보기,
VS2008 종료 후 재실행,
컴퓨터 리부팅
위와 같은 민간요법을 주로 애용 했었는데요.
이렇게 해도 안되면 Project를 아예 새로 만들었던 과격프로그래머!!!
웹사이트 속성에서 해결 할 수 있는 것을 공도님한테 배웠습니다.
속성창에서 Start Options 항목의 Debuggers Group에서
Silverlight 체크박스에 체크를 합니다.
(원래 이 항목은 실버라이트 기본프로젝트 만들 당시에 체크가 되어있습니다.
허나 무슨 이유에서인지 쓰다가 이런 문제가 있어서 보면 해제되어 있습니다. -_-;;;
해제되는 단축키라도 있는거야????)
모르면 손발이 두잇이죠... ^^
대신에 WebClient를 사용하시면 됩니다.
파일 전송을 위한 메서드로
OpenReadAsync과 DownloadStringAsync 두가지를 지원합니다.
OpenReadAsync
wc.OpenReadCompleted += new OpenReadCompletedEventHandler(wc_OpenReadCompleted);
wc.OpenReadAsync(new Uri("song.wma", UriKind.Relative));
이벤트 핸들러는 다음과 같이 사용합니다. (e.Result는 Stream)
void wc_OpenReadCompleted(object sender, OpenReadCompletedEventArgs e)
{
MediaElement media = new MediaElement();
media.SetSource(e.Result);
LayoutRoot.Children.Add(media);
media.Play();
}
DownloadStringAsync
특히 받아올 파일이 xml파일 등 Text 형식이면 이 메서드를 씁니다.
wc.DownloadStringCompleted += new DownloadStringCompletedEventHandler(wc_DownloadStringCompleted);
wc.DownloadStringAsync(new Uri("data.xml", UriKind.Relative));
이벤트 핸들러는 다음과 같이 사용합니다. (e.Result는 String)
void wc_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e)
{
XmlReader xr = XmlReader.Create(new StringReader(e.Result));
//...
}
네임스페이스
zip파일로 Packaging 해 놓고 Part를 뽑아 쓸 경우는 Microsoft Silverlight 2 SDK Help의
Microsoft Silverlight 2 SDK
- Silverlight 2 Beta 1 - Development with the .NET Framework
- Core Presentation Framework / UI
- Fundamentals
- Downloading Content on Demand
부분을 참고 하시기 바랍니다.
-
길버트 2008/03/21 17:24
제가 중간에 잘못 적은 내용이 있었네요.
media.SetSource = e.Result 를
media.SetSource(e.Result) 로 수정하였습니다.
System.Threading.Timer도 있고 System.Windows.Threading.DispatcherTimer도 있는데
이제 무얼 쓸까요?
HtmlTimer를 쓰시던 분은 DispatcherTimer를 사용하실 것을 권합니다.
사용방법이 똑같아서 변수 선언부만 찾아서 고치시고, Interval을 TimeSpan으로 수정하시면
컴파일 에러가 해결될 거예요.
timer.Interval = TimeSpan.FromMilliseconds(3000); // 3초
timer.Tick += new EventHandler(timer_Tick);
timer.Start();
HtmlTimer에는 아래와 같이 Obsolete가 선언되어 있어서 ,
컴파일 할 때마다 경고 뜨는게 보기 싫으셨죠?
public class HtmlTimer : IDisposable
이제 경고 받으시지 않으셔도 됩니다. ^^
image.Source = new BitmapImage(new Uri("http://hugeflow.com/HFLogo.jpg", UriKind.Absolute));
하지만 의미를 찾자면 BitmapImage에 DownloadProgress이벤트가 있다는 것!
이제 이미지가 다 받아졌는지 확인 할 때 Timer 안 써도 된다는 것!
BitmapImage bitmap = new BitmapImage(new Uri("http://hugeflow.com/HFLogo.jpg", UriKind.Absolute));
bitmap.DownloadProgress += new DownloadProgressEventHandler(bitmap_DownloadProgress);
이벤트 핸들러
void bitmap_DownloadProgress(object sender, DownloadProgressEventArgs e)
{
BitmapImage bitmap = sender as BitmapImage;
if (e.Progress == 1)
{
// 다 받아졌다!
}
}
네임스페이스
BrowserHost가 Application.Current.Host.Content로 대체됩니다.
Resized 이벤트는 이렇게
{
Width = Application.Current.Host.Content.ActualWidth;
Height = Application.Current.Host.Content.ActualHeight;
}
IsFullScreen도 여기서 찾을 수 있습니다.
네임스페이스는 아래 것을 사용합니다.
이올린에 북마크하기
이올린에 추천하기
MediaElementLimit.zip















