'Don't Panic'에 해당되는 글 13건

  1. 2009.06.04 Collection 바인딩과 InvalidOperationException 1
  2. 2009.03.11 AG_E_UNKNOWN_ERROR [Line: # Position: #]가 나오는 현상 중 하나
  3. 2008.12.29 Silverlight Bugs and Workarounds
  4. 2008.11.25 FontSource 설정시 주의!!! 1
  5. 2008.10.27 VisualStudio 에서의 미리 보기 에러
  6. 2008.08.14 (Firefox에서) 실버라이트 런타임 또 깔으라고 나오는 경우 중 하나!
  7. 2008.07.14 MediaElement 의 BufferingTime 속성
  8. 2008.07.14 값이 예상 범위를 벗어났습니다. 1
  9. 2008.07.11 [XamlParseException] 유효한 Converter를 지정하지 않은 DependencyProperty
  10. 2008.07.11 [XamlParseException] 시리즈 예고
  11. 2008.07.04 [Beta1->Beta2] 블렌드에서 An Exception was thrown 에러 발생 시!
  12. 2008.06.21 [삽질을덜하자!] FullScreenChanged Event 너무 믿지 마세요.
  13. 2008.06.12 쫄지마세요. VisualStateManager.VisualStateGroups 에러...
2009. 6. 4. 21:58

Collection 바인딩과 InvalidOperationException

원문 : http://gilverlight.net/3069

실버라이트 어플리케이션을 개발하다보면,
ListBox의 ItemsSource와 List<>나 Collection<>과 같은 IEnumerable류를 바인딩 할 경우가 자주 있습니다.

휴즈플로우에서 진행한 최근 프로젝트 중에서 MVVM 패턴으로 개발한 어플리케이션이 있는데요.
ListBox와 Collection류의 프로퍼티가 바인딩하게 되는 여러 뷰들을 빠른 속도로 전환하다보면,
InvalidOperationException이 발생하였습니다.



Exception에 담겨있는 에러메세지는 "개체의 현재 상태 때문에 작업이 유효하지 않습니다."라는 애매한 메세지였고,
예외가 발생한 곳은 뷰모델의 베이스용으로 구현해 놓은 ViewModelBase의 OnPropertyChanged(...) 함수 내부였습니다.

어플리케이션을 천천히 여유있게 조작하면 문제가 발생하지 않다가, 악의적인 유저로 돌변하여 UI를 이리저리 정신없이
전환시키다 보면 발생하는 Exception인데 해결하기가 여간 어려운게 아니더군요.

이 애매한 문제는 결국 파티션 너머의 공도씨를 호출하여 도움을 받아 해결하였습니다.

수술 전 코드와 수술 후 코드를 보시면서, 어떤 코드가 더 안전한지 이해하실 겁니다.

수술전
01.public List<PHOTO> Photos
02.{
03.    get
04.    {
05.        return _photos;
06.    }
07.    set
08.    {
09.        _photos = value;
10.  
11.        OnPropertyChanged("Photos");
12.    }
13.}


수술후
01.public List<PHOTO> Photos
02.{
03.    get
04.    {
05.        return _photos;
06.    }
07.    set
08.    {
09.        if (_photos != null)
10.        {
11.            _photos.Clear();
12.            _photos = null;
13.        }
14.  
15.        _photos = value;
16.  
17.        OnPropertyChanged("Photos");
18.    }
19.}


콜렉션을 통째로 새 객체로 덮어쓰더라도 전에 사용하고 있던 콜렉션을 Clear해 주고, 변수를 null로 초기화해주면
이런 일이 발생하지 않습니다. 정말 바인딩에서 발생하는 문제들은 타이밍에 관련된 것도 있고 오묘해서 해결하기가
쉽지 않은데 노련한 공도씨가 단박에 해결해 주었네요.

이런 팁은 내용을 이해한 후에 습관화하는 것이 좋을 것 같습니다.


2009. 3. 11. 18:06

AG_E_UNKNOWN_ERROR [Line: # Position: #]가 나오는 현상 중 하나

특히 커스텀 컨트롤을 만들때 종종 만나는 에러. 자세한 에러가 없으니 대책이 없죠 정말.
AG_E_UNKNOWN_ERROR 에러의 원인은 여러가지이지만 이 중 하나는 다음과 같습니다.

/themes/generic.xaml에 커스텀 컨트롤의 기본 스타일을 지정할 때
Setter의 Property 이름을 잘못 설정한 경우 100% 이 에러가 발생하죠.

ex) 이 상황에서 MyControl이 NotExistsProperty라는 프로퍼티를 가지고 있지 않으면 위의 에러가 발생.
<Style TargetType="my:MyControl">
<Setter Property="NotExistsProperty" Value="1" />
</Style>

2008. 12. 29. 11:21

Silverlight Bugs and Workarounds

http://blogs.msdn.com/silverlight_sdk/pages/silverlight-bugs-and-workarounds.aspx

잊지 말자 버그들..!!

얼마전에 아무 생각없이 고생한 부분이 있어 이렇게 링크를 걸어놉니다. 

정리하자면.

1. MultiScaleImage.AspectRatio 가 Custom MultiScaleTileSource를 썼을 경우 정확하지 않다는 것.
2. Mac에서 Safari3나 FireFox3로 MBR(Multi Bit Rate) Video Play시 Freezing.
3. Custom Control에 ScrollViewer.VerticalScrollBarVisibility/HorizontalScrollBarVisibility 속성 추가가 안됨.
4. 동적으로 Image 추가,삭제시 메모리 누수현상(제거시 Image.Source = null 로 셋팅)
5. 많은 컨트롤을 동시에 에니메이션할 경우 StackOverFlowException 발생. (Dispatcher.BeginInvoke를 통한 VisualStateManger.GotoState 호출)
6. 낮은 Bandwidth에서 Media를 빠르게 Seeking시의 깨짐 현상.
7. ImageSource나 ImageBrush 에 event 설정시 메모리 누수.(event listener 들 제거)
8. 파이어복스에서는 3GB 이상의 화일은 앞으로 Seek 가 되지 않음.
9. MAC에서는 3.5GB이상의 큰 화일은 Play가 되지 않음.(브라우저 지원문제)
10. BrowserHttpWebRequest 의 AllowReadStreamBuffering 속성이 false로 되어 MediaElement의 Source로 Stream 되는 경우 플레이 되지 않음.(AllowReadStreamBuffering를 true로 설정)
11. FireFox에서 '%'를 쓴 width,height 는 먹지 않음.
12. Brush를 상속받을 순 있으나 사용할 순 없음.(Brush는 상속받아서 쓰지 않는다.)

6번의 경우 얼마전에 저희 프로젝트에서도 문제가 되었는데... 원문에서는 ProgressDown에서 발생한다고 되어있는데실제로 Streaming의 경우에도 발생하였습니다. WorkAround 도 MediaFailed 이벤트시 Source를 다시 설정하고 예전 Position으로 다시 설정하면 된다고 되어있는데 Stream의 경우에는 MediaFailed 이벤트도 들어오지 않고 그냥 Closed 이벤트가 들어오더군요.

  그래서 제가 생각한 WorkAround는 Seek를 빨리 하지 못하도록 하는 것입니다. 한 0.3-0.5 초 정도의 지연만 주면 사용하기도 불편하지 않고 위와 같은 문제도 발생하지 않더군요.

  그럼 모두 삽질 금지..^^

                                                                                                                  - smile -
2008. 11. 25. 23:11

FontSource 설정시 주의!!!


FontSource 를 셋팅하는 방법은 다음과 같습니다.

tbText.FontSource = new FontSource(stream);

여기서 stream은 보통 폰트 화일을 압축한 zip화일을 WebClient로 불러와서 설정해주게 되죠.

여기서 주의 할 점.

Font 화일이 화일명이 한글 화일이면 폰트가 제대로 적용안된다는 것입니다.

쉽게 말해.

'나눔고딕.ttf' 이런 화일을 압축해서 "NanumGothic.zip" 화일로 압축했다고 하면.

이 zip 화일의 stream 을 FontSource에다가 넣어준 경우 Font stream을 제대로 얻어오지 못한다는 것입니다.

'NanumGothic.ttf'로 화일명을 변경후 압축해서 WebClient를 통해 Stream을 받으면 정상 작동하게 되죠..^^

그럼 모두 삽질 금지!!!!

-  smile -
2008. 10. 27. 14:55

VisualStudio 에서의 미리 보기 에러


비쥬얼 스튜디오를 쓰다보면 가끔 이런 에러가 뜰 때가 있습니다.

Error 1 요소 UserControl1에 알 수 없는 Margin 특성이 있습니다. [Line: 716 Position: 37] D:\DevTest\StyleTest\StyleTest\Page.xaml 6 25 StyleTest

그런데 실행은 잘 되죠.

테스트 결과.

App.Xaml에서 스타일이 정의가 되어 있고, 그 스타일을 사용한 객체를 A라고 하고,
A를 포함한 어떤 유저컨트롤을 B라고 가정합니다.

이때 유저컨트롤 B를 가지고 있는 객체 C를
비주얼 스튜디오에서 미리보기 하는 순간 위와 같은 에러를 반환합니다.



Preview상의 버그이고 프로그램에는 전혀 지장을 안 주는 것 같으니 무시합시다. --;;

                                                                                                                                          - smile -

예제를 첨부하죠.

2008. 8. 14. 11:26

(Firefox에서) 실버라이트 런타임 또 깔으라고 나오는 경우 중 하나!

원문 : 길버라이트 (http://gilverlight.net/2917)

조금 황당한 경우입니다.
이런 문제를 마주치시더라도 당황하지 마세요.

아시는 바와 같이 Visual Studio에서 실버라이트 프로젝트를 생성하면
*.aspx 와 *.html 견본페이지가 생성됩니다.

특히 *.html 페이지에 보면 object를 사용하여 실버라이트를 호스팅하는
부분이 있습니다.

보통 아래와 같습니다.

<object data="data:application/x-silverlight," type="application/x-silverlight-2-b2" width="100%" height="100%">
   <param name="source" value="ClientBin/ZoomPanningContainerSample.xap"/>
   <param name="onerror" value="onSilverlightError" />
   <param name="background" value="white" />
   
   <a href="http://go.microsoft.com/fwlink/?LinkID=115261" style="text-decoration: none;">
        <img src="http://go.microsoft.com/fwlink/?LinkId=108181" alt="Get Microsoft Silverlight" style="border-style: none"/>
   </a>
  </object>

첫줄에 제가 빨간 색으로 표시한 부분이 보이시나요?
object태그의 data 속성이 data:application/x-silverlight,입니다.

끝에 ,(comma)가 있습니다. 이거 함부로 없애시면 안됩니다. ^^;;;

IE에서는 문제 없습니다. 하지만 Firefox에서는 저 comma 함부로 떼면,
실버라이트 런타임을 또 깔으라고 하네요.

이.상.하.죠? ^^


결론

실버라이트를 위한 object 태그 data 속성인 data:application/x-silverlight,에서
(당분간은 말이죠.) 마지막의 ,(comma)를 함부로 제거하지 맙시다.

2008. 7. 14. 23:23

MediaElement 의 BufferingTime 속성


또 한 번의 삽질이 포스팅이 되는 군요.

일단은 짧막하게 포스팅하겠습니다.

MediaElement에 BufferingTime 이란 Property가 새로 생겼습니다.

전에 잠깐 이게 무얼까 잠깐 고민한적이 있었는데 기능 구현 상 별로 문제가

안되어서 그냥 넘어갔었죠...

 그런데 BuffertingTime은 바로  버퍼링 가능 시간 혹은 버퍼링 제한 시간이었습니다.

 MediaOpened 에서 확인하면 기본 값은 5초라는 것을 확인할 수 있습니다.


  여기서 BufferingTime을 너무 작은 숫자 예를 들어 0으로 셋팅해보리면 버퍼링이

아예 일어나지 않게 되죠.. 그러면 결국 다운로드 받은 부분만 플레이가 되는 상태가

되어버리죠..


   흠... 다들 알고 있었나요?... (나만 모른겨~)

  암튼 한마디로 정리하자면. BufferingTime을 0 혹은 너무 작은 숫자로 셋팅하지 말자는

것이었습니다. 혹은 이렇게 셋팅해도 안되겠죠.
myMediaElement.BufferingTime = new TimeSpan();

그럼 오늘도 모두 즐거운 삽질을...^^;;;

                                                                                               - smile -

2008. 7. 14. 10:33

값이 예상 범위를 벗어났습니다.

  '값이 예상 범위를 벗어났습니다.'

 이 error 또는 다음 과 같은 에러.

사용자 삽입 이미지

이 에러는 이미 부모를 가지고 있는 객체가 또다시 Children Add 가 되었을 때

일어납니다.


예외적으로 ItemsControl의 경우 Item으로 셋팅된 UI 객체가 다시 한번 Item으로

셋팅되거나 Children.Add 되는 경우에 발생할 수 있습니다.


  이것은 버그성으로 보이나 ItemsControl(ex. ListBox) 에서 Items로 셋팅된

UI객체는 부모가 다시 재설정 될 수 없습니다. 위에 에러가 발생합니다. 주의하세요.

쉽게 말해 다음과 같은 코드는 작성하지 말라는 이야기입니다.

            Rectangle rc = new Rectangle();           
            MyListBox.Items.Add(rc);
            MyListBox.Items.Remove(rc);
            MyListBox.Items.Add(rc);


                                                                                           - smile -
2008. 7. 11. 15:26

[XamlParseException] 유효한 Converter를 지정하지 않은 DependencyProperty

배경
DependencyProperty는 템플릿 바인딩이나 데이터 바인딩 등 다양한 환경에 필수이고 특히 XAML과 코드를 연결하는 가장 중요한 컨셉이라고 할 수 있죠.

XAML은 Plain Text로 구성된 XML이기 때문에 모든 속성을 '문자열'로 설정하게 되고 이는 타입 안정성에 기반한 닷넷 언어들에 곧바로 적용할 수 없다는 것을 의미해요. 때문에 XAML과 코드 비하인드와의 속성 공유를 위해서는 필연적으로 문자열과 타입간의 변환Convert이 필요한데요, 바로 TypeConverter를 상속하는 어트리뷰트 클래스와 IValueConverter를 상속하는 클래스를 통해 가능하게 되죠. 각 변환 클래스에 대한 설명은 MSDN을 참고하세요.

변환 클래스가 필요한 타입
실버라이트의 런타임은 기본적으로 빌트인 타입(int, double, Thickness 등...)에 대한 변환은 자동으로 수행하지만 사용자가 생성한 모든 종류의 enum, class, struct는 원칙적으로 변환 클래스를 반드시 지정해야 해요. 보다 자세한 사항은 TypeConverter를 참고하세요.

2008. 7. 11. 15:10

[XamlParseException] 시리즈 예고

XamlParseException은 굉장히 다양한 Xaml 코드 상의 예외를 말하는데요, 실버라이트 2 베타2부터는 친절하게도 예외(에러)가 발생한 경우 에러가 발생한 XAML의 라인과 컬럼 번호를 알려주죠.

그러나 generic.xaml이나 동적으로 로드한 xaml로 설정한 템플릿 등에서 오류가 발생한 경우 일반적으로 실버라이트 RootVisual의 생성자에 있는 InitializeComponent() 메서드에서 에러가 걸리고 해당 라인과 컬럼을 가보면 해당 템플릿을 사용한 컨트롤을 가리키고 있음을 알 수 있어요.



XamlParseException은 알고 보면 대부분 사용자의 실수이지만 프리컴파일이 되지 않는 XAML의 특성상 사전에 그 문제를 찾아내기란 쉽지가 않고 코드-비하인드에 비해 알려주는 지점이 모호한 경우가 많죠.

이 시리즈는 XamlParseException의 원인이 될 수 있는 다양한 경우에 대해 차근차근 정리하고 충분한 케이스가 모이면 XamlParseException이 발생했을 때의 대응 매뉴얼로 만들 예정이에요.

XamlParseException을 해결한 경험이 있으시면 제보 바랍니다. ^^
2008. 7. 4. 09:38

[Beta1->Beta2] 블렌드에서 An Exception was thrown 에러 발생 시!

Beta1에서 잘 작동했던 프로젝트,
Beta2에서 블렌드로 열었을 때 이런 화면 보신 적 있으시죠?

사용자 삽입 이미지


당황하실 필요없습니다.
UserControl에 대한 XML의 namespace가 변경되어서 그런 것 뿐이예요.

자, XAML 코드뷰로 가셔서 UserControl의 Attribute를 다음과 같이 변경하세요.

수술 전
<UserControl x:Class="HugeProject.Gilbert"
    xmlns="http://schemas.microsoft.com/client/2007"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" ...>

수술 후
<UserControl x:Class="HugeProject.Gilbert"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"

이렇게 하시면 Blend에서 미리보기 아주 자~알 나옵니다.

감사합니다.
2008. 6. 21. 11:18

[삽질을덜하자!] FullScreenChanged Event 너무 믿지 마세요.

개요

오늘은 Application.Current.Host.Content.FullScreenChanged 이벤트에 대해서
한 말씀드리려고 합니다.

실버라이트 2 버전에서부터 Grid 등의 등장과 함께 화면구성하기가 용이해 졌습니다.
예를들어 LayoutRoot의 Width, Height를 Auto로 설정하고,
HorizontalAlignment, VerticalAlignment를 Stretch로 설정하고,
Margin 적당히 주면, 어떤 화면 사이즈에서도 척척 알아서 변하는 UI로 꾸밀 수 있죠.

FullScreen Mode에서는 어떨까요?
네! 화면이 FullScreen이 되면 위에 언급한 것과 같이 구성된 UI는
전체화면 사이즈에 맞게 변화합니다.

하지만 여기에 시차가 존재합니다.

FullScreenChanged 이벤트 핸들러 함수에서 어떤 UIElement의 ActualWidth, ActualHeight
등 사이즈에 관련된 프로퍼티를 참조하는 것은 바람직하지 않습니다.

그 이유를 실험을 통해 알려드리겠습니다.

다운로드 : 실험을 위한 샘플 프로젝트


실험방법

사용자 삽입 이미지

50ms의 Interval로 설정된 DispatcherTimer가
ScrollViewer와 LayoutRoot, Application.Current.Host.Content의 Width를 출력합니다.

FullScreenChanged 이벤트 핸들러에서, [IsFullScreen = true / false]를 출력합니다.

샘플 어플리케이션이 실행되면, FullScreen On/Off 버튼을 눌러 전체화면으로 갔다가,
ESC 키를 눌러 전체화면을 해제한 다음 Stop Timer를 눌러 타이머에 의한 출력을 중단합니다.


실험결과

사용자 삽입 이미지
실험 결과를 보면 'FullScreen Mode가 전환되는 시점'에서
Application.Current.Host.Context.ActualWidth를 제외한 다른 UIElement의 ActualWidth는
바람직한 사이즈 값을 갖게 되는데 시간 지연이 있음을 알 수 있습니다.


결론

FullScreen 전환에 따라 변화한 UIElement들의 사이즈를 참조하려면,
Application.Current.Host.Content.FullScreenChanged 이벤트 핸들러 보다는

SizeChanged 이벤트 핸들러에서 Application.Current.Host.Content.IsFullScreen의
분기문을 작성하여 구현하는 것이 안전하다.
2008. 6. 12. 18:35

쫄지마세요. VisualStateManager.VisualStateGroups 에러...

compile도 잘되고 run도 잘되는데 에러 메세지만 뜨는 군요.

포럼에 들어가보니 비주얼스튜디오 팀이 열심히 고치고 있다고

그동안 블랜드로 스타일을 정의하라고 하더군요..^^;;

쫄지말고 그냥 욕만하면서 블랜드로 디자인 합시다.^^;;



  그리고 참고로... 블랜드에서 app.xaml에 스타일을 바로 등록하면 그 상태로

하얀세상으로 날라갑니다.^^

 아직은 갈길이 먼 beta2 입니다.^^


 ㅋㅋ.. 첫글이다..