<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0">
	<channel>
		<title>Error 1001</title>
		<link>http://error1001.com/</link>
		<description>실버라이트를 하며 겪는 트러블 슈팅 및 간략한 팁을 수집하는 팀블로그.</description>
		<language>ko</language>
		<pubDate>Thu, 04 Jun 2009 21:59:02 +0900</pubDate>
		<generator>Tistory 1.1 (http://www.tistory.com/)</generator>
		<managingEditor>gongdo</managingEditor>
		<image>
		<title>Error 1001</title>
		<url><![CDATA[http://cfs8.tistory.com/upload_control/download.blog?fhandle=YmxvZzIwNDUwMkBmczgudGlzdG9yeS5jb206L2F0dGFjaC8wLzIuanBn]]></url>
		<link>http://error1001.com/</link>
		<description>실버라이트를 하며 겪는 트러블 슈팅 및 간략한 팁을 수집하는 팀블로그.</description>
		</image>
		<item>
			<title>Collection 바인딩과 InvalidOperationException</title>
			<link>http://error1001.com/54</link>
			<description>원문 : &lt;A href=&quot;http://gilverlight.net/3069&quot;&gt;http://gilverlight.net/3069&lt;/A&gt;&lt;br /&gt;
&lt;br /&gt;실버라이트 어플리케이션을 개발하다보면,&lt;br /&gt;
ListBox의 ItemsSource와&amp;nbsp;List&amp;lt;&amp;gt;나 Collection&amp;lt;&amp;gt;과 같은 IEnumerable류를 바인딩 할 경우가 자주 있습니다.&lt;br /&gt;
&lt;br /&gt;휴즈플로우에서 진행한 최근 프로젝트 중에서 &lt;STRONG&gt;MVVM 패턴&lt;/STRONG&gt;으로 개발한 어플리케이션이 있는데요.&lt;br /&gt;
ListBox와 Collection류의 프로퍼티가 바인딩하게 되는 여러 뷰들을 빠른 속도로&amp;nbsp;전환하다보면, &lt;br /&gt;
&lt;STRONG&gt;InvalidOperationException&lt;/STRONG&gt;이 발생하였습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;TABLE style=&quot;DISPLAY: inline; BORDER-COLLAPSE: collapse&quot;&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;IMG height=132 alt=&quot;&quot; src=&quot;http://cfile21.uf.tistory.com/image/185F740B4A27BFCC4E4834&quot; width=630&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;
&lt;br /&gt;Exception에 담겨있는 에러메세지는 &lt;STRONG&gt;&quot;개체의 현재 상태 때문에 작업이 유효하지 않습니다.&quot;&lt;/STRONG&gt;라는 애매한 메세지였고,&lt;br /&gt;
예외가 발생한 곳은 뷰모델의 베이스용으로 구현해 놓은 ViewModelBase의 OnPropertyChanged(...) 함수 내부였습니다.&lt;br /&gt;
&lt;br /&gt;어플리케이션을 천천히 여유있게 조작하면 문제가 발생하지 않다가, 악의적인 유저로 돌변하여 UI를 이리저리 정신없이&lt;br /&gt;
전환시키다 보면 발생하는 Exception인데 해결하기가 여간 어려운게 아니더군요.&lt;br /&gt;
&lt;br /&gt;이 애매한 문제는 결국 파티션 너머의 &lt;A title=&quot;[http://gongdosoft.com]로 이동합니다.&quot; href=&quot;http://gongdosoft.com/&quot; target=_blank&gt;&lt;FONT color=#adb50d&gt;공도씨&lt;/FONT&gt;&lt;/A&gt;를 호출하여 도움을 받아 해결하였습니다.&lt;br /&gt;
&lt;br /&gt;수술 전 코드와 수술 후 코드를 보시면서, 어떤 코드가 더 안전한지 이해하실 겁니다.&lt;br /&gt;
&lt;br /&gt;&lt;B&gt;수술전&lt;/B&gt;&lt;br /&gt;

&lt;DIV class=&quot;syntaxhighlighter &quot; id=highlighter_702718&gt;
&lt;DIV class=&quot;bar   &quot;&gt;
&lt;DIV class=toolbar&gt;&lt;A class=&quot;item viewSource&quot; title=&quot;view source&quot; style=&quot;WIDTH: 16px; HEIGHT: 16px&quot; href=&quot;http://gilverlight.net/#viewSource&quot; commandName=&quot;viewSource&quot; highlighterId=&quot;highlighter_702718&quot;&gt;&lt;FONT color=#adb50d&gt;view source&lt;/FONT&gt;&lt;/A&gt; 
&lt;DIV class=&quot;item copyToClipboard&quot;&gt;&lt;OBJECT id=highlighter_702718_clipboard title=&quot;copy to clipboard&quot; codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0 type=application/x-shockwave-flash height=16 width=16 classid=clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&gt;&lt;PARAM NAME=&quot;_cx&quot; VALUE=&quot;423&quot;&gt;&lt;PARAM NAME=&quot;_cy&quot; VALUE=&quot;423&quot;&gt;&lt;PARAM NAME=&quot;FlashVars&quot; VALUE=&quot;&quot;&gt;&lt;PARAM NAME=&quot;Movie&quot; VALUE=&quot;http://cfs.tistory.com/custom/blog/10/106870/skin/images/clipboard.swf&quot;&gt;&lt;PARAM NAME=&quot;Src&quot; VALUE=&quot;http://cfs.tistory.com/custom/blog/10/106870/skin/images/clipboard.swf&quot;&gt;&lt;PARAM NAME=&quot;WMode&quot; VALUE=&quot;Transparent&quot;&gt;&lt;PARAM NAME=&quot;Play&quot; VALUE=&quot;-1&quot;&gt;&lt;PARAM NAME=&quot;Loop&quot; VALUE=&quot;-1&quot;&gt;&lt;PARAM NAME=&quot;Quality&quot; VALUE=&quot;High&quot;&gt;&lt;PARAM NAME=&quot;SAlign&quot; VALUE=&quot;&quot;&gt;&lt;PARAM NAME=&quot;Menu&quot; VALUE=&quot;0&quot;&gt;&lt;PARAM NAME=&quot;Base&quot; VALUE=&quot;&quot;&gt;&lt;PARAM NAME=&quot;AllowScriptAccess&quot; VALUE=&quot;always&quot;&gt;&lt;PARAM NAME=&quot;Scale&quot; VALUE=&quot;ShowAll&quot;&gt;&lt;PARAM NAME=&quot;DeviceFont&quot; VALUE=&quot;0&quot;&gt;&lt;PARAM NAME=&quot;EmbedMovie&quot; VALUE=&quot;0&quot;&gt;&lt;PARAM NAME=&quot;BGColor&quot; VALUE=&quot;&quot;&gt;&lt;PARAM NAME=&quot;SWRemote&quot; VALUE=&quot;&quot;&gt;&lt;PARAM NAME=&quot;MovieData&quot; VALUE=&quot;&quot;&gt;&lt;PARAM NAME=&quot;SeamlessTabbing&quot; VALUE=&quot;1&quot;&gt;&lt;PARAM NAME=&quot;Profile&quot; VALUE=&quot;0&quot;&gt;&lt;PARAM NAME=&quot;ProfileAddress&quot; VALUE=&quot;&quot;&gt;&lt;PARAM NAME=&quot;ProfilePort&quot; VALUE=&quot;0&quot;&gt;&lt;PARAM NAME=&quot;AllowNetworking&quot; VALUE=&quot;all&quot;&gt;&lt;PARAM NAME=&quot;AllowFullScreen&quot; VALUE=&quot;false&quot;&gt;&lt;/OBJECT&gt;&lt;/DIV&gt;&lt;A class=&quot;item printSource&quot; title=print style=&quot;WIDTH: 16px; HEIGHT: 16px&quot; href=&quot;http://gilverlight.net/#printSource&quot; commandName=&quot;printSource&quot; highlighterId=&quot;highlighter_702718&quot;&gt;&lt;FONT color=#adb50d&gt;print&lt;/FONT&gt;&lt;/A&gt;&lt;A class=&quot;item about&quot; title=? style=&quot;WIDTH: 16px; HEIGHT: 16px&quot; href=&quot;http://gilverlight.net/#about&quot; commandName=&quot;about&quot; highlighterId=&quot;highlighter_702718&quot;&gt;&lt;FONT color=#adb50d&gt;?&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=lines&gt;
&lt;DIV class=&quot;line alt1&quot;&gt;&lt;CODE class=number&gt;01.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 0px! important&quot;&gt;&lt;CODE class=keyword&gt;public&lt;/CODE&gt; &lt;CODE class=plain&gt;List&amp;lt;PHOTO&amp;gt; Photos &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt2&quot;&gt;&lt;CODE class=number&gt;02.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 0px! important&quot;&gt;&lt;CODE class=plain&gt;{ &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt1&quot;&gt;&lt;CODE class=number&gt;03.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 28px! important&quot;&gt;&lt;CODE class=keyword&gt;get&lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt2&quot;&gt;&lt;CODE class=number&gt;04.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 28px! important&quot;&gt;&lt;CODE class=plain&gt;{ &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt1&quot;&gt;&lt;CODE class=number&gt;05.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 56px! important&quot;&gt;&lt;CODE class=keyword&gt;return&lt;/CODE&gt; &lt;CODE class=plain&gt;_photos; &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt2&quot;&gt;&lt;CODE class=number&gt;06.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 28px! important&quot;&gt;&lt;CODE class=plain&gt;} &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt1&quot;&gt;&lt;CODE class=number&gt;07.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 28px! important&quot;&gt;&lt;CODE class=keyword&gt;set&lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt2&quot;&gt;&lt;CODE class=number&gt;08.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 28px! important&quot;&gt;&lt;CODE class=plain&gt;{ &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt1&quot;&gt;&lt;CODE class=number&gt;09.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 56px! important&quot;&gt;&lt;CODE class=plain&gt;_photos = value; &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt2&quot;&gt;&lt;CODE class=number&gt;10.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 7px! important&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt1&quot;&gt;&lt;CODE class=number&gt;11.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 56px! important&quot;&gt;&lt;CODE class=plain&gt;OnPropertyChanged(&lt;/CODE&gt;&lt;CODE class=string&gt;&quot;Photos&quot;&lt;/CODE&gt;&lt;CODE class=plain&gt;); &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt2&quot;&gt;&lt;CODE class=number&gt;12.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 28px! important&quot;&gt;&lt;CODE class=plain&gt;} &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt1&quot;&gt;&lt;CODE class=number&gt;13.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 0px! important&quot;&gt;&lt;CODE class=plain&gt;}&lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;br /&gt;
&lt;br /&gt;&lt;B&gt;수술후&lt;/B&gt;&lt;br /&gt;

&lt;DIV class=&quot;syntaxhighlighter &quot; id=highlighter_587998&gt;
&lt;DIV class=&quot;bar           &quot;&gt;
&lt;DIV class=toolbar&gt;&lt;A class=&quot;item viewSource&quot; title=&quot;view source&quot; style=&quot;WIDTH: 16px; HEIGHT: 16px&quot; href=&quot;http://gilverlight.net/#viewSource&quot; commandName=&quot;viewSource&quot; highlighterId=&quot;highlighter_587998&quot;&gt;&lt;FONT color=#adb50d&gt;view source&lt;/FONT&gt;&lt;/A&gt; 
&lt;DIV class=&quot;item copyToClipboard&quot;&gt;&lt;OBJECT id=highlighter_587998_clipboard title=&quot;copy to clipboard&quot; codeBase=http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=9,0,0,0 type=application/x-shockwave-flash height=16 width=16 classid=clsid:d27cdb6e-ae6d-11cf-96b8-444553540000&gt;&lt;PARAM NAME=&quot;_cx&quot; VALUE=&quot;423&quot;&gt;&lt;PARAM NAME=&quot;_cy&quot; VALUE=&quot;423&quot;&gt;&lt;PARAM NAME=&quot;FlashVars&quot; VALUE=&quot;&quot;&gt;&lt;PARAM NAME=&quot;Movie&quot; VALUE=&quot;http://cfs.tistory.com/custom/blog/10/106870/skin/images/clipboard.swf&quot;&gt;&lt;PARAM NAME=&quot;Src&quot; VALUE=&quot;http://cfs.tistory.com/custom/blog/10/106870/skin/images/clipboard.swf&quot;&gt;&lt;PARAM NAME=&quot;WMode&quot; VALUE=&quot;Transparent&quot;&gt;&lt;PARAM NAME=&quot;Play&quot; VALUE=&quot;-1&quot;&gt;&lt;PARAM NAME=&quot;Loop&quot; VALUE=&quot;-1&quot;&gt;&lt;PARAM NAME=&quot;Quality&quot; VALUE=&quot;High&quot;&gt;&lt;PARAM NAME=&quot;SAlign&quot; VALUE=&quot;&quot;&gt;&lt;PARAM NAME=&quot;Menu&quot; VALUE=&quot;0&quot;&gt;&lt;PARAM NAME=&quot;Base&quot; VALUE=&quot;&quot;&gt;&lt;PARAM NAME=&quot;AllowScriptAccess&quot; VALUE=&quot;always&quot;&gt;&lt;PARAM NAME=&quot;Scale&quot; VALUE=&quot;ShowAll&quot;&gt;&lt;PARAM NAME=&quot;DeviceFont&quot; VALUE=&quot;0&quot;&gt;&lt;PARAM NAME=&quot;EmbedMovie&quot; VALUE=&quot;0&quot;&gt;&lt;PARAM NAME=&quot;BGColor&quot; VALUE=&quot;&quot;&gt;&lt;PARAM NAME=&quot;SWRemote&quot; VALUE=&quot;&quot;&gt;&lt;PARAM NAME=&quot;MovieData&quot; VALUE=&quot;&quot;&gt;&lt;PARAM NAME=&quot;SeamlessTabbing&quot; VALUE=&quot;1&quot;&gt;&lt;PARAM NAME=&quot;Profile&quot; VALUE=&quot;0&quot;&gt;&lt;PARAM NAME=&quot;ProfileAddress&quot; VALUE=&quot;&quot;&gt;&lt;PARAM NAME=&quot;ProfilePort&quot; VALUE=&quot;0&quot;&gt;&lt;PARAM NAME=&quot;AllowNetworking&quot; VALUE=&quot;all&quot;&gt;&lt;PARAM NAME=&quot;AllowFullScreen&quot; VALUE=&quot;false&quot;&gt;&lt;/OBJECT&gt;&lt;/DIV&gt;&lt;A class=&quot;item printSource&quot; title=print style=&quot;WIDTH: 16px; HEIGHT: 16px&quot; href=&quot;http://gilverlight.net/#printSource&quot; commandName=&quot;printSource&quot; highlighterId=&quot;highlighter_587998&quot;&gt;&lt;FONT color=#adb50d&gt;print&lt;/FONT&gt;&lt;/A&gt;&lt;A class=&quot;item about&quot; title=? style=&quot;WIDTH: 16px; HEIGHT: 16px&quot; href=&quot;http://gilverlight.net/#about&quot; commandName=&quot;about&quot; highlighterId=&quot;highlighter_587998&quot;&gt;&lt;FONT color=#adb50d&gt;?&lt;/FONT&gt;&lt;/A&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV class=lines&gt;
&lt;DIV class=&quot;line alt1&quot;&gt;&lt;CODE class=number&gt;01.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 0px! important&quot;&gt;&lt;CODE class=keyword&gt;public&lt;/CODE&gt; &lt;CODE class=plain&gt;List&amp;lt;PHOTO&amp;gt; Photos &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt2&quot;&gt;&lt;CODE class=number&gt;02.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 0px! important&quot;&gt;&lt;CODE class=plain&gt;{ &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt1&quot;&gt;&lt;CODE class=number&gt;03.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 28px! important&quot;&gt;&lt;CODE class=keyword&gt;get&lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt2&quot;&gt;&lt;CODE class=number&gt;04.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 28px! important&quot;&gt;&lt;CODE class=plain&gt;{ &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt1&quot;&gt;&lt;CODE class=number&gt;05.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 56px! important&quot;&gt;&lt;CODE class=keyword&gt;return&lt;/CODE&gt; &lt;CODE class=plain&gt;_photos; &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt2&quot;&gt;&lt;CODE class=number&gt;06.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 28px! important&quot;&gt;&lt;CODE class=plain&gt;} &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt1&quot;&gt;&lt;CODE class=number&gt;07.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 28px! important&quot;&gt;&lt;CODE class=keyword&gt;set&lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt2&quot;&gt;&lt;CODE class=number&gt;08.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 28px! important&quot;&gt;&lt;CODE class=plain&gt;{ &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt1 highlighted&quot;&gt;&lt;CODE class=number&gt;09.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 56px! important&quot;&gt;&lt;CODE class=keyword&gt;if&lt;/CODE&gt; &lt;CODE class=plain&gt;(_photos != &lt;/CODE&gt;&lt;CODE class=keyword&gt;null&lt;/CODE&gt;&lt;CODE class=plain&gt;) &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt2 highlighted&quot;&gt;&lt;CODE class=number&gt;10.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 56px! important&quot;&gt;&lt;CODE class=plain&gt;{ &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt1 highlighted&quot;&gt;&lt;CODE class=number&gt;11.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 84px! important&quot;&gt;&lt;CODE class=plain&gt;_photos.Clear(); &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt2 highlighted&quot;&gt;&lt;CODE class=number&gt;12.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 84px! important&quot;&gt;&lt;CODE class=plain&gt;_photos = &lt;/CODE&gt;&lt;CODE class=keyword&gt;null&lt;/CODE&gt;&lt;CODE class=plain&gt;; &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt1 highlighted&quot;&gt;&lt;CODE class=number&gt;13.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 56px! important&quot;&gt;&lt;CODE class=plain&gt;} &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt2&quot;&gt;&lt;CODE class=number&gt;14.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 7px! important&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt1&quot;&gt;&lt;CODE class=number&gt;15.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 56px! important&quot;&gt;&lt;CODE class=plain&gt;_photos = value; &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt2&quot;&gt;&lt;CODE class=number&gt;16.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 7px! important&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt1&quot;&gt;&lt;CODE class=number&gt;17.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 56px! important&quot;&gt;&lt;CODE class=plain&gt;OnPropertyChanged(&lt;/CODE&gt;&lt;CODE class=string&gt;&quot;Photos&quot;&lt;/CODE&gt;&lt;CODE class=plain&gt;); &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt2&quot;&gt;&lt;CODE class=number&gt;18.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;CODE class=spaces&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/CODE&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 28px! important&quot;&gt;&lt;CODE class=plain&gt;} &lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV class=&quot;line alt1&quot;&gt;&lt;CODE class=number&gt;19.&lt;/CODE&gt;&lt;SPAN class=content&gt;&lt;SPAN class=block style=&quot;MARGIN-LEFT: 0px! important&quot;&gt;&lt;CODE class=plain&gt;}&lt;/CODE&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;br /&gt;
&lt;br /&gt;콜렉션을 통째로 새 객체로 덮어쓰더라도 &lt;STRONG&gt;전에 사용하고 있던 콜렉션을 Clear해 주고, 변수를 null로 초기화해주면&lt;/STRONG&gt; &lt;br /&gt;
이런 일이 발생하지 않습니다. 정말 바인딩에서 발생하는 문제들은 타이밍에 관련된 것도 있고 오묘해서 해결하기가 &lt;br /&gt;
쉽지 않은데 노련한 공도씨가 단박에 해결해 주었네요. &lt;br /&gt;
&lt;br /&gt;이런 팁은 내용을 이해한 후에 습관화하는 것이 좋을 것 같습니다. &lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;

&lt;SCRIPT src=&quot;http://gilverlight.net/plugin/CallBack_bootstrapper?&amp;amp;src=http://cfs.tistory.com/blog/plugins/CallBack/callback&amp;amp;id=3069&amp;amp;callbackId=gilverlightnet30694932&amp;amp;destDocId=callbacknestgilverlightnet30694932&amp;amp;host=http://gilverlight.net&amp;amp;float=left&amp;amp;random=74&quot;&gt;&lt;/SCRIPT&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-54-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-54-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-54-2&quot; class=&quot;entry-ccl-sa&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black04.png&quot; alt=&quot;동일 조건 변경 허락&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Don&#039;t Panic</category>
			<category>InvalidOperationException</category>
			<category>MVVM</category>
			<category>OnPropertyChanged오류</category>
			<category>silverlight</category>
			<category>개체의 현재 상태 때문에 작업이 유효하지 않습니다</category>
			<category>실버라이트</category>
			<author>길버트</author>
			<guid>http://error1001.com/54</guid>
			<comments>http://error1001.com/54#entry54comment</comments>
			<pubDate>Thu, 04 Jun 2009 21:58:16 +0900</pubDate>
		</item>
		<item>
			<title>Visual Studio에서 XAML을 열 때 [미리보기] 안하기</title>
			<link>http://error1001.com/52</link>
			<description>&lt;P&gt;원문 : &lt;A href=&quot;http://gilverlight.net/3053&quot;&gt;http://gilverlight.net/3053&lt;/A&gt;&lt;br /&gt;
&lt;br /&gt;실버라이트 개발을 하면서 Visual Studio에서 XAML을 열어보실 때 공통적으로 느끼시는 &lt;br /&gt;
불편함이 하나 있으실 겁니다. 바로 XAML에 대한 뷰가 미리보기 창과 코드 창으로 분할되어 나오면서 &lt;br /&gt;
미리보기 때문에 PC가 버벅거리는 것!&lt;/P&gt;
&lt;P&gt;XAML을 볼 때 기본뷰를 바꿈으로써 이 불편함을 해소할 수 있는데요. &lt;br /&gt;
혹시 모르시는 분이 있으실까봐 소개합니다.&lt;/P&gt;
&lt;P&gt;&lt;STRONG&gt;[Tools-Options-Text Editor-XAML-Miscellaneous]&lt;/STRONG&gt;에 가시면 &lt;br /&gt;
아래 그림처럼 &lt;STRONG&gt;&lt;U&gt;Always open documents in full XAML view란 옵션&lt;/U&gt;&lt;/STRONG&gt;을 발견하실 수 있을 거예요. &lt;br /&gt;
체크박스를 켜주시고 OK를 눌러 저장하시면, 다음부터 XAML을 열었을 때 쾌적한 환경을 맛보실 수 &lt;br /&gt;
있으실 겁니다.&lt;br /&gt;
&lt;/P&gt;
&lt;P&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #eff4d8&quot; color=#7e8560&gt;(2009년 5월 6일 추가됨 - 시작)&lt;/FONT&gt;&lt;br /&gt;
&lt;FONT color=#e31600&gt;한글판 비주얼 스튜디오&lt;/FONT&gt;에서는 아래와 같이 찾아가시면 된다고 합니다.&lt;br /&gt;
&lt;STRONG&gt;[도구-옵션-문자편집기-XAML-기타]&lt;/STRONG&gt;에 가시면 &lt;STRONG&gt;&lt;U&gt;기본보기 : 항상 전체 XAML 뷰에서 문서 열기&lt;/U&gt;&lt;/STRONG&gt;란 옵션을 발견하실 수 있으실 것입니다.&amp;nbsp;&amp;lt;= 네이버 실버라이트 카페 &#039;쥰세&#039;님의 제보&lt;br /&gt;
&lt;FONT style=&quot;BACKGROUND-COLOR: #eff4d8&quot; color=#7e8560&gt;(2009년 5월 6일 추가됨 - 끝)&lt;/FONT&gt;&lt;/P&gt;
&lt;P&gt;&lt;A href=&quot;http://gilverlight.net/script/powerEditor/pages/http://cfile4.uf.tistory.com/image/1879480E49F50F6F8FBD7D&quot;&gt;&lt;IMG height=366 src=&quot;http://cfile1.uf.tistory.com/image/150F5F0D49F50F73B77DD5&quot; width=640&gt;&lt;/A&gt; &lt;/P&gt;&lt;STRONG&gt;
&lt;BLOCKQUOTE&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 18pt&quot;&gt;더 이상 XAML 보기가 부담스럽지 않다!&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;br /&gt;
&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&lt;/STRONG&gt;감사합니다.&lt;/P&gt;
&lt;SCRIPT src=&quot;http://gilverlight.net/plugin/CallBack_bootstrapper?&amp;amp;src=http://cfs.tistory.com/blog/plugins/CallBack/callback&amp;amp;id=3053&amp;amp;callbackId=gilverlightnet30537559&amp;amp;destDocId=callbacknestgilverlightnet30537559&amp;amp;host=http://gilverlight.net&amp;amp;float=left&amp;amp;random=396&quot;&gt;&lt;/SCRIPT&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-52-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-52-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-52-2&quot; class=&quot;entry-ccl-sa&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black04.png&quot; alt=&quot;동일 조건 변경 허락&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Tip</category>
			<category>silverlight</category>
			<category>VisualStudio</category>
			<category>XAML 미리보기 안하기</category>
			<category>비주얼스튜디오</category>
			<category>실버라이트</category>
			<author>길버트</author>
			<guid>http://error1001.com/52</guid>
			<comments>http://error1001.com/52#entry52comment</comments>
			<pubDate>Wed, 06 May 2009 09:43:15 +0900</pubDate>
		</item>
		<item>
			<title>AttachedProperty와 데이터 바인딩</title>
			<link>http://error1001.com/51</link>
			<description>AttachedProperty는 XAML 코드 상으로는 하나의 영역에 있어 보여도 실은 다르게 취급된다는거...&lt;br /&gt;
그래서 AttachedProperty안에 있는 오브젝트에 데이터 바인딩을 걸려면 AttachedProperty에서 Set할 때 안에 들어갈 오브젝트에게 DataContext를 넘겨줘야 함.&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;...근데 왜 {Binding Source={StaticResource Source}, Path=Property}가 안먹을까... 이건 의문.&lt;/div&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-51-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-51-1&quot; class=&quot;entry-ccl-sa&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black04.png&quot; alt=&quot;동일 조건 변경 허락&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-sa/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>AttachedProperty</category>
			<category>silverlight</category>
			<category>데이터 바인딩</category>
			<category>실버라이트</category>
			<author>gongdo</author>
			<guid>http://error1001.com/51</guid>
			<comments>http://error1001.com/51#entry51comment</comments>
			<pubDate>Wed, 08 Apr 2009 14:48:01 +0900</pubDate>
		</item>
		<item>
			<title>AG_E_UNKNOWN_ERROR [Line: # Position: #]가 나오는 현상 중 하나</title>
			<link>http://error1001.com/50</link>
			<description>특히 커스텀 컨트롤을 만들때 종종 만나는 에러. 자세한 에러가 없으니 대책이 없죠 정말.&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Gulim; font-weight: bold; line-height: normal; white-space: pre; &quot;&gt;AG_E_UNKNOWN_ERROR &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Gulim; line-height: normal; white-space: pre; &quot;&gt;에러의 원인은 여러가지이지만 이 중 하나는 다음과 같습니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Gulim; line-height: normal; white-space: pre;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Gulim; line-height: normal; white-space: pre;&quot;&gt;/themes/generic.xaml에 커스텀 컨트롤의 기본 스타일을 지정할 때&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Gulim; line-height: normal; white-space: pre;&quot;&gt;Setter의 Property 이름을 잘못 설정한 경우 100% 이 에러가 발생하죠.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Gulim; line-height: normal; white-space: pre;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Gulim; line-height: normal; white-space: pre;&quot;&gt;ex) 이 상황에서 MyControl이 NotExistsProperty라는 프로퍼티를 가지고 있지 않으면 위의 에러가 발생.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Gulim; line-height: normal; white-space: pre;&quot;&gt;&amp;lt;Style TargetType=&quot;my:MyControl&quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Gulim; line-height: normal; white-space: pre;&quot;&gt;    &amp;lt;Setter Property=&quot;&lt;span class=&quot;Apple-style-span&quot; style=&quot;text-decoration: underline;&quot;&gt;NotExistsProperty&lt;/span&gt;&quot; Value=&quot;1&quot; /&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;font-family: Gulim; line-height: normal; white-space: pre;&quot;&gt;&amp;lt;/Style&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-50-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-50-1&quot; class=&quot;entry-ccl-sa&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black04.png&quot; alt=&quot;동일 조건 변경 허락&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-sa/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/DerivativeWorks&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Don&#039;t Panic</category>
			<category>AG_E_UNKNOWN_ERROR</category>
			<category>generic.xaml</category>
			<author>gongdo</author>
			<guid>http://error1001.com/50</guid>
			<comments>http://error1001.com/50#entry50comment</comments>
			<pubDate>Wed, 11 Mar 2009 18:06:28 +0900</pubDate>
		</item>
		<item>
			<title>실버라이트에서의 UI 자동화 - Part 2 (쉬운 방법)</title>
			<link>http://error1001.com/49</link>
			<description>&lt;div&gt;
아래 글은 &lt;a href=&quot;http://blogs.msdn.com/gisenberg/archive/2008/07/17/ui-automation-in-silverlight-part-ii-the-easy-way.aspx&quot; target=&quot;_blank&quot; title=&quot;[http://blogs.msdn.com/gisenberg/archive/2008/07/17/ui-automation-in-silverlight-part-ii-the-easy-way.aspx]로 이동합니다.&quot;&gt;http://blogs.msdn.com/gisenberg/archive/2008/07/17/ui-automation-in-silverlight-part-ii-the-easy-way.aspx&lt;/a&gt; 글을 번역한 글입니다. &lt;/div&gt;
&lt;div&gt;
-----------------------------------------------------------------------------------------------------------&lt;/div&gt;
이전 포스트에서는 실버라이트에서의 자동화와 접근성을 위해 커스텀 컨트롤을 노출하는 방법에 대해 썼습니다. 만약 실버라이트의 자동화에만 관심이 있고 실버라이트 유닛 테스트 프레임 워크가 목적에 적합하지 않다면 좀더 쉬운 방법으로 AutomationPeer 타입을 구현하여 테스트 할 수 있습니다.&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
  실버라이트 2 Beta2 에서 부터 Xaml안에서 AutomationProperties.AutomationId 속성을 이용하여 자동화시 고유하게, 유니크하게 사용할 타입을 만들 수 있습니다. &lt;/div&gt;
&lt;div&gt;
&lt;div id=&quot;h4dk&quot;&gt;
 &lt;/div&gt;
&lt;div id=&quot;h4dk0&quot;&gt;
&lt;div id=&quot;h4dk1&quot; style=&quot;BACKGROUND: silver; COLOR: black; FONT-FAMILY: Consolas&quot;&gt;
&lt;p id=&quot;h4dk2&quot; style=&quot;MARGIN: 0px&quot;&gt;   &lt;span id=&quot;h4dk5&quot; style=&quot;COLOR: blue&quot;&gt;&amp;lt;&lt;/span&gt;&lt;span id=&quot;h4dk6&quot; style=&quot;COLOR: #a31515&quot;&gt;TextBox&lt;/span&gt;&lt;span id=&quot;h4dk7&quot; style=&quot;COLOR: red&quot;&gt; 
AutomationProperties.AutomationId&lt;/span&gt;&lt;span id=&quot;h4dk8&quot; style=&quot;COLOR: blue&quot;&gt;=&quot;SearchTextBox&quot;&lt;/span&gt; &lt;span id=&quot;h4dk18&quot; style=&quot;COLOR: red&quot;&gt;x&lt;/span&gt;&lt;span id=&quot;h4dk19&quot; style=&quot;COLOR: blue&quot;&gt;:&lt;/span&gt;&lt;span id=&quot;h4dk20&quot; style=&quot;COLOR: red&quot;&gt;Name&lt;/span&gt;&lt;span id=&quot;h4dk21&quot; style=&quot;COLOR: blue&quot;&gt;=&quot;SearchText&quot;&lt;/span&gt;&lt;span id=&quot;h4dk22&quot; style=&quot;COLOR: red&quot;&gt; 
KeyDown&lt;/span&gt;&lt;span id=&quot;h4dk23&quot; style=&quot;COLOR: blue&quot;&gt;=&quot;CheckKey&quot; 
/&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
 &lt;/div&gt;
&lt;div id=&quot;h4dk0&quot;&gt;
AutomationProperties.AutomationId 속성은 Beta2에서는 인텔리센스로 지원되지 않고 &quot;The attachable property &#039;AutomationId&#039; was not found in type 
&#039;AutomationProperties&#039;.&quot; 란 에러 매세지가 뜨겠지만 무시하고 넘어가도 됩니다.(역자주: 정식 버전(RTM)에서는 지원이 됩니다.) &lt;/div&gt;
&lt;/div&gt;
&lt;div&gt;
 &lt;/div&gt;
&lt;div&gt;
  이렇게 한 후 UISpy에서 이 객체는 아래와 같이 보일 것입니다. &lt;/div&gt;
&lt;div&gt;
&lt;div id=&quot;h4dk28&quot;&gt;
&lt;/div&gt;
&lt;div id=&quot;imri&quot;&gt;
&lt;div id=&quot;imri0&quot; style=&quot;FONT-SIZE: 8pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: Consolas&quot;&gt;
&lt;p id=&quot;imri1&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;imri2&quot; color=&quot;#45818e&quot; size=&quot;2&quot;&gt;    Identification&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;imri3&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n6&quot; size=&quot;2&quot;&gt;    ClassName:    &lt;span id=&quot;imri4&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;imri5&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n60&quot; size=&quot;2&quot;&gt;    ControlType:    &lt;span id=&quot;imri6&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;ControlType.Custom&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;imri7&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n61&quot; size=&quot;2&quot;&gt;    Culture:    &lt;span id=&quot;imri8&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;(null)&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;imri9&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n62&quot; size=&quot;2&quot;&gt;    AutomationId:    &lt;span id=&quot;imri10&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;SearchTextBox&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;imri11&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n63&quot; size=&quot;2&quot;&gt;    
LocalizedControlType:    &lt;span id=&quot;imri12&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;custom&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;imri13&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n64&quot; size=&quot;2&quot;&gt;    Name:    &lt;span id=&quot;imri14&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;imri15&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n65&quot; size=&quot;2&quot;&gt;    ProcessId:    &lt;span id=&quot;imri16&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;2808 (iexplore)&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;imri17&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n66&quot; size=&quot;2&quot;&gt;    RuntimeId:    &lt;span id=&quot;imri18&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;42 197822 3&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;imri19&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n67&quot; size=&quot;2&quot;&gt;    IsPassword:    &lt;span id=&quot;imri20&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;False&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;imri21&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n68&quot; size=&quot;2&quot;&gt;    IsControlElement:    
&lt;span id=&quot;imri22&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;True&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;imri23&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n69&quot; size=&quot;2&quot;&gt;    IsContentElement:    
&lt;span id=&quot;imri24&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;True&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;imri25&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n610&quot; size=&quot;2&quot;&gt;&lt;/font&gt; &lt;/p&gt;
&lt;p id=&quot;imri26&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n611&quot; size=&quot;2&quot;&gt;  &lt;span id=&quot;imri27&quot; style=&quot;COLOR: #2b91af&quot;&gt;Visibility&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;imri28&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n612&quot; size=&quot;2&quot;&gt;    
BoundingRectangle:    &lt;span id=&quot;imri29&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;(240, 327, 300, 
23)&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;imri30&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n613&quot; size=&quot;2&quot;&gt;    ClickablePoint:    
&lt;span id=&quot;imri31&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;390,338&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;imri32&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n614&quot; size=&quot;2&quot;&gt;    IsOffscreen:    
&lt;span id=&quot;imri33&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;False&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;!--EndFragment--&gt;&lt;/div&gt;
&lt;div id=&quot;h4dk29&quot;&gt;
 &lt;/div&gt;
&lt;div id=&quot;h4dk29&quot;&gt;
이 부분에서 한 사용자를 시뮬레이션 한다면 세가지 작업을 예상할 수 있습니다. &lt;/div&gt;
&lt;div id=&quot;h4dk29&quot;&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div id=&quot;h4dk29&quot;&gt;
1. ClickablePoint(클릭 가능한 점)으로 MouseCursor를 이동.&lt;/div&gt;
&lt;div id=&quot;h4dk29&quot;&gt;
2. 마우스 커서를 클릭.&lt;/div&gt;
&lt;div id=&quot;h4dk29&quot;&gt;
3. 타이핑을 시작.&lt;/div&gt;
&lt;div id=&quot;h4dk29&quot;&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div id=&quot;h4dk29&quot;&gt;
커서를 클릭 가능한 점으로 이동시키기 위해서는 Cursor.Position 프로퍼티를 설정해주어야 합니다. 이것을 위해서는 System.Windows.Point와 System.Drawing.Point간의 소통이 필요합니다. 여기서는 확장 메서드를 사용하여 아래와 같이 구현하였습니다. &lt;/div&gt;
&lt;div id=&quot;h4dk29&quot;&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div id=&quot;h4dk29&quot;&gt;
&lt;div id=&quot;cd22&quot;&gt;
&lt;/div&gt;
&lt;div id=&quot;cd220&quot;&gt;
&lt;div id=&quot;i5zq&quot; style=&quot;FONT-SIZE: 8pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: Consolas&quot;&gt;
&lt;p id=&quot;i5zq0&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n615&quot; size=&quot;2&quot;&gt;    &lt;span id=&quot;i5zq1&quot; style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span id=&quot;i5zq2&quot; style=&quot;COLOR: blue&quot;&gt;static&lt;/span&gt; &lt;span id=&quot;i5zq3&quot; style=&quot;COLOR: blue&quot;&gt;class&lt;/span&gt; &lt;span id=&quot;i5zq4&quot; style=&quot;COLOR: #2b91af&quot;&gt;ExtensionMethods&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;i5zq5&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n616&quot; size=&quot;2&quot;&gt;    {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;i5zq6&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n617&quot; size=&quot;2&quot;&gt;        &lt;span id=&quot;i5zq7&quot; style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span id=&quot;i5zq8&quot; style=&quot;COLOR: blue&quot;&gt;static&lt;/span&gt; System.Drawing.&lt;span id=&quot;i5zq9&quot; style=&quot;COLOR: #2b91af&quot;&gt;Point&lt;/span&gt; ToDrawingPoint(&lt;span id=&quot;i5zq10&quot; style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt; System.Windows.&lt;span id=&quot;i5zq11&quot; style=&quot;COLOR: #2b91af&quot;&gt;Point&lt;/span&gt; windowsPoint)&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;i5zq12&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n618&quot; size=&quot;2&quot;&gt;        {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;i5zq13&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n619&quot; size=&quot;2&quot;&gt;            &lt;span id=&quot;i5zq14&quot; style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span id=&quot;i5zq15&quot; style=&quot;COLOR: blue&quot;&gt;new&lt;/span&gt; System.Drawing.&lt;span id=&quot;i5zq16&quot; style=&quot;COLOR: #2b91af&quot;&gt;Point&lt;/span&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;i5zq17&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n620&quot; size=&quot;2&quot;&gt;                    
{&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;i5zq18&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n621&quot; size=&quot;2&quot;&gt;                        
X = &lt;span id=&quot;i5zq19&quot; style=&quot;COLOR: #2b91af&quot;&gt;Convert&lt;/span&gt;.ToInt32(windowsPoint.X),&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;i5zq20&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n622&quot; size=&quot;2&quot;&gt;                        
Y = &lt;span id=&quot;i5zq21&quot; style=&quot;COLOR: #2b91af&quot;&gt;Convert&lt;/span&gt;.ToInt32(windowsPoint.Y) &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;i5zq22&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n623&quot; size=&quot;2&quot;&gt;                    
};&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;i5zq23&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n624&quot; size=&quot;2&quot;&gt;        }&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;i5zq24&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n625&quot; size=&quot;2&quot;&gt;    }&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;!--EndFragment--&gt;&lt;/div&gt;
&lt;div id=&quot;cd221&quot;&gt;
 &lt;/div&gt;
&lt;div id=&quot;cd221&quot;&gt;
마우스를 움직인 후에는 Click을 구현해야만 합니다. Click을 구현하기 위해서는 DllImport 를 사용해야 합니다. 이것을 사용해 호출 코드를 간단하게 만드는 Wrapper 클래스는 만들 수 있습니다. &lt;/div&gt;
&lt;div id=&quot;cd221&quot;&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div id=&quot;cd221&quot;&gt;
&lt;div id=&quot;lscq0&quot;&gt;
&lt;/div&gt;
&lt;div id=&quot;bf0u&quot;&gt;
&lt;div id=&quot;bf0u0&quot; style=&quot;FONT-SIZE: 8pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: Consolas&quot;&gt;
&lt;p id=&quot;bf0u1&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n626&quot; size=&quot;2&quot;&gt;    &lt;span id=&quot;bf0u2&quot; style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span id=&quot;bf0u3&quot; style=&quot;COLOR: blue&quot;&gt;static&lt;/span&gt; &lt;span id=&quot;bf0u4&quot; style=&quot;COLOR: blue&quot;&gt;class&lt;/span&gt; &lt;span id=&quot;bf0u5&quot; style=&quot;COLOR: #2b91af&quot;&gt;Mouse&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;bf0u6&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n627&quot; size=&quot;2&quot;&gt;    {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;bf0u7&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n628&quot; size=&quot;2&quot;&gt;        &lt;span id=&quot;bf0u8&quot; style=&quot;COLOR: blue&quot;&gt;private&lt;/span&gt; &lt;span id=&quot;bf0u9&quot; style=&quot;COLOR: blue&quot;&gt;const&lt;/span&gt; &lt;span id=&quot;bf0u10&quot; style=&quot;COLOR: #2b91af&quot;&gt;UInt32&lt;/span&gt; MouseEventLeftDown = 0x0002;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;bf0u11&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n629&quot; size=&quot;2&quot;&gt;        &lt;span id=&quot;bf0u12&quot; style=&quot;COLOR: blue&quot;&gt;private&lt;/span&gt; &lt;span id=&quot;bf0u13&quot; style=&quot;COLOR: blue&quot;&gt;const&lt;/span&gt; &lt;span id=&quot;bf0u14&quot; style=&quot;COLOR: #2b91af&quot;&gt;UInt32&lt;/span&gt; MouseEventLeftUp = 0x0004;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;bf0u15&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n630&quot; size=&quot;2&quot;&gt;&lt;/font&gt;
&lt;/p&gt;
&lt;p id=&quot;bf0u16&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;span id=&quot;bf0u17&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font id=&quot;x_n631&quot; size=&quot;2&quot;&gt;&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;p id=&quot;kdpa&quot;&gt;&lt;font id=&quot;x_n633&quot; size=&quot;2&quot;&gt;        [&lt;span id=&quot;bf0u19&quot; style=&quot;COLOR: #2b91af&quot;&gt;DllImport&lt;/span&gt;(&lt;span id=&quot;bf0u20&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;user32.dll&quot;&lt;/span&gt;)]&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;bf0u21&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n634&quot; size=&quot;2&quot;&gt;        &lt;span id=&quot;bf0u22&quot; style=&quot;COLOR: blue&quot;&gt;private&lt;/span&gt; &lt;span id=&quot;bf0u23&quot; style=&quot;COLOR: blue&quot;&gt;static&lt;/span&gt; &lt;span id=&quot;bf0u24&quot; style=&quot;COLOR: blue&quot;&gt;extern&lt;/span&gt; &lt;span id=&quot;bf0u25&quot; style=&quot;COLOR: blue&quot;&gt;void&lt;/span&gt; mouse_event(&lt;span id=&quot;bf0u26&quot; style=&quot;COLOR: #2b91af&quot;&gt;UInt32&lt;/span&gt; dwFlags, &lt;span id=&quot;bf0u27&quot; style=&quot;COLOR: #2b91af&quot;&gt;UInt32&lt;/span&gt; dx, &lt;span id=&quot;bf0u28&quot; style=&quot;COLOR: #2b91af&quot;&gt;UInt32&lt;/span&gt; dy, &lt;span id=&quot;bf0u29&quot; style=&quot;COLOR: #2b91af&quot;&gt;UInt32&lt;/span&gt; dwData, &lt;span id=&quot;bf0u30&quot; style=&quot;COLOR: #2b91af&quot;&gt;IntPtr&lt;/span&gt; dwExtraInfo);&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;bf0u31&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n635&quot; size=&quot;2&quot;&gt;&lt;/font&gt; &lt;/p&gt;
&lt;p id=&quot;bf0u32&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n636&quot; size=&quot;2&quot;&gt;        &lt;span id=&quot;bf0u33&quot; style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span id=&quot;bf0u34&quot; style=&quot;COLOR: blue&quot;&gt;static&lt;/span&gt; &lt;span id=&quot;bf0u35&quot; style=&quot;COLOR: blue&quot;&gt;void&lt;/span&gt; Click()&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;bf0u36&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n637&quot; size=&quot;2&quot;&gt;        {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;bf0u37&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n638&quot; size=&quot;2&quot;&gt;            
mouse_event(MouseEventLeftDown, 0, 0, 0, &lt;span id=&quot;bf0u38&quot; style=&quot;COLOR: #2b91af&quot;&gt;IntPtr&lt;/span&gt;.Zero);&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;bf0u39&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n639&quot; size=&quot;2&quot;&gt;            
mouse_event(MouseEventLeftUp, 0, 0, 0, &lt;span id=&quot;bf0u40&quot; style=&quot;COLOR: #2b91af&quot;&gt;IntPtr&lt;/span&gt;.Zero);&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;bf0u41&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n640&quot; size=&quot;2&quot;&gt;        }&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;bf0u42&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n641&quot; size=&quot;2&quot;&gt;    }&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;!--EndFragment--&gt;&lt;/div&gt;
&lt;div id=&quot;bf0u43&quot;&gt;
 &lt;/div&gt;
&lt;div id=&quot;bf0u43&quot;&gt;
이제, Xaml에서 Automation ID를 설정했기 때문에 Automation ID로 객체를 구분할 수 있고 마우스를 객체의 ClickablePoint로 이동할 수 있고 마우스 클릭을 시뮬레이션할 수 있습니다. 이제 이 모든 걸 해봅시다. &lt;/div&gt;
&lt;div id=&quot;bf0u43&quot;&gt;
&lt;div id=&quot;cd222&quot;&gt;
  
&lt;div id=&quot;z0y82&quot; style=&quot;BACKGROUND: silver; COLOR: black; FONT-FAMILY: Consolas&quot;&gt;
&lt;p id=&quot;z0y83&quot; style=&quot;MARGIN: 0px&quot;&gt;        [&lt;span id=&quot;z0y84&quot; style=&quot;COLOR: #2b91af&quot;&gt;TestMethod&lt;/span&gt;]&lt;/p&gt;
&lt;p id=&quot;z0y85&quot; style=&quot;MARGIN: 0px&quot;&gt;        &lt;span id=&quot;z0y86&quot; style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span id=&quot;z0y87&quot; style=&quot;COLOR: blue&quot;&gt;void&lt;/span&gt; 
TestMethod1()&lt;/p&gt;
&lt;p id=&quot;z0y88&quot; style=&quot;MARGIN: 0px&quot;&gt;        {&lt;/p&gt;
&lt;div id=&quot;ycnd&quot; style=&quot;FONT-SIZE: 8pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: Consolas&quot;&gt;
&lt;p id=&quot;ycnd0&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;span id=&quot;ycnd1&quot; style=&quot;COLOR: green&quot;&gt;&lt;font id=&quot;x_n642&quot; size=&quot;2&quot;&gt;              // Assumes an existing Internet Explorer process 
is running and pointed at your Silverlight app&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;!--EndFragment--&gt;
&lt;p id=&quot;z0y89&quot; style=&quot;MARGIN: 0px&quot;&gt;            &lt;span id=&quot;z0y810&quot; style=&quot;COLOR: #2b91af&quot;&gt;Process&lt;/span&gt; process = System.Diagnostics.&lt;span id=&quot;z0y811&quot; style=&quot;COLOR: #2b91af&quot;&gt;Process&lt;/span&gt;.GetProcessesByName(&lt;span id=&quot;z0y812&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;iexplore&quot;&lt;/span&gt;).First();&lt;/p&gt;
&lt;p id=&quot;z0y813&quot; style=&quot;MARGIN: 0px&quot;&gt;            &lt;span id=&quot;z0y815&quot; style=&quot;COLOR: #2b91af&quot;&gt;AutomationElement&lt;/span&gt; browserInstance = 
System.Windows.Automation.&lt;span id=&quot;z0y816&quot; style=&quot;COLOR: #2b91af&quot;&gt;AutomationElement&lt;/span&gt;.FromHandle(process.MainWindowHandle);&lt;/p&gt;
&lt;p id=&quot;wu95&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;span id=&quot;wu950&quot; style=&quot;COLOR: #2b91af&quot;&gt;            Thread&lt;/span&gt;.Sleep(1000);&lt;/p&gt;
&lt;p id=&quot;wu951&quot; style=&quot;MARGIN: 0px&quot; mce_keep=&quot;true&quot;&gt; &lt;/p&gt;
&lt;p id=&quot;z0y817&quot; style=&quot;MARGIN: 0px&quot;&gt;            &lt;span id=&quot;z0y818&quot; style=&quot;COLOR: #2b91af&quot;&gt;TreeWalker&lt;/span&gt; tw = &lt;span id=&quot;z0y819&quot; style=&quot;COLOR: blue&quot;&gt;new&lt;/span&gt; &lt;span id=&quot;z0y820&quot; style=&quot;COLOR: #2b91af&quot;&gt;TreeWalker&lt;/span&gt;(&lt;span id=&quot;z0y821&quot; style=&quot;COLOR: blue&quot;&gt;new&lt;/span&gt; &lt;span id=&quot;z0y822&quot; style=&quot;COLOR: #2b91af&quot;&gt;PropertyCondition&lt;/span&gt;(&lt;span id=&quot;z0y823&quot; style=&quot;COLOR: #2b91af&quot;&gt;AutomationElement&lt;/span&gt;.AutomationIdProperty, &lt;span id=&quot;z0y824&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;SearchTextBox&quot;&lt;/span&gt;));&lt;/p&gt;
&lt;p id=&quot;z0y825&quot; style=&quot;MARGIN: 0px&quot;&gt;            &lt;span id=&quot;z0y826&quot; style=&quot;COLOR: #2b91af&quot;&gt;AutomationElement&lt;/span&gt; searchBox = 
tw.GetFirstChild(browserInstance);&lt;/p&gt;
&lt;p id=&quot;z0y827&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;span id=&quot;wu952&quot; style=&quot;COLOR: #2b91af&quot;&gt;            Thread&lt;/span&gt;.Sleep(1000);&lt;/p&gt;
&lt;p id=&quot;wu953&quot; style=&quot;MARGIN: 0px&quot; mce_keep=&quot;true&quot;&gt; &lt;/p&gt;
&lt;div id=&quot;h25h&quot; style=&quot;FONT-SIZE: 8pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: Consolas&quot;&gt;
&lt;p id=&quot;h25h0&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n643&quot; size=&quot;2&quot;&gt;            System.Windows.&lt;span id=&quot;h25h1&quot; style=&quot;COLOR: #2b91af&quot;&gt;Point&lt;/span&gt; uiaPoint;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;wu954&quot; style=&quot;MARGIN: 0px&quot; mce_keep=&quot;true&quot;&gt; &lt;/p&gt;
&lt;p id=&quot;h25h2&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n645&quot; size=&quot;2&quot;&gt;            &lt;span id=&quot;h25h3&quot; style=&quot;COLOR: blue&quot;&gt;if&lt;/span&gt; (&lt;span id=&quot;h25h4&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font id=&quot;cd-e&quot; color=&quot;#000000&quot;&gt;searchBox&lt;/font&gt;&lt;/span&gt;.TryGetClickablePoint(&lt;span id=&quot;h25h5&quot; style=&quot;COLOR: blue&quot;&gt;out&lt;/span&gt; uiaPoint))&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;h25h6&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n646&quot; size=&quot;2&quot;&gt;            {&lt;/font&gt;&lt;/p&gt;
&lt;div id=&quot;cd-e0&quot; style=&quot;FONT-SIZE: 8pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: Consolas&quot;&gt;
&lt;p id=&quot;cd-e1&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n647&quot; size=&quot;2&quot;&gt;&lt;span id=&quot;cd-e2&quot; style=&quot;COLOR: #2b91af&quot;&gt;                Cursor&lt;/span&gt;.Position = &lt;span id=&quot;cd-e3&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font id=&quot;o64e0&quot; color=&quot;#000000&quot;&gt;uiaPoint&lt;/font&gt;&lt;/span&gt;.ToDrawingPoint();&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;gmcq&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n648&quot; size=&quot;2&quot;&gt;                &lt;font id=&quot;gmcq0&quot; color=&quot;#2b91af&quot;&gt;Mouse&lt;/font&gt;&lt;font id=&quot;gmcq1&quot; color=&quot;#000000&quot;&gt;.Click();&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;gmcq2&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n649&quot; size=&quot;2&quot;&gt;                &lt;span id=&quot;z0y842&quot; style=&quot;COLOR: #2b91af&quot;&gt;SendKeys&lt;/span&gt;.SendWait(&lt;span id=&quot;z0y843&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;Hello, world!&quot;&lt;/span&gt;);&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;!--EndFragment--&gt;
&lt;p id=&quot;h25h9&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n650&quot; size=&quot;2&quot;&gt;            }&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;kdpa0&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n651&quot; size=&quot;2&quot;&gt;            else&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;kdpa1&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n652&quot; size=&quot;2&quot;&gt;            {&lt;/font&gt;&lt;/p&gt;
&lt;div id=&quot;kdpa2&quot; style=&quot;FONT-SIZE: 8pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: Consolas&quot;&gt;
&lt;p id=&quot;kdpa3&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n653&quot; size=&quot;2&quot;&gt;&lt;span id=&quot;kdpa4&quot; style=&quot;COLOR: #2b91af&quot;&gt;                Assert&lt;/span&gt;.Fail();&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p id=&quot;kdpa5&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;x_n654&quot; size=&quot;2&quot;&gt;            }&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p id=&quot;z0y846&quot; style=&quot;MARGIN: 0px&quot;&gt;        }&lt;/p&gt;
&lt;/div&gt;
&lt;p id=&quot;t0pm41&quot; mce_keep=&quot;true&quot;&gt;만약 동적으로 코드에서 컨트롤을 생성한다면 어떻게 해야 할까요? AutomationProperties에 정적 메소드를 사용하여 AutomationId 프로퍼티를 아래와 같이 설정할 수 있습니다. &lt;/p&gt;
&lt;div id=&quot;s.5z0&quot;&gt;
&lt;div id=&quot;s.5z1&quot; style=&quot;FONT-SIZE: 8pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: Consolas&quot;&gt;
&lt;p id=&quot;s.5z2&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;dz2d&quot; size=&quot;2&quot;&gt;&lt;span id=&quot;s.5z3&quot; style=&quot;COLOR: #2b91af&quot;&gt;    ListBoxItem&lt;/span&gt; myDynamicListBoxItem = &lt;span id=&quot;s.5z4&quot; style=&quot;COLOR: blue&quot;&gt;new&lt;/span&gt; &lt;span id=&quot;s.5z5&quot; style=&quot;COLOR: #2b91af&quot;&gt;ListBoxItem&lt;/span&gt; { Content = &lt;span id=&quot;s.5z6&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;Hello, world!&quot;&lt;/span&gt; };&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;s.5z7&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;dz2d0&quot; size=&quot;2&quot;&gt;    &lt;span id=&quot;s.5z8&quot; style=&quot;COLOR: #2b91af&quot;&gt;AutomationProperties&lt;/span&gt;.SetAutomationId(myDynamicListBoxItem, 
&lt;span id=&quot;s.5z9&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;myDynamicListBoxAutomationId&quot;&lt;/span&gt;);&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;!--EndFragment--&gt;&lt;/div&gt;
&lt;div id=&quot;cd224&quot;&gt;
 &lt;/div&gt;
&lt;div id=&quot;cd224&quot;&gt;
SendKeys는 닷넷 프레임워크 3.0에서 소개된 새로운 동작들을 가지고 있습니다. 이런것들이 관심이 있다면 &lt;span class=&quot;Apple-style-span&quot; style=&quot;text-decoration: underline;color: rgb(87, 4, 140); &quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.sendwait.aspx&quot; target=&quot;_blank&quot; title=&quot;[http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.sendwait.aspx]로 이동합니다.&quot;&gt;이곳&lt;/a&gt;&lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;a href=&quot;http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.sendwait.aspx&quot; target=&quot;_blank&quot; title=&quot;[http://msdn.microsoft.com/en-us/library/system.windows.forms.sendkeys.sendwait.aspx]로 이동합니다.&quot;&gt; 을 확인 해보십쇼. 만약 위의 결과들이 모순된 행동을 하게 된다면 Test Project의 app.config 화일에 아래 코드를 삽입해 보십쇼.&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cd224&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div id=&quot;cd224&quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;&lt;div id=&quot;hu1i0&quot;&gt;
&lt;/div&gt;
&lt;div id=&quot;hu1i1&quot;&gt;
&lt;div id=&quot;p:c-&quot; style=&quot;FONT-SIZE: 8pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: Consolas&quot;&gt;
&lt;p id=&quot;p:c-0&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;dz2d1&quot; size=&quot;2&quot;&gt;&lt;span id=&quot;p:c-1&quot; style=&quot;COLOR: blue&quot;&gt;    &amp;lt;&lt;/span&gt;&lt;span id=&quot;p:c-2&quot; style=&quot;COLOR: #a31515&quot;&gt;appSettings&lt;/span&gt;&lt;span id=&quot;p:c-3&quot; style=&quot;COLOR: blue&quot;&gt;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;p:c-4&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;dz2d2&quot; size=&quot;2&quot;&gt;&lt;span id=&quot;p:c-5&quot; style=&quot;COLOR: blue&quot;&gt;        &amp;lt;&lt;/span&gt;&lt;span id=&quot;p:c-6&quot; style=&quot;COLOR: #a31515&quot;&gt;add&lt;/span&gt;&lt;span id=&quot;p:c-7&quot; style=&quot;COLOR: blue&quot;&gt; 
&lt;/span&gt;&lt;span id=&quot;p:c-8&quot; style=&quot;COLOR: red&quot;&gt;key&lt;/span&gt;&lt;span id=&quot;p:c-9&quot; style=&quot;COLOR: blue&quot;&gt;=&lt;/span&gt;&quot;&lt;span id=&quot;p:c-10&quot; style=&quot;COLOR: blue&quot;&gt;SendKeys&lt;/span&gt;&quot;&lt;span id=&quot;p:c-11&quot; style=&quot;COLOR: blue&quot;&gt; 
&lt;/span&gt;&lt;span id=&quot;p:c-12&quot; style=&quot;COLOR: red&quot;&gt;value&lt;/span&gt;&lt;span id=&quot;p:c-13&quot; style=&quot;COLOR: blue&quot;&gt;=&lt;/span&gt;&quot;&lt;span id=&quot;p:c-14&quot; style=&quot;COLOR: blue&quot;&gt;SendInput&lt;/span&gt;&quot;&lt;span id=&quot;p:c-15&quot; style=&quot;COLOR: blue&quot;&gt;/&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;p:c-16&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;dz2d3&quot; size=&quot;2&quot;&gt;&lt;span id=&quot;p:c-17&quot; style=&quot;COLOR: blue&quot;&gt;    &amp;lt;/&lt;/span&gt;&lt;span id=&quot;p:c-18&quot; style=&quot;COLOR: #a31515&quot;&gt;appSettings&lt;/span&gt;&lt;span id=&quot;p:c-19&quot; style=&quot;COLOR: blue&quot;&gt;&gt;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;!--EndFragment--&gt;&lt;/div&gt;
&lt;div id=&quot;hu1i2&quot;&gt;
 &lt;/div&gt;
&lt;div id=&quot;hu1i2&quot;&gt;
도움이 되길 바랍니다. &lt;/div&gt;
&lt;div id=&quot;hu1i2&quot;&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div id=&quot;hu1i2&quot;&gt;
-----------------------------------------------------------------------------------------------------------&lt;/div&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;p id=&quot;t0pm41&quot; mce_keep=&quot;true&quot;&gt;UIAutomation에 대한 두번째 번역이 끝났습니다. 사실 UIAutomation은 테스트 자동화보다는 Accessibility에 초점이 맞혀진 기술이죠. 미국의 경우에는 이미 웹페이지에 대한 접근성에 대한 법률이 재정되었다고 하니 앞으로 이런 부분도 신경을 써야 하지 않을까 싶습니다. &lt;/p&gt;
&lt;p id=&quot;t0pm41&quot; mce_keep=&quot;true&quot;&gt;  프로젝트를 진행하면서 반복되는 리뷸드 그리고 반복되는 타이핑 그리고 반복되는 디버깅을 얼마나 많이 경험했는지 모릅니다. 프로젝트 내부에 아주 조그만한 버그를 잡기 위해 코드를 조금 고치고 프로젝트의 여러  실행단계(로그인 프로세스등등..)를 거쳐서 정말 테스트 하고 싶은 부분을 테스트 한 후 다시 돌아와 디버깅을 해야 하는 경우.. 아무리 앞의 단계를 단순히 한다고해도 정말 짜증나느 일이었죠. 기본적으로 UnitTest화 하여 분리하여 테스트 하는 것이 맞지만 프로젝트를 진행하다보면 그렇게 똑 부러지게 분리되지 않는 경우도 많죠... 그런 경우 이런 테스트 자동화를 통해 어느정도 해결할 수 있지 않을까 합니다. &lt;/p&gt;
&lt;p id=&quot;t0pm41&quot; mce_keep=&quot;true&quot;&gt;  물론 Unit Test 도 이런 UI 테스트 자동화도 추가적인 코드가 들어가고 자칫 번잡해질 수도 있지만 규모가 큰 프로젝트일 수록 복잡한 프로젝트일 수록 미리미리 이런 것들을 준비해놓는 것이 프로젝트 막판에 패닉상태로 빠지지 않는 지름길이 아닐까 합니다.&lt;/p&gt;
&lt;p id=&quot;t0pm41&quot; mce_keep=&quot;true&quot;&gt;  Unit Test를 쓰고 안쓰고 UI 테스트 자동화를 하고 안하고는 전적으로 개발자 본인이나 프로젝트 매니저가 선택할 일이지만 일단 사용하려고 하였을 때 제가 번역한 글이 조금이나마 도움이 되길 바랍니다. &lt;/p&gt;
&lt;p id=&quot;t0pm41&quot; mce_keep=&quot;true&quot;&gt;  그럼.. 마지막으로 제가 이 글을 번역하면서 따라한 테스트 프로젝트를 다시 한번 추가 시켜 놓도록 하겠습니다. &lt;/p&gt;
&lt;p id=&quot;t0pm41&quot; mce_keep=&quot;true&quot;&gt;프로젝트를 실행해보는 방법은 먼저 웹프로젝트를 실행시킨뒤 Test를 실행시키시면 됩니다. 그럼..&lt;/p&gt;
&lt;p id=&quot;t0pm41&quot; mce_keep=&quot;true&quot;&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://error1001.tistory.com/attachment/4966a3ef9cb46EN.zip&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/zip.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; UIAutomationTest(2).zip&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p id=&quot;t0pm41&quot; mce_keep=&quot;true&quot;&gt;                                                                                                                                  - smile -&lt;/p&gt;
&lt;p id=&quot;t0pm41&quot; mce_keep=&quot;true&quot;&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;bf0u43&quot;&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div id=&quot;cd221&quot;&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;</description>
			<category>Tip</category>
			<category>automation</category>
			<category>silverlight</category>
			<category>UI</category>
			<category>UIAutomation</category>
			<category>실버라이트</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/49</guid>
			<comments>http://error1001.com/49#entry49comment</comments>
			<pubDate>Fri, 09 Jan 2009 10:10:51 +0900</pubDate>
		</item>
		<item>
			<title>[번역] 실버라이트에서의 UI Automation - 사용자 인터랙션 시뮬레이션</title>
			<link>http://error1001.com/48</link>
			<description>&lt;br /&gt;
이 글은 다음 링크의 글을 번역한 글입니다. &lt;br /&gt;
&lt;br /&gt;
&lt;a href=&quot;http://blogs.msdn.com/gisenberg/archive/2008/07/12/ui-automation-in-silverlight-simulating-user-interactions.aspx&quot;&gt;http://blogs.msdn.com/gisenberg/archive/2008/07/12/ui-automation-in-silverlight-simulating-user-interactions.aspx&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
최근에 저는 한 임시 그룹에서 실버라이트 리치 인터넷 에플리케이션(RIAs)의 자동화에 대한 일을 맡았습니다. 공중에 발표된 몇가지 툴들은 이 점에서 제한된 도움만을 제공해주고 있습니다.  예를 들면 실버라이트는 컨트롤을 제작 중 Unit Test를 사용할 수 있습니다. 다음 링크에서 좀 더 자세한 것을 알 수 있습니다. &lt;br /&gt;
&lt;a id=&quot;yduj&quot; href=&quot;http://www.jeff.wilcox.name/2008/03/31/silverlight2-unit-testing/&quot;&gt;http://www.jeff.wilcox.name/2008/03/31/silverlight2-unit-testing/&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
불행하게도 저의 요구사항은 자동화 시나리오를 가능하게 하는 것입니다. 우리는 RIA의 안 밖에서 마우스를 움직이거나, 어떤 것을 클릭하거나, 제 3자의 인증공급자로 간다거나, 어떤 키들을 입력하는 등의 몇몇 사용자 흐름을 시뮬레이션 해야만 합니다.&lt;br /&gt;
&lt;br /&gt;
실버라이트에서의 UI 자동화는 여기선 뜨겁게 떠오르는 주제가 되었습니다. 실버라이트 Beta2의 발표와 함께 우리는 갈만한 셋길을 발견하기 시작했습니다. 보다 정확히, 우리는 UI자동화를 하는 WPF의 방법을 조금씩 볼 수 있게 되었습니다. 여러분이 만약 이 글을 같이 따라오기 원한다면 UISpy를 설치하셔야 할 것입니다.(&lt;a id=&quot;u.ui&quot; href=&quot;http://blogs.msdn.com/windowssdk/archive/2008/02/18/where-is-uispy-exe.aspx&quot;&gt;http://blogs.msdn.com/windowssdk/archive/2008/02/18/where-is-uispy-exe.aspx&lt;/a&gt;).&lt;br /&gt;
&lt;br /&gt;
마이크로소프트 UI 자동화 어셈블리는 .Net 프레임워크 3.0 과 함께 릴리즈 되었습니다. 전통적으로 우리는 실버라이트 에플리케이션와 함께 아주 먼곳에 있지 않은 Microsoft Active Accessibility(MSAA)와 작동하는 다양한 COM 랩퍼(wrappers)를 가지고 있습니다.  만약 WPF에서 UI 자동화를 조금이라도 해보았다면 앞으로 편하게 이해하실 수 있을 겁니다. 그래서 더 깊게 고려하지 않고 바로 UIA 작업을 시작해보도록 하겠습니다. &lt;br /&gt;
&lt;br /&gt;
첫번째로 Visual Studio 2008 에서 새로운 테스트 프로젝트를 시작합니다. 실버라이트에서 UI 자동화 에플리케이션을 시작하기위해 필요한 UIA 네임스페이스는 System.Windows.Automation과 System.Windows.Automation.Providers 입니다. 그리고 관련된 부분을 얻기 위해 닷넷 3.0 이상에 포함된 다음 어셈블리들을 참조로 추가 해야만합니다. &lt;br /&gt;

&lt;p id=&quot;f16m&quot;&gt;    - UIAutomationProvider.dll &lt;/p&gt;
&lt;p id=&quot;dsbp&quot;&gt;   - UIAutomationClient.dll&lt;/p&gt;
&lt;p id=&quot;yzjx&quot;&gt;   - UIAutomationClientsideProviders.dll&lt;/p&gt;
&lt;p id=&quot;yzjx0&quot;&gt;   - UIAutomationTypes.dll&lt;br /&gt;
&lt;br /&gt;
 실버라이트 커스텀 컨트롤의 자동화가 필요하다고 합시다. 컨트롤의 접근가능한 기능들을 조정하기 위한 Peer Type을 반환해주기 위해 (Control 클래스로 부터) OnCreateAutomationPeer 메소드를 오버라이드 해야만 합니다. 접근가능한 기능(?)들은 에플리케이션을 자동화할 수 있게 하는 Key가 될 것이기 때문에 이 작업은 매우 중요합니다.&lt;br /&gt;
&lt;br /&gt;
  텍스트 박스와 검색버튼으로 이루어진 가상의 검색 컨트롤을 가정합니다.&lt;/p&gt;
&lt;div id=&quot;zd330&quot; style=&quot;BACKGROUND: silver; COLOR: black; FONT-FAMILY: consolas&quot;&gt;
&lt;div id=&quot;a26o&quot; style=&quot;BACKGROUND: silver; COLOR: black; FONT-FAMILY: consolas&quot;&gt;
&lt;p id=&quot;a26o0&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    &lt;span id=&quot;a26o1&quot; style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span id=&quot;a26o2&quot; style=&quot;COLOR: blue&quot;&gt;partial&lt;/span&gt; &lt;span id=&quot;a26o3&quot; style=&quot;COLOR: blue&quot;&gt;class&lt;/span&gt; &lt;span id=&quot;a26o4&quot; style=&quot;COLOR: #2b91af&quot;&gt;SearchBar&lt;/span&gt; : &lt;span id=&quot;a26o5&quot; style=&quot;COLOR: #2b91af&quot;&gt;Control&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;a26o6&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    {&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p id=&quot;zd331&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;       ...&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;f2w-&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/p&gt;
&lt;div id=&quot;kl:4&quot; style=&quot;FONT-SIZE: 8pt; BACKGROUND: silver; COLOR: black; FONT-FAMILY: consolas&quot;&gt;
&lt;p id=&quot;kl:40&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        &lt;span id=&quot;kl:41&quot; style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; SearchBar()&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;kl:42&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;kl:43&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;kl:44&quot; style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.GotFocus += (sender, args)&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;kl:45&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;                =&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;kl:46&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;                {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;kl:47&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;                    &lt;span id=&quot;kl:48&quot; style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.SearchText.Focus();&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;kl:49&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;                };&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;kl:410&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;kl:411&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            InitializeComponent();&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;kl:412&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        }&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;!--EndFragment--&gt;
&lt;p id=&quot;a26o7&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;zd332&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;       &lt;span id=&quot;zd333&quot; style=&quot;COLOR: blue&quot;&gt;protected&lt;/span&gt; &lt;span id=&quot;zd334&quot; style=&quot;COLOR: blue&quot;&gt;override&lt;/span&gt; &lt;span id=&quot;zd335&quot; style=&quot;COLOR: #2b91af&quot;&gt;AutomationPeer&lt;/span&gt; OnCreateAutomationPeer()&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;zd336&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;       {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;zd337&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;           &lt;span id=&quot;zd338&quot; style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span id=&quot;zd339&quot; style=&quot;COLOR: blue&quot;&gt;new&lt;/span&gt; &lt;span id=&quot;zd3310&quot; style=&quot;COLOR: #2b91af&quot;&gt;SearchBarAutomationPeer&lt;/span&gt;(&lt;span id=&quot;zd3311&quot; style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;);&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;zd3312&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;       }&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;a26o8&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    }&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p id=&quot;yzjx0&quot;&gt;여기서 Override한 OnCreateAutomationPeer는 접근 가능 기능들을 위한 컨트롤 트리를 감시하는 것(결론적으로 automation 함수들)에 의해 불려지게 될 것입니다. Peer객체는 접근성이 필요한 것에 밀착하는 의미로(?) 컨트롤의 조합을 반환할 책임을 지게됩니다.( The Peer object will be responsible for returning your combination of controls in a manner that is coherent to anything that needs accessibility. )&lt;br /&gt;
&lt;br /&gt;
또 여기서 이 Control의 GotFocus 핸들러를 컨트롤의 default .Focus() 동작에 설정하기 위해 엮어두었습니다.&lt;br /&gt;
&lt;br /&gt;
다음으로 SearchBarAutomationPeer 클래스의 구현 부분을 봅시다.&lt;/p&gt;
&lt;div id=&quot;cdka&quot; style=&quot;BACKGROUND: silver; COLOR: black; FONT-FAMILY: consolas&quot;&gt;
&lt;p id=&quot;cdka0&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    &lt;span id=&quot;cdka1&quot; style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span id=&quot;cdka2&quot; style=&quot;COLOR: blue&quot;&gt;class&lt;/span&gt; &lt;span id=&quot;cdka3&quot; style=&quot;COLOR: #2b91af&quot;&gt;SearchBarAutomationPeer&lt;/span&gt; : &lt;span id=&quot;cdka4&quot; style=&quot;COLOR: #2b91af&quot;&gt;FrameworkElementAutomationPeer&lt;/span&gt;, &lt;span id=&quot;cdka5&quot; style=&quot;COLOR: #2b91af&quot;&gt;IValueProvider&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;cdka7&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    {&lt;/font&gt;&lt;/p&gt;
&lt;div id=&quot;sge:&quot; style=&quot;BACKGROUND: silver; COLOR: black; FONT-FAMILY: consolas&quot;&gt;
&lt;p id=&quot;sge:0&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        &lt;span id=&quot;sge:1&quot; style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; SearchBarAutomationPeer(&lt;span id=&quot;sge:2&quot; style=&quot;COLOR: #2b91af&quot;&gt;SearchBar&lt;/span&gt; searchBar) : &lt;span id=&quot;sge:3&quot; style=&quot;COLOR: blue&quot;&gt;base&lt;/span&gt;(searchBar)&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;sge:4&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;sge:5&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        }&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p id=&quot;yzjx0&quot;&gt;&lt;br /&gt;
Peer 클래스는 작업하는데 필요할 모든 메소드를 제공하는 FrameworkElementAutomationPeer 로 부터 상속 받아야 합니다. 그리고 이 컨트롤의 구성요소중 TextBox와의 인터랙션을 위해 IValueProvider 와 맵핑이 필요합니다. 다음 링크에서 Provider 인터페이스와 개개의 구성요소와의 맵핑에 관해 더 알 수 있습니다. &lt;br /&gt;
&lt;a id=&quot;bh9g&quot; href=&quot;http://msdn.microsoft.com/en-us/library/system.windows.automation.provider.aspx&quot;&gt;http://msdn.microsoft.com/en-us/library/system.windows.automation.provider.aspx&lt;/a&gt;&lt;br /&gt;
&lt;br /&gt;
컨트롤 트리에서 우리 컨트롤을 찾기 위해선 컨트롤에 클래스 이름과 접근 가능한 구별자(accessibility identifier)를 주는 것이 필요합니다. 이것을 하기 위해서는 FrameworkElementAutomationPeer의 GetAutomationIdCore() 와 GetClassNameCore() 함수를 오버라이드 해야만 합니다. &lt;br /&gt;
&lt;/p&gt;
&lt;div id=&quot;d1v40&quot; style=&quot;BACKGROUND: silver; COLOR: black; FONT-FAMILY: consolas&quot;&gt;
&lt;p id=&quot;d1v41&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        &lt;span id=&quot;d1v42&quot; style=&quot;COLOR: blue&quot;&gt;protected&lt;/span&gt; &lt;span id=&quot;d1v43&quot; style=&quot;COLOR: blue&quot;&gt;override&lt;/span&gt; &lt;span id=&quot;d1v44&quot; style=&quot;COLOR: blue&quot;&gt;string&lt;/span&gt; GetAutomationIdCore()&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;d1v45&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;d1v46&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;d1v47&quot; style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span id=&quot;d1v418&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;SearchBar&quot;&lt;/span&gt;; // You&#039;re going to want to make this unique. ;)&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;d1v49&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        }&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;d1v410&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;d1v411&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        &lt;span id=&quot;d1v412&quot; style=&quot;COLOR: blue&quot;&gt;protected&lt;/span&gt; &lt;span id=&quot;d1v413&quot; style=&quot;COLOR: blue&quot;&gt;override&lt;/span&gt; &lt;span id=&quot;d1v414&quot; style=&quot;COLOR: blue&quot;&gt;string&lt;/span&gt; GetClassNameCore()&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;d1v415&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;d1v416&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;d1v417&quot; style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span id=&quot;r1w4&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;SearchBar&quot;&lt;/span&gt;;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;d1v419&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        }&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;i:v3&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/p&gt;
&lt;div id=&quot;i:v30&quot; style=&quot;BACKGROUND: silver; COLOR: black; FONT-FAMILY: consolas&quot;&gt;
&lt;p id=&quot;i:v31&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        &lt;span id=&quot;i:v32&quot; style=&quot;COLOR: blue&quot;&gt;protected&lt;/span&gt; &lt;span id=&quot;i:v33&quot; style=&quot;COLOR: blue&quot;&gt;override&lt;/span&gt; &lt;span id=&quot;i:v34&quot; style=&quot;COLOR: blue&quot;&gt;bool&lt;/span&gt; IsKeyboardFocusableCore()&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;i:v35&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;i:v36&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;i:v37&quot; style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span id=&quot;i:v38&quot; style=&quot;COLOR: blue&quot;&gt;true&lt;/span&gt;;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;i:v39&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        }&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p id=&quot;yzjx0&quot;&gt;IsKeyboardFocusableCore 는 꼭 override해야만 함수로 만약 이 함수가 없다면 컨트롤의 SetFocus() 함수의 호출이 실패하게 될 것입니다.  이제 Provider 인터페이스의 구현에 대해서도 생각해봐야 합니다. 생성자에서 건네 받은 SearchBar는 base.Owner 프로퍼티를 통해 얻어 올 수 있습니다. base.Owner로 부터 SearchBar를 매번 캐스팅 하는 단조로움을 피하기 위해 프로퍼티를 하나 추가할 것입니다. &lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;
&lt;div id=&quot;m58.&quot; style=&quot;BACKGROUND: silver; COLOR: black; FONT-FAMILY: consolas&quot;&gt;
&lt;p id=&quot;m58.0&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        &lt;span id=&quot;m58.1&quot; style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span id=&quot;m58.2&quot; style=&quot;COLOR: #2b91af&quot;&gt;SearchBar&lt;/span&gt; SearchBar&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;m58.3&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;m58.4&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;m58.5&quot; style=&quot;COLOR: blue&quot;&gt;get&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;m58.6&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;m58.7&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;                &lt;span id=&quot;m58.8&quot; style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; (&lt;span id=&quot;m58.9&quot; style=&quot;COLOR: #2b91af&quot;&gt;SearchBar&lt;/span&gt;)&lt;span id=&quot;m58.10&quot; style=&quot;COLOR: blue&quot;&gt;base&lt;/span&gt;.Owner;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;m58.11&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            }&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;m58.12&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        }&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;m58.13&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;m58.14&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt; &lt;span id=&quot;pxks&quot; style=&quot;COLOR: blue&quot;&gt;       #region&lt;/span&gt; IValueProvider Members&lt;/font&gt;&lt;/p&gt;
&lt;div id=&quot;pxks0&quot; style=&quot;BACKGROUND: silver; COLOR: black; FONT-FAMILY: consolas&quot;&gt;
&lt;p id=&quot;pxks1&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks2&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        &lt;span id=&quot;pxks3&quot; style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span id=&quot;pxks4&quot; style=&quot;COLOR: blue&quot;&gt;bool&lt;/span&gt; IsReadOnly&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks5&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks6&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;pxks7&quot; style=&quot;COLOR: blue&quot;&gt;get&lt;/span&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks8&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks9&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;                &lt;span id=&quot;pxks10&quot; style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span id=&quot;pxks11&quot; style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.SearchBar.SearchText.IsReadOnly;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks12&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            }&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks13&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        }&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks14&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks15&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        &lt;span id=&quot;pxks16&quot; style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span id=&quot;pxks17&quot; style=&quot;COLOR: blue&quot;&gt;void&lt;/span&gt; SetValue(&lt;span id=&quot;pxks18&quot; style=&quot;COLOR: blue&quot;&gt;string&lt;/span&gt; value)&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks19&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks20&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;pxks21&quot; style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.SearchBar.SearchText.Text = value;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks22&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        }&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks23&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks24&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        &lt;span id=&quot;pxks25&quot; style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span id=&quot;pxks26&quot; style=&quot;COLOR: blue&quot;&gt;string&lt;/span&gt; Value&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks27&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks28&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;pxks29&quot; style=&quot;COLOR: blue&quot;&gt;get&lt;/span&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks30&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks31&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;                &lt;span id=&quot;pxks32&quot; style=&quot;COLOR: blue&quot;&gt;return&lt;/span&gt; &lt;span id=&quot;pxks33&quot; style=&quot;COLOR: blue&quot;&gt;this&lt;/span&gt;.SearchBar.SearchText.Text;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks34&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            }&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks35&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        }&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks36&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;pxks37&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;span id=&quot;pxks38&quot; style=&quot;COLOR: blue&quot;&gt;&lt;font size=&quot;2&quot;&gt;        #endregion&lt;/font&gt;&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p id=&quot;yzjx0&quot;&gt;이제 UISpy로 우리 컨트로을 보게 되면 다음과 같이 볼 수 있을 겁니다. &lt;br /&gt;
&lt;/p&gt;
&lt;p id=&quot;t0pm1&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/p&gt;
&lt;font size=&quot;2&quot;&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #eeeeee 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #eeeeee 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #eeeeee 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #eeeeee 1px solid; BACKGROUND-COLOR: #eeeeee&quot;&gt;
&lt;p id=&quot;t0pm1&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;Identification   &lt;br /&gt;
    ClassName:    &lt;span id=&quot;t0pm2&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;SearchBar&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm3&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    ControlType:    &lt;span id=&quot;t0pm4&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;ControlType.Custom&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm5&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    Culture:    &lt;span id=&quot;t0pm6&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;(null)&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm7&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    AutomationId:    &lt;span id=&quot;t0pm8&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;SearchBar&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm9&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    LocalizedControlType:    &lt;span id=&quot;t0pm10&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;custom&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm11&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    Name:    &lt;span id=&quot;t0pm12&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;SearchBar&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm13&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    ProcessId:    &lt;span id=&quot;t0pm14&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;2276 (iexplore)&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm15&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    RuntimeId:    &lt;span id=&quot;t0pm16&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;42 197110 6&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm17&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    IsPassword:    &lt;span id=&quot;t0pm18&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;False&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm19&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    IsControlElement:    &lt;span id=&quot;t0pm20&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;True&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm21&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    IsContentElement:    &lt;span id=&quot;t0pm22&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;True&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm23&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm24&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font id=&quot;t0pm25&quot; color=&quot;#000000&quot;&gt;&lt;font size=&quot;2&quot;&gt;  &lt;span id=&quot;t0pm26&quot; style=&quot;COLOR: #2b91af&quot;&gt;&lt;font id=&quot;dglh3&quot; color=&quot;#000000&quot;&gt;Visibility&lt;/font&gt;&lt;/span&gt;&lt;/font&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm27&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    BoundingRectangle:    &lt;span id=&quot;t0pm28&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;(356, 286, 949, 36)&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm29&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    ClickablePoint:    &lt;span id=&quot;t0pm30&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;830,304&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm31&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    IsOffscreen:    &lt;span id=&quot;t0pm32&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;False&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm33&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm34&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;ControlPatterns&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm35&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;  Value&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm36&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    Value:    &lt;span id=&quot;t0pm37&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;t0pm38&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;    IsReadOnly:    &lt;span id=&quot;t0pm39&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;False&quot;&lt;/span&gt;&lt;/font&gt;&lt;/p&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;/font&gt;&lt;p id=&quot;t0pm1&quot; style=&quot;MARGIN: 0px&quot;&gt; &lt;/p&gt;
&lt;p id=&quot;yzjx0&quot;&gt;ControlPatterns 아래 &quot;Vaule&quot; 프로퍼티는 자동적으로 IValueProvider 인터페이스로 인해 우리 컨트롤의 TextBox 의 Vaule와 맵핑됩니다. 깔끔하죠?&lt;br /&gt;
&lt;br /&gt;
이제 이 커스텀 컨트롤의 배관이 가능하게 되었습니다. 이제 TestMethod를 살펴봅시다. &lt;/p&gt;
&lt;div id=&quot;z0y82&quot; style=&quot;BACKGROUND: silver; COLOR: black; FONT-FAMILY: consolas&quot;&gt;
&lt;p id=&quot;z0y83&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        [&lt;span id=&quot;z0y84&quot; style=&quot;COLOR: #2b91af&quot;&gt;TestMethod&lt;/span&gt;]&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;z0y85&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        &lt;span id=&quot;z0y86&quot; style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span id=&quot;z0y87&quot; style=&quot;COLOR: blue&quot;&gt;void&lt;/span&gt; TestMethod1()&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;z0y88&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;z0y89&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;z0y810&quot; style=&quot;COLOR: #2b91af&quot;&gt;Process&lt;/span&gt; process = System.Diagnostics.&lt;span id=&quot;z0y811&quot; style=&quot;COLOR: #2b91af&quot;&gt;Process&lt;/span&gt;.GetProcessesByName(&lt;span id=&quot;z0y812&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;iexplore&quot;&lt;/span&gt;).First();&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;z0y813&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;z0y814&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;z0y815&quot; style=&quot;COLOR: #2b91af&quot;&gt;AutomationElement&lt;/span&gt; browserInstance = System.Windows.Automation.&lt;span id=&quot;z0y816&quot; style=&quot;COLOR: #2b91af&quot;&gt;AutomationElement&lt;/span&gt;.FromHandle(process.MainWindowHandle);&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;z0y817&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;z0y818&quot; style=&quot;COLOR: #2b91af&quot;&gt;TreeWalker&lt;/span&gt; tw = &lt;span id=&quot;z0y819&quot; style=&quot;COLOR: blue&quot;&gt;new&lt;/span&gt; &lt;span id=&quot;z0y820&quot; style=&quot;COLOR: #2b91af&quot;&gt;TreeWalker&lt;/span&gt;(&lt;span id=&quot;z0y821&quot; style=&quot;COLOR: blue&quot;&gt;new&lt;/span&gt; &lt;span id=&quot;z0y822&quot; style=&quot;COLOR: #2b91af&quot;&gt;PropertyCondition&lt;/span&gt;(&lt;span id=&quot;z0y823&quot; style=&quot;COLOR: #2b91af&quot;&gt;AutomationElement&lt;/span&gt;.ClassNameProperty, &lt;span id=&quot;z0y824&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;SearchBar&quot;&lt;/span&gt;));&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;z0y825&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;z0y826&quot; style=&quot;COLOR: #2b91af&quot;&gt;AutomationElement&lt;/span&gt; searchBar = tw.GetFirstChild(browserInstance);&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;z0y827&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;z0y828&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            myElement.SetFocus(); &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;m260&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;z0y834&quot; style=&quot;COLOR: #2b91af&quot;&gt;Thread&lt;/span&gt;.Sleep(1000);&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;z0y835&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            searchBar.SetFocus();&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;z0y836&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;z0y839&quot; style=&quot;COLOR: #2b91af&quot;&gt;Thread&lt;/span&gt;.Sleep(1000);&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;z0y840&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;z0y841&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;z0y842&quot; style=&quot;COLOR: #2b91af&quot;&gt;SendKeys&lt;/span&gt;.SendWait(&lt;span id=&quot;z0y843&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;Hello, world!&quot;&lt;/span&gt;);&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;z0y846&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        }&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p id=&quot;yzjx0&quot;&gt;이 부분에서 몇가지 질문이 생기는 분이 계실지 모르겠습니다. 예를 들면 &quot;왜 내가 IValueProvider를 구현했을까?&quot;. 위의 코드 조각은 사용자 입력을 시뮬레이션 합니다. 먄약 저것이 우리 것이 아니라면 ValuePattern 으로 부터 와야합니다. 개인적으로, 저는 ValuePattern/TryGetCurrentPattern/etc 의 상호작용을 알아냈고 꽤 거추장스러운 전체 경험을 발견했습니다.  밑에 코드에서 제가 뜻하는 바를 알 수 있을 겁니다. &lt;/p&gt;
&lt;div id=&quot;n79t0&quot; style=&quot;BACKGROUND: silver; COLOR: black; FONT-FAMILY: consolas&quot;&gt;
&lt;p id=&quot;n79t1&quot; style=&quot;MARGIN: 0px&quot;&gt; &lt;font size=&quot;2&quot;&gt;       [&lt;span id=&quot;n79t2&quot; style=&quot;COLOR: #2b91af&quot;&gt;TestMethod&lt;/span&gt;]&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;n79t3&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        &lt;span id=&quot;n79t4&quot; style=&quot;COLOR: blue&quot;&gt;public&lt;/span&gt; &lt;span id=&quot;n79t5&quot; style=&quot;COLOR: blue&quot;&gt;void&lt;/span&gt; TestMethod1()&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;n79t6&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        {&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;n79t7&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;n79t8&quot; style=&quot;COLOR: #2b91af&quot;&gt;Process&lt;/span&gt; process = System.Diagnostics.&lt;span id=&quot;n79t9&quot; style=&quot;COLOR: #2b91af&quot;&gt;Process&lt;/span&gt;.GetProcessesByName(&lt;span id=&quot;n79t10&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;iexplore&quot;&lt;/span&gt;).First();&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;n79t11&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;n79t12&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;n79t13&quot; style=&quot;COLOR: #2b91af&quot;&gt;AutomationElement&lt;/span&gt; myElement = System.Windows.Automation.&lt;span id=&quot;n79t14&quot; style=&quot;COLOR: #2b91af&quot;&gt;AutomationElement&lt;/span&gt;.FromHandle(process.MainWindowHandle);&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;n79t15&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;n79t16&quot; style=&quot;COLOR: #2b91af&quot;&gt;TreeWalker&lt;/span&gt; tw = &lt;span id=&quot;n79t17&quot; style=&quot;COLOR: blue&quot;&gt;new&lt;/span&gt; &lt;span id=&quot;n79t18&quot; style=&quot;COLOR: #2b91af&quot;&gt;TreeWalker&lt;/span&gt;(&lt;span id=&quot;n79t19&quot; style=&quot;COLOR: blue&quot;&gt;new&lt;/span&gt; &lt;span id=&quot;n79t20&quot; style=&quot;COLOR: #2b91af&quot;&gt;PropertyCondition&lt;/span&gt;(&lt;span id=&quot;n79t21&quot; style=&quot;COLOR: #2b91af&quot;&gt;AutomationElement&lt;/span&gt;.ClassNameProperty, &lt;span id=&quot;n79t22&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;SearchBar&quot;&lt;/span&gt;));&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;n79t23&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;n79t24&quot; style=&quot;COLOR: #2b91af&quot;&gt;AutomationElement&lt;/span&gt; searchBar = tw.GetFirstChild(myElement);&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;n79t25&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt; &lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;n79t26&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            &lt;span id=&quot;n79t27&quot; style=&quot;COLOR: blue&quot;&gt;object&lt;/span&gt; valuePattern;&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;n79t28&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            searchBar.TryGetCurrentPattern(&lt;span id=&quot;n79t29&quot; style=&quot;COLOR: #2b91af&quot;&gt;ValuePattern&lt;/span&gt;.Pattern, &lt;span id=&quot;n79t30&quot; style=&quot;COLOR: blue&quot;&gt;out&lt;/span&gt; valuePattern);&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;n79t31&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;            ((&lt;span id=&quot;n79t32&quot; style=&quot;COLOR: #2b91af&quot;&gt;ValuePattern&lt;/span&gt;)valuePattern).SetValue(&lt;span id=&quot;n79t33&quot; style=&quot;COLOR: #a31515&quot;&gt;&quot;Hello, world!&quot;&lt;/span&gt;);&lt;/font&gt;&lt;/p&gt;
&lt;p id=&quot;n79t34&quot; style=&quot;MARGIN: 0px&quot;&gt;&lt;font size=&quot;2&quot;&gt;        }&lt;/font&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p id=&quot;p_vp&quot;&gt;&lt;br /&gt;
 이글이 결코 이해하기 좋은 가이드라인은 아니지만 UI 자동화가 어떻게 진행되는지 관심이 있는 몇몇 분들에게는 충분할 것이라는 생각이 듭니다. &lt;br /&gt;
&lt;br /&gt;
----------------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
 흠냐... 번역이 좀 엉터리인 부분이 있고.. 글도 생각보다 어려워서 좀 걱정이 되는군요. 또 마지막 부분은 저도 이해하지 못한 부분이고 구현도 되지 않아서 여러분의 도움을 요청합니다.^^;;&lt;/p&gt;
&lt;p id=&quot;p_vp&quot;&gt;  일단 따라해본 샘플 프로젝트를 첨부합니다. &lt;/p&gt;
&lt;p id=&quot;p_vp&quot;&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://error1001.tistory.com/attachment/496693346993dCW.zip&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/zip.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; UIAutomationTest.zip&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p id=&quot;p_vp&quot;&gt;
&lt;br /&gt;
  Part2 가 있어서 조금더 쉽게 구현하는 방법이 소개 되어있으니 그 부분만 따라하셔도 아마 자동화 부분은 해결하실 수 있으실 것이라 봅니다. 그럼..^^&lt;br /&gt;
&lt;br /&gt;
                                                                                                                         - smile -&lt;br /&gt;
&lt;br /&gt;
&lt;/p&gt;</description>
			<category>Tip</category>
			<category>automation</category>
			<category>silverlight</category>
			<category>UIAutomation</category>
			<category>실버라이트</category>
			<category>자동화</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/48</guid>
			<comments>http://error1001.com/48#entry48comment</comments>
			<pubDate>Fri, 09 Jan 2009 08:59:00 +0900</pubDate>
		</item>
		<item>
			<title>UI Automation에 관련된 글.</title>
			<link>http://error1001.com/47</link>
			<description>&lt;br /&gt;
&lt;A href=&quot;http://blogs.msdn.com/gisenberg/archive/2008/07/17/ui-automation-in-silverlight-part-ii-the-easy-way.aspx&quot;&gt;http://blogs.msdn.com/gisenberg/archive/2008/07/17/ui-automation-in-silverlight-part-ii-the-easy-way.aspx&lt;/A&gt;&lt;br /&gt;
&lt;br /&gt;&lt;A href=&quot;http://blogs.msdn.com/gisenberg/archive/2008/07/12/ui-automation-in-silverlight-simulating-user-interactions.aspx&quot;&gt;http://blogs.msdn.com/gisenberg/archive/2008/07/12/ui-automation-in-silverlight-simulating-user-interactions.aspx&lt;/A&gt;&lt;br /&gt;
&lt;br /&gt;이제 공부해야지.^^;;</description>
			<category>Tip</category>
			<category>automation</category>
			<category>silverlight</category>
			<category>UI</category>
			<category>UIAutomation</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/47</guid>
			<comments>http://error1001.com/47#entry47comment</comments>
			<pubDate>Mon, 05 Jan 2009 22:34:32 +0900</pubDate>
		</item>
		<item>
			<title>Dependecy Property에 관한 블로그</title>
			<link>http://error1001.com/46</link>
			<description>NinZhang 님이 아주 잘 정리해 놓으셨군요..^^&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
WPF 에서의 Dependency Property:&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;msg 1st&quot;&gt;
&lt;a href=&quot;http://blog.ningzhang.org/2008/11/dependencyproperty-validation-coercion.html&quot;&gt;http://blog.ningzhang.org/2008/11/dependencyproperty-validation-coercion.html&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;msg 1st&quot;&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div class=&quot;msg 1st&quot;&gt;
Silverlight에서의 Dependency Property&lt;/div&gt;
&lt;div class=&quot;msg Nth&quot;&gt;
&lt;a href=&quot;http://blog.ningzhang.org/2008/11/dependencyproperty-validation-coercion_10.html&quot;&gt;http://blog.ningzhang.org/2008/11/dependencyproperty-validation-coercion_10.html&lt;/a&gt;&lt;/div&gt;
&lt;div class=&quot;msg Nth&quot;&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div class=&quot;msg Nth&quot;&gt;
Silverlight에서의 Coerce와 Validate 채크&lt;/div&gt;
&lt;div class=&quot;msg Nth&quot;&gt;
&lt;a href=&quot;http://blog.ningzhang.org/2008/11/dependencyproperty-validation-coercion_14.html&quot;&gt;http://blog.ningzhang.org/2008/11/dependencyproperty-validation-coercion_14.html&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;</description>
			<category>Tip</category>
			<category>DependencyProperty</category>
			<category>silverlight</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/46</guid>
			<comments>http://error1001.com/46#entry46comment</comments>
			<pubDate>Fri, 02 Jan 2009 10:04:21 +0900</pubDate>
		</item>
		<item>
			<title>Ninjection 에 대한 포스트 및 동영상</title>
			<link>http://error1001.com/45</link>
			<description>&lt;div&gt;
동영상 링크.&lt;/div&gt;
&lt;a href=&quot;http://dimecasts.net/Content/WatchEpisode/27&quot;&gt;http://dimecasts.net/Content/WatchEpisode/27&lt;/a&gt; &lt;div&gt;
&lt;br /&gt;&lt;/div&gt;
&lt;div&gt;포스트&lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;http://frickinsweet.com/ryanlanciaux.com/post/Real-Ultimate-Power--Dependency-Injection-with-Ninject.aspx&quot;&gt;http://frickinsweet.com/ryanlanciaux.com/post/Real-Ultimate-Power--Dependency-Injection-with-Ninject.aspx&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;
그밖에 Dependency 에 관련된 포스트&lt;/div&gt;
&lt;div&gt;&lt;a href=&quot;http://arload.wordpress.com/2008/12/07/dependency_managment/#more-507&quot;&gt;http://arload.wordpress.com/2008/12/07/dependency_managment/#more-507&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;&lt;br /&gt;
&lt;/div&gt;&lt;div&gt;
&lt;br /&gt;&lt;/div&gt;</description>
			<category>Tip</category>
			<category>Dependency</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/45</guid>
			<comments>http://error1001.com/45#entry45comment</comments>
			<pubDate>Fri, 02 Jan 2009 09:45:38 +0900</pubDate>
		</item>
		<item>
			<title>Silverlight Bugs and Workarounds</title>
			<link>http://error1001.com/44</link>
			<description>&lt;a href=&quot;http://blogs.msdn.com/silverlight_sdk/pages/silverlight-bugs-and-workarounds.aspx&quot;&gt;http://blogs.msdn.com/silverlight_sdk/pages/silverlight-bugs-and-workarounds.aspx&lt;/a&gt;&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
잊지 말자 버그들..!!&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
얼마전에 아무 생각없이 고생한 부분이 있어 이렇게 링크를 걸어놉니다. &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
정리하자면.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
1. MultiScaleImage.AspectRatio 가 Custom MultiScaleTileSource를 썼을 경우 정확하지 않다는 것.&lt;/div&gt;
&lt;div&gt;
2. Mac에서 Safari3나 FireFox3로 MBR(Multi Bit Rate) Video Play시 Freezing.&lt;/div&gt;
&lt;div&gt;
3. Custom Control에 ScrollViewer.VerticalScrollBarVisibility/HorizontalScrollBarVisibility 속성 추가가 안됨.&lt;/div&gt;
&lt;div&gt;
4. 동적으로 Image 추가,삭제시 메모리 누수현상(제거시 Image.Source = null 로 셋팅)&lt;/div&gt;
&lt;div&gt;
5. 많은 컨트롤을 동시에 에니메이션할 경우 StackOverFlowException 발생. (Dispatcher.BeginInvoke를 통한 VisualStateManger.GotoState 호출)&lt;/div&gt;
&lt;div&gt;
6. 낮은 Bandwidth에서 Media를 빠르게 Seeking시의 깨짐 현상.&lt;/div&gt;
&lt;div&gt;
7. ImageSource나 ImageBrush 에 event 설정시 메모리 누수.(event listener 들 제거)&lt;/div&gt;
&lt;div&gt;
8. 파이어복스에서는 3GB 이상의 화일은 앞으로 Seek 가 되지 않음.&lt;/div&gt;
&lt;div&gt;
9. MAC에서는 3.5GB이상의 큰 화일은 Play가 되지 않음.(브라우저 지원문제)&lt;/div&gt;
&lt;div&gt;
10. BrowserHttpWebRequest 의 AllowReadStreamBuffering 속성이 false로 되어 MediaElement의 Source로 Stream 되는 경우 플레이 되지 않음.(AllowReadStreamBuffering를 true로 설정)&lt;/div&gt;
&lt;div&gt;
11. FireFox에서 &#039;%&#039;를 쓴 width,height 는 먹지 않음.&lt;/div&gt;
&lt;div&gt;
12. Brush를 상속받을 순 있으나 사용할 순 없음.(Brush는 상속받아서 쓰지 않는다.)&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
6번의 경우 얼마전에 저희 프로젝트에서도 문제가 되었는데... 원문에서는 ProgressDown에서 발생한다고 되어있는데실제로 Streaming의 경우에도 발생하였습니다. WorkAround 도 MediaFailed 이벤트시 Source를 다시 설정하고 예전 Position으로 다시 설정하면 된다고 되어있는데 Stream의 경우에는 MediaFailed 이벤트도 들어오지 않고 그냥 Closed 이벤트가 들어오더군요.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
  그래서 제가 생각한 WorkAround는 Seek를 빨리 하지 못하도록 하는 것입니다. 한 0.3-0.5 초 정도의 지연만 주면 사용하기도 불편하지 않고 위와 같은 문제도 발생하지 않더군요.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
  그럼 모두 삽질 금지..^^&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
                                                                                                                  - smile -&lt;/div&gt;</description>
			<category>Don&#039;t Panic</category>
			<category>Bug</category>
			<category>silverlight</category>
			<category>workaround</category>
			<category>버그</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/44</guid>
			<comments>http://error1001.com/44#entry44comment</comments>
			<pubDate>Mon, 29 Dec 2008 11:21:02 +0900</pubDate>
		</item>
		<item>
			<title>Custom Panel 만들기.</title>
			<link>http://error1001.com/43</link>
			<description>원래 제가 직접강좌를 쓰려고 했으나.. 외국분이 아주 잘 정리해 놓은 포스트가 있어 번역합니다. (영어공부도 할겸..^^;;)
&lt;DIV&gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&amp;nbsp;원본 링크는 다음과 같습니다.&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;A href=&quot;http://blogs.msdn.com/silverlight_sdk/archive/2008/04/03/creating-a-custom-panel.aspx&quot;&gt;&lt;/A&gt;&lt;A title=&quot;[http://blogs.msdn.com/silverlight_sdk/archive/2008/04/03/creating-a-custom-panel.aspx]로 이동합니다.&quot; href=&quot;http://blogs.msdn.com/silverlight_sdk/archive/2008/04/03/creating-a-custom-panel.aspx&quot; target=_blank&gt;http://blogs.msdn.com/silverlight_sdk/archive/2008/04/03/creating-a-custom-panel.aspx&lt;/A&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV&gt;그럼 이제 번역을 해보죠. 오역이 있더라도 이해해주시고 피드백 주시길 바랍니다.&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV&gt;----------------------------------------------------------------------------------------------------------&lt;/DIV&gt;
&lt;DIV&gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&amp;nbsp;저는 지난 몇주간&amp;nbsp;CustomPanel을 만드는 방법을 알아내려 많은 시간을 보냈습니다. 처음에 저는 매우 혼란스러웠습니다. &amp;nbsp;조그만 변경에도 제 Panel의 전체적인 Layout은 심하게 바뀌었습니다. 그러나 이렇게 한동안 어둠속에서 헤맨 끝에 드디어 빛을 본 것 같은 느낌이 들었고 그래서 제가 Custom Panel 에 대한 조언을 줄 수 있는지 알아보려고 합니다..&amp;nbsp;&amp;nbsp;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;첫번째로 Measuring 과 Arranging 에 대해 알아야만 합니다. Silverlight의 layout 시스템은 Mesure 단계에서 부터 시작합니다. 여기선 각각의 자식 Element들이 layout 시스템으로 자신의 Desired Size(원하는 사이즈: 실제 프로퍼티에 존재하는 이름임으로 앞으로는 구지 번역하지 않겠습니다. ) 를 보고합니다. 여기선 Panel 자신의 보고도 포함됩니다. 그 다음 단계는 Arrange 단계입니다. 여기선 패널 자신의 최종 사이즈를 참고하여 각각의 자식의 경계 영역(Bounding box)의 크기와 위치를 지정합니다.&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&amp;nbsp;그래서 Custom Panel을 만들기 위해서는 Panel을 상속하고&amp;nbsp;&lt;SPAN class=Apple-style-span style=&quot;FONT-SIZE: 16px; COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;&lt;A class=&quot;&quot; style=&quot;COLOR: rgb(0,75,98); TEXT-DECORATION: underline&quot; href=&quot;http://msdn2.microsoft.com/en-us/library/system.windows.frameworkelement.measureoverride(VS.95).aspx&quot; mce_href=&quot;http://msdn2.microsoft.com/en-us/library/system.windows.frameworkelement.measureoverride(VS.95).aspx&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt&quot;&gt;MeasureOverride&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt&quot;&gt;&amp;nbsp;와&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt&quot;&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;A class=&quot;&quot; style=&quot;COLOR: rgb(0,107,130); TEXT-DECORATION: none&quot; href=&quot;http://msdn2.microsoft.com/en-us/library/system.windows.frameworkelement.arrangeoverride(VS.95).aspx&quot; mce_href=&quot;http://msdn2.microsoft.com/en-us/library/system.windows.frameworkelement.arrangeoverride(VS.95).aspx&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt&quot;&gt;ArrangeOverride&lt;/SPAN&gt;&lt;/A&gt;&lt;SPAN style=&quot;FONT-SIZE: 9pt&quot;&gt;&amp;nbsp;메소드를 구현한 클래스를 만들어야만 합니다. 저는 BlockPanel이라고 이름 붙인 Panel을 만들었습니다. 3x3 블럭 엘리먼트를 만들고 각 블럭이 나란히 놓여서 Panel의 오른쪽 끝에 도달했을 때 Wrapping(줄바꿈) 되도록 하였습니다. 그리고 각각의 엘리먼트의 사이즈가 100x100 이 되도록 제한하였습니다. &amp;nbsp;각 element가 원하는 사이즈를 계산하고 블럭들을 조정하는 좀 더 복잡한 잡업을 하려고 했지만 &amp;nbsp;SDK 예제로써 코드가 너무 복잡해지고 길어졌습니다. &amp;nbsp;그래서 여기 제 Panel에서 자식들이 어떻게 정열될것인지보여주는 그림이 있습니다.&amp;nbsp;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;&lt;IMG style=&quot;WIDTH: 500px; HEIGHT: 312px&quot; height=312 src=&quot;http://blogs.msdn.com/photos/wpfedevcon/images/8351952/500x312.aspx&quot; width=500 align=top mce_src=&quot;http://blogs.msdn.com/photos/wpfedevcon/images/8351952/500x312.aspx&quot;&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;자 그럼 이제 코드를 봅시다. 여기 제 Panel의 MesureOverride 메소드가 있습니다.&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;&lt;br /&gt;
&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;&lt;SPAN class=Apple-style-span style=&quot;FONT-SIZE: 13px; FONT-FAMILY: Tahoma&quot;&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;public&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&amp;nbsp;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;class&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;BlockPanel&lt;/SPAN&gt;&amp;nbsp;:&amp;nbsp;&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;Panel&lt;/SPAN&gt;&lt;?xml:namespace prefix = o /&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;{&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: green&quot;&gt;//First measure all children and return available size of panel&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;protected&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;override&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;Size&lt;/SPAN&gt;&amp;nbsp;MeasureOverride(&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;Size&lt;/SPAN&gt;availableSize)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: green&quot;&gt;//Measure each child&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;foreach&lt;/SPAN&gt;&amp;nbsp;(&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;FrameworkElement&lt;/SPAN&gt;&amp;nbsp;child&amp;nbsp;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;in&lt;/SPAN&gt;&amp;nbsp;Children)&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;child.Measure(&lt;SPAN style=&quot;COLOR: blue&quot;&gt;new&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;Size&lt;/SPAN&gt;(100,100));&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: green&quot;&gt;//return the available size&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;return&lt;/SPAN&gt;&amp;nbsp;availableSize;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;}&lt;/SPAN&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;&lt;br /&gt;
&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;&amp;nbsp;&amp;nbsp;여기선 Layout System이 이 Panel의 가능한 사이즈(availableSize)를 넘겨줍니다. 만약 Panel을 생성할 때 Width나 Height 를 특별히 설정해주었다면 그 값이 바로 여기서 얻을 수 있는 값이 &amp;nbsp;됩니다. MeasureOverride 함수 안에서는, 현재 Panel에서 가능한 사이즈를(이 경우에는 100x100) 각각의 자식들의 Measure 함수로 넘겨줍니다. 제가 봤던 많은 예제에서는 기본적으로 Child가 &amp;nbsp;Panel의 전체 영역을 다 차지 할 수 있는 영역을 말하는, availableSize 가 다시 되넘겨졌습니다. &amp;nbsp;Measure 함수가 호출된 후 Layout System은 자식들의 DesiredSize 를 결정하게 됩니다. 저는 이부분에 대해 아직 상세하게 모든 부분을 이해하지는 못했지만 대체로 고유사이즈(native size) 와 가능한 사이즈(available size) 중에 작은 부분을 DesiredSize로 결정하는 것 같습니다.&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;&amp;nbsp;&amp;nbsp;그래서 이 BlockPanel의 경우 만약 자식 Rectangle의 사이즈가 200x200 이라면 Desired Size는 100x100으로 설정될 것입니다. 또 만약 Rectangle의 사이즈가 50x50 일면 DesiredSize는 50x50으로 설정될 것입니다. &amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;(역자주: 이부분에 대해 어떻게 결정되는지에 대한 정확한 문서가 나와있지 않습니다. 다만 막연히 다음 링크를 보시면 DeisiredSize에 대한 설명은 보실 수 있습니다.&amp;nbsp;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(51,51,51); LINE-HEIGHT: 18px; FONT-FAMILY: 굴림&quot;&gt;&lt;A href=&quot;http://msdn.microsoft.com/ko-kr/library/system.windows.uielement.desiredsize(VS.95).aspx&quot;&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(51,51,51); LINE-HEIGHT: 18px; FONT-FAMILY: 굴림&quot;&gt;&lt;A href=&quot;http://msdn.microsoft.com/ko-kr/library/system.windows.uielement.desiredsize(VS.95).aspx&quot;&gt;&lt;/A&gt;&lt;A title=&quot;[http://msdn.microsoft.com/ko-kr/library/system.windows.uielement.desiredsize(VS.95).aspx]로 이동합니다.&quot; href=&quot;http://msdn.microsoft.com/ko-kr/library/system.windows.uielement.desiredsize(VS.95).aspx&quot; target=_blank&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp;http://msdn.microsoft.com/ko-kr/library/system.windows.uielement.desiredsize(VS.95).aspx&lt;/A&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;DesiredSize는 실제사이즈나 RenderSize와 다르게 Layout을 구성하는데 필요한 계산 값으로만 작동하는 것같습니다.)&lt;/DIV&gt;
&lt;DIV&gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV&gt;모든 객체를 측정(measure)한 후에 전체 Panel로 availiableSize를 반환합니다. 저는 들어왔던 availableSize를 그대로 반환함으로써 Measure 단계에서 Panel의 사이즈를 전혀 제한 하지 않았습니다.&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;다음으로 Layout System 은 ArrangeOverride를 살펴보게 됩니다. 여기 제 Panel의 ArrangeOverride 함수가 있습니다.&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;FONT-SIZE: 13px; COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: Tahoma&quot;&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;public&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&amp;nbsp;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;class&lt;/SPAN&gt;&amp;nbsp;&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;BlockPanel&lt;/SPAN&gt;&amp;nbsp;:&amp;nbsp;&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;Panel&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN&gt;&lt;o:p&gt;&lt;FONT face=&quot;Times New Roman&quot; size=3&gt;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: green&quot;&gt;//Second arrange all children and return final size of panel&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;protected&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;override&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;Size&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;ArrangeOverride(&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;Size&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;finalSize)&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: green&quot;&gt;//Get the collection of children&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;UIElementCollection&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;mychildren = Children;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;o:p&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN&gt;&amp;nbsp;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: green&quot;&gt;//Get the total number of children&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;int&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;total = mychildren.Count;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;o:p&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: green&quot;&gt;//Calculate the number of 3x3 blocks needed&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;int&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;blocks = (&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;int&lt;/SPAN&gt;&lt;FONT color=#000000&gt;)&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;Math&lt;/SPAN&gt;&lt;FONT color=#000000&gt;.Ceiling((&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;double&lt;/SPAN&gt;&lt;FONT color=#000000&gt;)total/9.00);&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;o:p&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: green&quot;&gt;//Calculate how many 3x3 blocks fit on a row&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;int&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;blocksInRow = (&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;int&lt;/SPAN&gt;&lt;FONT color=#000000&gt;)&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;Math&lt;/SPAN&gt;&lt;FONT color=#000000&gt;.Floor(finalSize.Width / 300);&amp;nbsp;&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: green&quot;&gt;//assuming blocks of 9&amp;nbsp;element 300x300&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; COLOR: green; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;o:p&gt;&amp;nbsp;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: green&quot;&gt;//Arrange children&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;int&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;i;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;double&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;maxWidth = 0;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;double&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;maxHeight = 0;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;for&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;(i = 0; i &amp;lt; total; i++)&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;{&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: green&quot;&gt;//Find out which 3x3 block you are in&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;int&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;block = FindBlock(i);&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;o:p&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: green&quot;&gt;//Get (left, top) origin point for your 3x3 block&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;Point&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;blockOrigin = GetOrigin(block, blocksInRow,&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;new&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;Size&lt;/SPAN&gt;&lt;FONT color=#000000&gt;(300,300));&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;o:p&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: green&quot;&gt;//Get (left, top) origin point for the element inside its 3x3 block&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;int&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;numInBlock = i-9*block;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;Point&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;cellOrigin = GetOrigin(numInBlock, 3,&amp;nbsp;&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;new&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;Size&lt;/SPAN&gt;&lt;FONT color=#000000&gt;(100,100));&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;o:p&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: green&quot;&gt;//Arrange child&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: green&quot;&gt;//Get desired height and width. This will not be larger than 100x100 as set in MeasureOverride.&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: green&quot;&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; COLOR: blue; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; double&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;FONT color=#000000&gt;&amp;nbsp;dw = mychildren[i].DesiredSize.Width;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;double&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;dh = mychildren[i].DesiredSize.Height;&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;mychildren[i].Arrange(&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;new&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;Rect&lt;/SPAN&gt;&lt;FONT color=#000000&gt;(blockOrigin.X + cellOrigin.X, blockOrigin.Y + cellOrigin.Y, dw, dh));&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;o:p&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: green&quot;&gt;//Determine the maximum width and height needed for the panel&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;maxWidth =&amp;nbsp;&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;Math&lt;/SPAN&gt;&lt;FONT color=#000000&gt;.Max(blockOrigin.X + 300, maxWidth);&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;maxHeight =&amp;nbsp;&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;Math&lt;/SPAN&gt;&lt;FONT color=#000000&gt;.Max(blockOrigin.Y + 300, maxHeight);&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;}&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;o:p&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;o:p&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: green&quot;&gt;//Return final size of the panel&lt;o:p&gt;&lt;/o:p&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;return&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: blue&quot;&gt;new&lt;/SPAN&gt;&lt;FONT color=#000000&gt;&amp;nbsp;&lt;/FONT&gt;&lt;SPAN style=&quot;COLOR: rgb(43,145,175)&quot;&gt;Size&lt;/SPAN&gt;&lt;FONT color=#000000&gt;(maxWidth,maxHeight);&lt;o:p&gt;&lt;/o:p&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;FONT color=#000000&gt;&lt;SPAN&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/SPAN&gt;}&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/P&gt;
&lt;P class=MsoNormal style=&quot;MARGIN: 0in 0in 0pt&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;/SPAN&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;}&lt;/SPAN&gt;&lt;/P&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV&gt;기본적으로 각 객체에 대해 계산해주고 있는 것들입니다.&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;
&lt;OL style=&quot;LIST-STYLE-TYPE: decimal&quot;&gt;
&lt;LI&gt;어떤 3x3 블럭에 들어갈 것인가?&lt;/LI&gt;
&lt;LI&gt;3x3 블럭안에 어떤 구역 숫자가 들어갈 것인가?&lt;/LI&gt;
&lt;LI&gt;3x3 블럭의 Left,Top 코너 위치&lt;/LI&gt;
&lt;LI&gt;3x3 블럭안 구역의 Left,Top 코너 위치.&lt;/LI&gt;
&lt;LI&gt;각 객체의 DesiredSize.&lt;/LI&gt;&lt;/OL&gt;
&lt;DIV&gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV&gt;제가 이 모든 정보를 가지고 있어야지만, 저는 각 자식 객체의 경계 영역(bounding box)의 사이즈와 위치를 계산할 수 있습니다. 경계영역은 Rect 값으로 Arrange 함수로 넘겨지게 됩니다.&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&amp;nbsp;저는 또한 모든 3x3 블럭을 포함하는데 필요한 width, height 값을 추적하였습니다.(역자주:maxWidth와 maxHeight 를 갱신함) 그 후 &amp;nbsp;모든 블럭을 포함할 수 있을만큼 충분히 큰 패널의 사이즈를 최종 사이즈(final size)로 설정해주었습니다. 저는 &amp;nbsp;또한 finalSize를 넘겨줄 수 있었고 Panel이 자신의 부모 Container로 부터 가능한 전체영역을 채우게 될 것입니다.&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;그래서 잠시동안 저를 혼란스럽게 했던 몇가지 점을 정리하면:&lt;/DIV&gt;
&lt;DIV&gt;
&lt;OL style=&quot;LIST-STYLE-TYPE: decimal&quot;&gt;
&lt;LI&gt;우리가 child.Measure를 호출 했을 때, 우리는 자식들이 가능한 사이즈를 넘겨주는 것입니다. 자식들의 실제 사이즈를 설정해주는 것이 아닙니다.&amp;nbsp;&lt;/LI&gt;
&lt;LI&gt;Measure 함수를 호출 한 뒤에 Layout System 은 Element의 DesiredSize를 결정할 것입니다. 다시 말해서 제가 말할 수 있는 것은 우리가 직접 DesiredSize를 설정할 수 있는 방법은 없다는 것입니다..&lt;/LI&gt;
&lt;LI&gt;우리가 child.Arrange 를 호출 했을 때 우리는 child의 최종 사이즈(final size)를 설정하는 것이 아닙니다. 저는 잠시동안 이것이 child의 사이즈를 설정하는 것이라고 착각했지만 이것은 child를 포함할 경계 영역(bounding box)를 설정하는 것입니다. 그래서 만약 child가 경계영역보다 크다면 그것은 Clip 될 것이며 만약 child가 더 작다면 그것은 기본 정렬(역자주: 보통은 Center 정열)이나 당신이 정해준 정렬에 기반하여 경계 영역안에 위치될 것입니다. 이 Panel 경우에는 경계 영역이 child의 DesiredSize가 되도록 설정했습니다.&lt;/LI&gt;&lt;/OL&gt;
&lt;DIV&gt;&amp;nbsp;&amp;nbsp;&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&amp;nbsp;제가 호출 한 ArrangeOverride 함수를 포함한 나머지 코드와 함께 Panel을 생성하고 몇개의 Rectangle을 안에 넣은 Xaml 화일을 첨부합니다. 이 예제에는 제가 아직 이해하지 못한 Layout System에 대한 상세한 것들이 있습니다. 그래서 만약 아직 읽어 보지 않았다면&amp;nbsp;&lt;SPAN class=Apple-style-span style=&quot;FONT-SIZE: 13px; COLOR: rgb(0,128,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;FONT face=&quot;Times New Roman&quot; size=3&gt;&lt;A style=&quot;COLOR: rgb(51,51,51); TEXT-DECORATION: none&quot; href=&quot;http://msdn2.microsoft.com/en-us/library/cc189087(vs.95).aspx&quot; mce_href=&quot;http://msdn2.microsoft.com/en-us/library/cc189087(vs.95).aspx&quot;&gt;&quot;&lt;/A&gt;&lt;A style=&quot;COLOR: rgb(0,107,130); TEXT-DECORATION: none&quot; href=&quot;http://msdn2.microsoft.com/en-us/library/cc189087(vs.95).aspx&quot; mce_href=&quot;http://msdn2.microsoft.com/en-us/library/cc189087(vs.95).aspx&quot;&gt;Object Positioning and Layout&quot;&lt;/A&gt;&lt;SPAN class=Apple-style-span style=&quot;FONT-SIZE: 12px; COLOR: rgb(0,0,0)&quot;&gt;을 읽어보길 권합니다. 또한 Xaml 안에 새로 만든 Custom Panel을 생성해주기 위해서는 새로운 namespace를 선언하는 것이 필요할 것입니다. 이것에 관한 글은&amp;nbsp;&lt;/SPAN&gt;&lt;SPAN class=Apple-style-span style=&quot;FONT-SIZE: 13px; FONT-FAMILY: &#039;Courier New&#039;&quot;&gt;&lt;FONT face=&quot;Times New Roman&quot; color=#0000ff size=3&gt;&lt;A style=&quot;COLOR: rgb(51,51,51); TEXT-DECORATION: none&quot; href=&quot;http://msdn2.microsoft.com/en-us/library/cc189061(vs.95).aspx#Mapping_To_Custom_Classes_and_Assemblies&quot; mce_href=&quot;http://msdn2.microsoft.com/en-us/library/cc189061(vs.95).aspx#Mapping_To_Custom_Classes_and_Assemblies&quot;&gt;&quot;&lt;/A&gt;&lt;A style=&quot;COLOR: rgb(0,107,130); TEXT-DECORATION: none&quot; href=&quot;http://msdn2.microsoft.com/en-us/library/cc189061(vs.95).aspx#Mapping_To_Custom_Classes_and_Assemblies&quot; mce_href=&quot;http://msdn2.microsoft.com/en-us/library/cc189061(vs.95).aspx#Mapping_To_Custom_Classes_and_Assemblies&quot;&gt;Mapping to Custom Classes and Assemblies&quot;&amp;nbsp;&lt;/A&gt;&lt;SPAN class=Apple-style-span style=&quot;FONT-SIZE: 12px; COLOR: rgb(0,0,0)&quot;&gt;을 확인 해보길 바랍니다.&lt;/SPAN&gt;&lt;A style=&quot;COLOR: rgb(0,107,130); TEXT-DECORATION: none&quot; href=&quot;http://msdn2.microsoft.com/en-us/library/cc189061(vs.95).aspx#Mapping_To_Custom_Classes_and_Assemblies&quot; mce_href=&quot;http://msdn2.microsoft.com/en-us/library/cc189061(vs.95).aspx#Mapping_To_Custom_Classes_and_Assemblies&quot;&gt;&lt;/A&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;&lt;br /&gt;
&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV style=&quot;TEXT-ALIGN: center&quot;&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;&lt;A href=&quot;http://blogs.msdn.com/silverlight_sdk/attachment/8351949.ashx&quot;&gt;&lt;SPAN style=&quot;FONT-SIZE: 14pt&quot;&gt;&lt;SPAN class=Apple-style-span style=&quot;TEXT-DECORATION: underline&quot;&gt;&amp;nbsp;CustomPanelFiles.zip&lt;/SPAN&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;&lt;br /&gt;
&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;-----------------------------------------------------------------------------------------------------------------------------------------------------------------&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;&lt;br /&gt;
&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;&lt;br /&gt;
&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;번역이 끝났습니다. &amp;nbsp; 흠.. 이번 번역은 생각보다 긴 문장이 많아서 골치가 조금 아팠습니다. 그래도 전체적으로 잘 정리되어있어서 예제를 보시면서 따라하시면 이해하시는데 큰 무리는 없을 것으로 보입니다.&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;&lt;br /&gt;
&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;&amp;nbsp;&amp;nbsp;그럼 제가 만들었던 예제도 같이 첨부해 드리죠.&amp;nbsp;&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV style=&quot;TEXT-ALIGN: left&quot;&gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV style=&quot;TEXT-ALIGN: left&quot;&gt;&lt;SPAN class=Apple-style-span style=&quot;LINE-HEIGHT: normal&quot;&gt;&lt;br /&gt;
&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://error1001.tistory.com/attachment/494f1063bb8cbAD.zip&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/zip.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; MakeCustomPanel.zip&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;&amp;nbsp;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;- smile -&lt;/SPAN&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;SPAN class=Apple-style-span style=&quot;COLOR: rgb(0,0,0); LINE-HEIGHT: normal; FONT-FAMILY: &#039;Times New Roman&#039;&quot;&gt;&lt;br /&gt;
&lt;BUTTON class=&quot;txc-file txc-file-c&quot;&gt;&lt;br /&gt;
&lt;/BUTTON&gt;&lt;/SPAN&gt;&lt;/DIV&gt;&lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-43-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-43-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-43-2&quot; class=&quot;entry-ccl-sa&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black04.png&quot; alt=&quot;동일 조건 변경 허락&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>ArrangeOverride</category>
			<category>Custom Panel</category>
			<category>MeasureOverride</category>
			<category>panel</category>
			<category>silverlight</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/43</guid>
			<comments>http://error1001.com/43#entry43comment</comments>
			<pubDate>Mon, 22 Dec 2008 12:59:50 +0900</pubDate>
		</item>
		<item>
			<title>[강좌] ListBox의 상속.</title>
			<link>http://error1001.com/41</link>
			<description>&lt;br /&gt;
  사실 이 강좌의 제목은 ItemsControl의 상속이라고 해야 더 옳습니다. 하지만 ItemsControl를 상속받아서 제대로된 Control을 만든다는 것은 보다 험난한 길이기 때문에 그건 다음 강좌를 기약하고 그냥 ListBox를 통째로 상속받아서 ListBox에서(혹은 ItemsControl에서) 다행히 Protected override 메소드로 접근할 수 있는 메소드들만 건드려 보도록 하겠습니다. &lt;br /&gt;
&lt;br /&gt;
  사실 보통의 경우, 그냥 데이터만 바인딩만 하는 경우, 이런 경우가 왜 필요하느냐 물으실 수도 있겠지만 실제로 ListBox를 그대로 사용하는 경우는 저희 회사만 해도 한번도 없었다고 해도 과언이 아닙니다. 이왕 기본 컨트롤을 제공할 꺼면 좀더 리치하게 제공해줄 것이지. Asp.net 수준 정도로밖에 안만들어 놨기 때문에 그냥 갔다 쓰면 이게 RIA인지 그냥 WebPage인지 알 수가 없죠.. 아.. 잡소리가 길어졌군요..^^;;&lt;br /&gt;
&lt;br /&gt;
  그럼 Rich 한 ListBox 를 위해 일단  기본 ListBox를 최대한 사용하는 방법을 알아보도록 하겠습니다 .그럼 먼저 제공해주는 override 메소드부터 살펴보죠. ListBox(ItemsControl)에서 새로 제공해주는 override 메소드는 다음과 같습니다.&lt;br /&gt;
&lt;br /&gt;
&lt;ul style=&quot;LIST-STYLE-TYPE: square&quot;&gt;
&lt;li&gt;&lt;font color=&quot;#801fbf&quot;&gt;protected virtual bool &lt;strong&gt;IsItemItsOwnContainerOverride&lt;/strong&gt;(object item)&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font color=&quot;#801fbf&quot;&gt;protected virtual DependencyObject &lt;strong&gt;GetContainerForItemOverride&lt;/strong&gt;()&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font color=&quot;#801fbf&quot;&gt;protected virtual void &lt;strong&gt;PrepareContainerForItemOverride&lt;/strong&gt;(DependencyObject element, object item)&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font color=&quot;#801fbf&quot;&gt;protected virtual void &lt;strong&gt;OnItemsChanged&lt;/strong&gt;(NotifyCollectionChangedEventArgs e)&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font color=&quot;#801fbf&quot;&gt;protected virtual void &lt;strong&gt;ClearContainerForItemOverride&lt;/strong&gt;(DependencyObject element, object item)&lt;/font&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;5가지 모두 ListBox에 들어갈 Item에 관련된 메소드들이죠. 각각의 메소드들이 무슨 일을 하는지 알아보죠. &lt;/p&gt;
&lt;ol style=&quot;LIST-STYLE-TYPE: decimal&quot;&gt;
&lt;li&gt;&lt;strong&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;IsItemItesOwnContainerOverride(object item)&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
  간단히 사용자가 넣어준 아이템이 Container를 가지고 있는지 확인합니다. base.IsItemItesOwnContainerOverride(item) 에서는 item이 ListBoxItem 인지 확인하고 ItemsControl을 바로 상속했을 경우에는 base에서 itemdl UIElement 인지 확인합니다.&lt;br /&gt;
   return 값이 false 인 경우 다음에 GetContainerForItemOverride 메소드가 호출되고 true일 경우 PrepareContainerForItemOverride 가 바로 호출 됩니다. &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0);&quot;&gt;GetContainerForItemOverride()&lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;
  Container를 반환해줍니다. base.GetContainerForItemOverride() 에서는 ListBoxItem의 새로운 인스턴스를 반환합니다. 이 때 ItemContainerStyle 이 null 이 아닐 때는 새로 생성되는 ListBoxItem에 ItemContainerStyle의 Style이 적용됩니다. &lt;br /&gt;
&lt;/li&gt;
&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;strong&gt;PrepareContainerForItemOverride(DependencyObject element, object item)&lt;br /&gt;
&lt;/strong&gt;  먼저 파라미터인 &lt;strong&gt;element&lt;/strong&gt;에는 위의 GetContainerForItemOverride() 에서 반환된 ListBoxItem 이나 IsItemItesOwnContainerOverride(item) 의 결과가 true일 경우에는 사용자가 넣어준 ListBoxItem 혹은 ListBoxItem을 상속받은 객체가 들어오게 되어있습니다. 그리고 item 에는 사용자가 넣어준 데이타가 들어오게 되어있습니다. &lt;br /&gt;
  일단 base.PrepareContainerForItemOverride(&lt;a title=&quot;DependencyObject element; // Parameter&quot;&gt;element&lt;/a&gt;, &lt;a title=&quot;object item; // Parameter&quot;&gt;item&lt;/a&gt;)에서는 element에 ItemTemplate을 적용해주고 element가 ContentControl인 경우 Content에 item을 엮어주는 작업을 해줍니다. 그것과 함께 ListBox를 상속했을 경우에는(ItemsControl 상속의 경우 제외) 현재 SelectedIndex나 SelectedItem 에 따라 Selection 처리를 해줍니다. &lt;br /&gt;
&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;strong&gt;OnItemsChanged(NotifyCollectionChangedEventArgs e)&lt;br /&gt;
  &lt;/strong&gt;이 메서드는 사용자가 ItemsSource 의 데이타를 INotifyCollectionChanged 인터페이스를 상속받은 데이타 클래스(ex. ObervableCollection&amp;lt;T&gt;: 이 클래스의 사용방법은 차후에 설명하도록 하겠습니다. )로 했을 경우에만 들어옵니다. INotifyCollectionChanged의 CollectionChanged 이벤트가 발생하였을 경우에 들어옵니다. &lt;br /&gt;
&lt;/font&gt;&lt;/li&gt;
&lt;li&gt;&lt;font size=&quot;+0&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;&lt;strong&gt;&lt;span style=&quot;FONT-SIZE: 9pt&quot;&gt;ClearContainerForItemOverride(DependencyObject element, object item)&lt;/span&gt;&lt;/strong&gt;&lt;/font&gt;&lt;br /&gt;
&lt;span style=&quot;FONT-SIZE: 9pt&quot;&gt;  이 메서드는 생각보다 중요한 메서드입니다. 이 부분은 ListBox에서 Item을 제거할 때 들어옵니다.  실제로 기본 ListBox 에서 이부분에 구현된 코드는 없지만 만약 ListBox를 상속받아 PrepareContainerForItemOverride 함수에서 ListBoxItem 에 이벤트를 엮어주었다든지 List나 Dictionary를 따로 만들어 ListBoxItem 을 관리했다면 이 부분에서 해제시켜주거나 List에서 제외시켜주어야 합니다. &lt;/span&gt;&lt;/font&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;흠냐.. 어렵나요? 개발자는 코드로 말해야 하는 것을 길게 글로 써놓았으니 이해하기 힘드셨다고 해도 할 말이 없습니다. 그럼 이제 코드로 보여드리죠. 보여드릴 예제는 ListBoxItem 에 CheckBox가 추가되어 있는 경우입니다. CheckBox가 ListBox가 추가 되어서 Selected 된 것과 별도로 Checked 된 것인지 아닌지도 알아보고 싶은 것이지요. &lt;br /&gt;
(&lt;strong&gt;tip&lt;/strong&gt;:UserControl이나 App.xaml에 Style이 있는 경우 Style에서 이벤트를 걸어도 그 이벤트가 비하인드 코드의 이벤트 핸들러로 들어옵니다. 이런 방법으로 구현을 할 수도 있겠지만 Style과 코드 사이에 의존성을 높여서 재사용성도 떨어지며 차후에 Style 변경시 문제가 생길 수 있어 되도록 사용하지 않는 것이 좋습니다. ) &lt;br /&gt;
&lt;br /&gt;
  그럼 ListBoxItem 을 먼저 Customizing을 해야 하겠군요. 먼저 &lt;font color=&quot;#57048c&quot;&gt;CheckableListBoxItem&lt;/font&gt;이란 class를 선언하고 ListBoxItem을 상속받습니다. &lt;/p&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;    public class CheckableListBoxItem: ListBoxItem&lt;br /&gt;
    {&lt;/font&gt;&lt;font color=&quot;#57048c&quot;&gt;    }&lt;/font&gt;&lt;/div&gt;
&lt;p&gt;그리고 여기서 기본 Style도 조금은 바꾸어 주어야 할 것이므로 DefaultStyle도 생성자에서 설정해주어야 합니다. 다음과 같이 &lt;/p&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;        public CheckableListBoxItem()&lt;br /&gt;
        {&lt;br /&gt;
            DefaultStyleKey = typeof(CheckableListBoxItem);&lt;br /&gt;
        }&lt;/font&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;p&gt;이 부분은 나중에 Control을 다 만든 다음에 자주 까먹을 수 있는 부분이니 무조건 처음부터 설정해주도록 합시다. (삽질 방지 습관화!!!) &lt;br /&gt;
&lt;br /&gt;
그 다음에 TemplatePart 에 CheckBox 하나를 추가해주도록 합시다. CheckBox 객체의 이름은 왠만하면 const 값으로 박아 놓고 쓰는게 좋겠죠. 그래서 다음과 같이 짜놓았습니다. &lt;br /&gt;
(클래스 속성)&lt;/p&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;[TemplatePart(Name=CheckableListBoxItem.CheckBoxName, Type=(typeof(CheckBox)))]&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
(내부 코드)&lt;br /&gt;

&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;div style=&quot;MARGIN-LEFT: 4em&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;CheckBox _checkBox;&lt;br /&gt;
internal const string CheckBoxName = &quot;CheckBox&quot;;&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
그리고 OnApplyTemplate에서 Style에 들어있을 CheckBox를 찾아와야 하겠죠. 그리고 찾아온 CheckBox가 Checked 되었는지 안되었는지 확인하기 위해서 이벤트를 엮어줍니다. &lt;br /&gt;

&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;        public override void OnApplyTemplate()&lt;br /&gt;
        {&lt;br /&gt;
            base.OnApplyTemplate();&lt;/font&gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;            _checkBox = GetTemplateChild(CheckBoxName) as CheckBox;&lt;br /&gt;
            if (_checkBox != null)&lt;br /&gt;
            {&lt;br /&gt;
                _checkBox.Checked += new RoutedEventHandler(_checkBox_Checked);&lt;br /&gt;
                _checkBox.Unchecked += new RoutedEventHandler(_checkBox_Unchecked);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;br /&gt;
여기서 &lt;font color=&quot;#000000&quot;&gt;CheckableListBoxItem 의 Check 상태를 우리가 만들 CheckablelistBox 에 알려줄 수 있는 방법은 두가지가 있습니다. 한가지는 이벤트를 이용하는 것이고 다른 한가지는 ListBoxItem이 ListBox의 참조값을 받아서 ListBox의 메서드를 직접 호출 하는 방법입니다. 둘 다 장단점이 있는데, 전자는 ListBox가 ListBoxItem을 제거 할 때 이벤트도 함께 제거해주어야 메모리가 제대로 해제 될 수 있지만 후자보다 ListBoxItem이 독립적으로 사용이 가능하죠. 후자의 경우 메모리 해제 부분에 크게 신경쓰지 않아도 되지만 CheckableListBoxItem은 반드시 CheckableListBox 의 Item으로만 들어가야 한다는 단점이 있죠. 사실 ListBox와 ListBoxItem은 의존성이 아주 높은 관계이므로 후자로 구현해도 무방하고 실제 구현도 후자로 되어 있지만 일단 전자로 구현을 해보도록 하겠습니다. &lt;br /&gt;
&lt;br /&gt;
  위의 코드로 다음과 같은 이벤트와 이벤트 Fire 함수를 만들어 주고 Checked와 UnChecked  이벤트 핸들러에 함수를 추가해줍니다. &lt;br /&gt;

&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;br /&gt;
       &lt;font color=&quot;#57048c&quot;&gt; public event RoutedEventHandler ItemChecked;&lt;br /&gt;
        public event RoutedEventHandler ItemUnchecked;&lt;br /&gt;
&lt;br /&gt;
        void _checkBox_Unchecked(object sender, RoutedEventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            FireItemUnchecked(e);&lt;br /&gt;
        }&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;        void _checkBox_Checked(object sender, RoutedEventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            FireItemChecked(e);&lt;br /&gt;
        }&lt;br /&gt;
&lt;/font&gt;&lt;br /&gt;
&lt;font color=&quot;#57048c&quot;&gt;        internal void FireItemUnchecked(RoutedEventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (ItemUnchecked != null)&lt;br /&gt;
                ItemUnchecked(this, e);&lt;br /&gt;
        }&lt;/font&gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;        internal void FireItemChecked(RoutedEventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            if (ItemChecked != null)&lt;br /&gt;
                ItemChecked(this, e);&lt;br /&gt;
        }&lt;/font&gt;&lt;/div&gt;
&lt;br /&gt;
 자 그럼 앞에서 배운 override 함수를 활용하여 CheckableListBox를 만들어 보죠. 먼저 앞서 만든 것처럼 CheckableListBox를 만들고 DefaultStyle등을 만들어 줍니다. 그리고 맨먼저 ListBoxItem 이 아닌 CheckableListBox가 ListBoxItem으로 만들어지게 하기 위해 override 함수를 수정해주어야 합니다. &lt;br /&gt;
&lt;br /&gt;
  먼저 OnItemItsOwnContainerOverride 함수의 경우 ListBoxItem인지 체크해주는 함수입니다. 하지만 여기서는 CheckableListBoxItem이어야 하니.. CheckableListBoxItem이 아닌 경우 Container를 새로 만들어주어야 합니다. &lt;br /&gt;
고로 다음과 같이 짜줍니다. &lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;        protected override bool IsItemItsOwnContainerOverride(object item)&lt;br /&gt;
        {&lt;br /&gt;
            return (item is CheckableListBoxItem);&lt;br /&gt;
        }&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;br /&gt;
간단하죠?^^ 다음으로 item이 ChekableListBoxItem이 아닌 경우 새로 Container를 만들어 줘야 하니 GetContainerForItemOverride 함수를 수정해주어야 합니다. 다음과 같이 짭니다. &lt;br /&gt;

&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
       &lt;font color=&quot;#57048c&quot;&gt; protected override DependencyObject GetContainerForItemOverride()&lt;br /&gt;
        {&lt;br /&gt;
            CheckableListBoxItem item = new CheckableListBoxItem();&lt;br /&gt;
            if (this.ItemContainerStyle != null)&lt;br /&gt;
            {&lt;br /&gt;
                item.Style = this.ItemContainerStyle;&lt;br /&gt;
            }&lt;br /&gt;
            return item;&lt;br /&gt;
        }&lt;/font&gt;&lt;/div&gt;
&lt;br /&gt;
  CheckableListBoxItem을 새로 만들어주고 ItemContainerStyle을 적용해주는 것이죠. 이렇게 하면 다음에 짜줄 PrepareContainerForItemOverride 함수의 DependencyObject 로 CheckableListBoxItem이 들어오는 것을 확인할 수 있습니다. 그러면 이제 PrepareContainerForItemOverride 를 수정해봅시다. &lt;br /&gt;

&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;        protected override void PrepareContainerForItemOverride(DependencyObject element, object item)&lt;br /&gt;
        {&lt;br /&gt;
            base.PrepareContainerForItemOverride(element, item);&lt;/font&gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;            CheckableListBoxItem checkableItem = (element as CheckableListBoxItem);&lt;br /&gt;
            if (checkableItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                checkableItem.ItemChecked += new RoutedEventHandler(checkableItem_ItemChecked);&lt;br /&gt;
                checkableItem.ItemUnchecked += new RoutedEventHandler(checkableItem_ItemUnchecked);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
  PrepareContainerForItemOverride 함수의 base 부분에는 item에 data를 바인딩 시켜주고 Select에 관한 처리가 포함되어있으니 꼭 불러주도록 해야 합니다. 아니면 귀찮은 코드를 몇줄 더 짜야 겠죠.&lt;br /&gt;
&lt;br /&gt;
그런데 여기서 Checked 된 것이 어떤 것인지 알기 위해서는 Check된 상태를 알려줄 Event와 Check된 객체를 담아둘 List가 하나 필요할 것입니다. 그리고 Check된 객체가 원래 어떤 아이템이었는지도 알아볼 수 있는 Dictionary도 하나 그래서 다음과 같은 Event와 Property 등을 추가합니다. &lt;br /&gt;

&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;        public event RoutedEventHandler CheckedItemsChanged;&lt;br /&gt;
        public ObservableCollection&amp;lt;object&gt; CheckedItems { get; private set; }&lt;br /&gt;
&lt;/font&gt;&lt;font color=&quot;#57048c&quot;&gt;&lt;/font&gt;&lt;font color=&quot;#57048c&quot;&gt;        private Dictionary&amp;lt;CheckableListBoxItem, object&gt; _oDicCheckableListBoxItem;&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;        public CheckableListBox()&lt;br /&gt;
        {&lt;br /&gt;
            DefaultStyleKey = typeof(ListBox);&lt;br /&gt;
            CheckedItems = new ObservableCollection&amp;lt;object&gt;();&lt;br /&gt;
&lt;/font&gt;&lt;font style=&quot;MARGIN-LEFT: 4em&quot; color=&quot;#57048c&quot;&gt;_oDicCheckableListBoxItem = new Dictionary&amp;lt;CheckableListBoxItem, object&gt;();&lt;br /&gt;
&lt;/font&gt;&lt;font color=&quot;#57048c&quot;&gt;        }&lt;/font&gt;&lt;br /&gt;
&lt;/div&gt;
그리고 Item을 제대로 얻기 위해 PrepareContainerForItemOverride 함수에 다음 함수 한 줄을 더 추가해줍니다. &lt;br /&gt;

&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
     &lt;font color=&quot;#57048c&quot;&gt; _oDicCheckableListBoxItem.Add(checkableItem, item);&lt;/font&gt;&lt;/div&gt;
&lt;br /&gt;
그리고 아까 PrepareContainerForItemOverride함수에서 추가시켜주었던 EvnetHandler부분을 건드려 줍니다. &lt;br /&gt;

&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;        void checkableItem_ItemUnchecked(object sender, RoutedEventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            object item = _oDicCheckableListBoxItem[(sender as CheckableListBoxItem)];&lt;br /&gt;
            if (CheckedItems.Contains(item))&lt;br /&gt;
                CheckedItems.Remove(item); 
&lt;/font&gt;&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;&lt;font color=&quot;#57048c&quot;&gt;            FireCheckItemsChanged();&lt;/font&gt;&lt;br /&gt;
        }&lt;/font&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;        void checkableItem_ItemChecked(object sender, RoutedEventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            CheckedItems.Add(_oDicCheckableListBoxItem[(sender as CheckableListBoxItem)]);&lt;br /&gt;
            FireCheckItemsChanged();&lt;br /&gt;
&lt;/font&gt;&lt;font color=&quot;#57048c&quot;&gt;        }&lt;/font&gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;        private void FireCheckItemsChanged()&lt;br /&gt;
        {&lt;br /&gt;
            if (CheckedItemsChanged != null)&lt;br /&gt;
                CheckedItemsChanged(this, null);&lt;br /&gt;
        }&lt;/font&gt;&lt;/div&gt;
&lt;br /&gt;
자 그럼 이제 마지막(?) Themes/generic.xaml을 추가해주고 그 곳에 CheckBox가 추가된 CheckableListBoxItem Style을 넣어줍니다. 다음과 같이..&lt;br /&gt;

&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt; &amp;lt;ResourceDictionary xmlns=&quot;&lt;a href=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&lt;/a&gt;&quot;&lt;br /&gt;
             xmlns:x=&quot;&lt;a href=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;&gt;http://schemas.microsoft.com/winfx/2006/xaml&lt;/a&gt;&quot;&lt;br /&gt;
                    xmlns:MakeCustomListBox=&quot;clr-namespace:MakeCustomListBox&quot;&lt;br /&gt;
             xmlns:vsm=&quot;clr-namespace:System.Windows;assembly=System.Windows&quot;&gt;   &lt;br /&gt;
    &amp;lt;Style TargetType=&quot;MakeCustomListBox:CheckableListBoxItem&quot; &gt;&lt;br /&gt;
        .&lt;br /&gt;
        .&lt;br /&gt;
        .&lt;br /&gt;
        &amp;lt;Setter Property=&quot;Template&quot;&gt;&lt;br /&gt;
&lt;/font&gt;
&lt;div&gt;
&lt;font color=&quot;#57048c&quot;&gt;            &amp;lt;Setter.Value&gt;&lt;br /&gt;
                &amp;lt;ControlTemplate TargetType=&quot;MakeCustomListBox:CheckableListBoxItem&quot; &gt;&lt;br /&gt;
                    &amp;lt;Grid Background=&quot;{TemplateBinding Background}&quot;&gt;&lt;br /&gt;
                        .&lt;br /&gt;
                        .&lt;br /&gt;
                        .&lt;br /&gt;
                        &amp;lt;CheckBox x:Name=&quot;CheckBox&quot; HorizontalAlignment=&quot;Left&quot; Margin=&quot;{TemplateBinding Padding}&quot;&gt;&lt;br /&gt;
                            &amp;lt;ContentPresenter x:Name=&quot;contentPresenter&quot; Content=&quot;{TemplateBinding Content}&quot; ContentTemplate=&quot;{TemplateBinding ContentTemplate}&quot; HorizontalAlignment=&quot;Left&quot;   IsHitTestVisible=&quot;False&quot;/&gt;&lt;br /&gt;
                        &amp;lt;/CheckBox&gt;&lt;br /&gt;
                        .&lt;br /&gt;
                        .&lt;br /&gt;
                        .&lt;br /&gt;
                    &amp;lt;/Grid&gt;&lt;br /&gt;
                &amp;lt;/ControlTemplate&gt;&lt;br /&gt;
            &amp;lt;/Setter.Value&gt;&lt;br /&gt;
        &amp;lt;/Setter&gt;&lt;br /&gt;
    &amp;lt;/Style&gt;&lt;br /&gt;
&amp;lt;/ResourceDictionary&gt;&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;font color=&quot;#57048c&quot;&gt;&lt;font color=&quot;#000000&quot;&gt;    자 이제 완성입니다!! 그럼 테스트를 해볼까요. 간단히 xaml에는 CheckableListBox와 그냥 ListBox를 넣어주고 Add버튼과 DeleteButton을 넣어주었습니다. 그리고 코드는 다음과 같이..&lt;/font&gt;&lt;br /&gt;
&lt;/font&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
       &lt;font color=&quot;#57048c&quot;&gt; public Page()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            myListBox.ItemsSource = new ObservableCollection&amp;lt;object&gt;(){ &quot;하나&quot;,&quot;둘&quot;,&quot;셋&quot;};&lt;br /&gt;
            resultListBox.ItemsSource = myListBox.CheckedItems;&lt;br /&gt;
        }&lt;/font&gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;        private void AddButton_Click(object sender, RoutedEventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            (myListBox.ItemsSource as IList).Add(new Color());&lt;br /&gt;
        }&lt;/font&gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;        private void DeleteButton_Click(object sender, RoutedEventArgs e)&lt;br /&gt;
        {&lt;br /&gt;
            (myListBox.ItemsSource as IList).RemoveAt(0);&lt;br /&gt;
        }&lt;/font&gt;&lt;/div&gt;
  잘 작동하나요?.... 결과를 보면 Add 와 Delete도 잘 일어나고 Check 상태도 잘 들어오는 것을 알 수 있습니다. &lt;br /&gt;
&lt;br /&gt;
  그런데...!!!!  Check상태로 Delete를 누른 객체가 사라지지 않는다는 것을 알 수 있습니다.... 흠... 그렇습니다. 우리가 사용하지 않은 하나의 override 함수를 더 사용해야 합니다. 앞서 강조했던 &lt;span style=&quot;FONT-SIZE: 9pt&quot;&gt;ClearContainerForItemOverride 함수입니다. 이 함수에서 엮어주었던 이벤트를 해제시켜주고 참고하고 있던 리스트에서 삭제해주는 작업을 해주어야 합니다. 다음과 같이요.&lt;/span&gt;&lt;br /&gt;

&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
       &lt;font color=&quot;#57048c&quot;&gt; protected override void ClearContainerForItemOverride(DependencyObject element, object item)&lt;br /&gt;
        {&lt;br /&gt;
            base.ClearContainerForItemOverride(element, item);&lt;/font&gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;            CheckableListBoxItem checkableItem = (element as CheckableListBoxItem);&lt;br /&gt;
            if (checkableItem != null)&lt;br /&gt;
            {&lt;br /&gt;
                object item2 = _oDicCheckableListBoxItem[checkableItem];&lt;br /&gt;
                if (CheckedItems.Contains(item2))&lt;br /&gt;
                {&lt;br /&gt;
                    CheckedItems.Remove(item2);&lt;br /&gt;
                }&lt;/font&gt;&lt;/div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#57048c&quot;&gt;                checkableItem.ItemChecked -= new RoutedEventHandler(checkableItem_ItemChecked);&lt;br /&gt;
                checkableItem.ItemUnchecked -= new RoutedEventHandler(checkableItem_ItemUnchecked);&lt;br /&gt;
                _oDicCheckableListBoxItem.Remove(checkableItem);&lt;br /&gt;
            }&lt;/font&gt;&lt;font color=&quot;#57048c&quot;&gt;&lt;br /&gt;
        }&lt;/font&gt;&lt;br /&gt;
&lt;/div&gt;
  &lt;br /&gt;
  급하게 ListBox를 상속받아서 Customizing 하다보면 항상 이 부분을 놓치기 쉽습니다. 이 부분이 구현이 안되면 생각보다 오작동하는 경우가 많기 때문에 꼭 짜주는 것이 좋습니다. &lt;br /&gt;
 &lt;br /&gt;
  흠.. 그림 한장 없이 설명하다보니 이해가 쉽게 되지 않을 수도 있다는 생각이 듭니다. 그림을 넣기 좀 애매한 부분이 있어서.^^;;; 지금 여기서 설명한 method들은 모두 ItemsControl 에서 상속받은 method들이기 때문에 ListBox가 아니라 바로 ItemsControl 을 상속받아 Class를 만들 때에도 적용이 가능한 것들입니다. 이해를 돕기 위해 샘플프로젝트를 첨부합니다. 그럼 모두 삽질 금지!!^^&lt;br /&gt;
&lt;br /&gt;
                                                                                                                            - smile -&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://error1001.tistory.com/attachment/4943703c9f93a9T.zip&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/zip.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; MakeCustomListBox.zip&lt;/a&gt;&lt;/div&gt;&lt;/font&gt;</description>
			<category>Pre-Lecture</category>
			<category>ListBox</category>
			<category>silverlight</category>
			<category>상속</category>
			<category>실버라이트</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/41</guid>
			<comments>http://error1001.com/41#entry41comment</comments>
			<pubDate>Sat, 13 Dec 2008 16:34:09 +0900</pubDate>
		</item>
		<item>
			<title>[강좌] 1. Listbox의 기본적인 사용.(2) Item Look 변경.</title>
			<link>http://error1001.com/18</link>
			<description>Item 의 스타일을 변경해주는 방법은 2가지가 있습니다. &lt;br /&gt;
&lt;br /&gt;바로 ItemContainerStyle 을 바꾸어 주는 방법과 ItemTemplate을 바꾸는 방법이지요.&lt;br /&gt;
&lt;br /&gt;ItemTemplate 을 바꾸는 방법은 스캇 구슬리 강좌 에 소개 되어있는데요. 기본적으로 Container 안에 내용물을 바꾸는 것으로 볼 수 있죠.&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&lt;br /&gt;
그럼 ItemContainerStyle부터 살펴 봅시다. ItemContainderStyle은 Style을 Value 값으로 받습니다. 아시는 분은 알겠지만 Style은 TargetType 이 필요하죠. 여기서 TargetType은 ListBoxItem 입니다. 결국 ItemContainerStyle은 ListBoxItem의 스타일을 정해주는 프로퍼티라는 것이지요.&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;그럼 ListBoxItem의 DefaultStyle을 볼까요?&lt;br /&gt;
&amp;nbsp; 
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #ffdaed&quot;&gt;&lt;FONT color=#177fcd&gt;&amp;lt;Style TargetType=&quot;ListBoxItem&quot; &amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;Setter Property=&quot;Padding&quot; Value=&quot;3&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;Setter Property=&quot;HorizontalContentAlignment&quot; Value=&quot;Left&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;Setter Property=&quot;VerticalContentAlignment&quot; Value=&quot;Top&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;Setter Property=&quot;Background&quot; Value=&quot;Transparent&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;Setter Property=&quot;BorderThickness&quot; Value=&quot;1&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;Setter Property=&quot;TabNavigation&quot; Value=&quot;Local&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;Setter Property=&quot;Template&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Setter.Value&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ControlTemplate TargetType=&quot;ListBoxItem&quot; xmlns:vsm=&quot;clr-namespace:System.Windows;assembly=System.Windows&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid Background=&quot;{TemplateBinding Background}&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;vsm:VisualStateManager.VisualStateGroups&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;vsm:VisualStateGroup x:Name=&quot;CommonStates&quot; &amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;vsm:VisualState x:Name=&quot;Normal&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;vsm:VisualState x:Name=&quot;MouseOver&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Storyboard&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DoubleAnimation Storyboard.TargetName=&quot;fillColor&quot; Storyboard.TargetProperty=&quot;Opacity&quot; Duration=&quot;0&quot; To=&quot;.35&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Storyboard&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/vsm:VisualState&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;vsm:VisualState x:Name=&quot;Disabled&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Storyboard&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DoubleAnimation Storyboard.TargetName=&quot;contentPresenter&quot; Storyboard.TargetProperty=&quot;Opacity&quot; Duration=&quot;0&quot; To=&quot;.55&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Storyboard&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/vsm:VisualState&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/vsm:VisualStateGroup&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;vsm:VisualStateGroup x:Name=&quot;SelectionStates&quot; &amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;vsm:VisualState x:Name=&quot;Unselected&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;vsm:VisualState x:Name=&quot;Selected&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Storyboard&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DoubleAnimation Storyboard.TargetName=&quot;fillColor2&quot; Storyboard.TargetProperty=&quot;Opacity&quot; Duration=&quot;0&quot; To=&quot;.75&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Storyboard&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/vsm:VisualState&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/vsm:VisualStateGroup&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;vsm:VisualStateGroup x:Name=&quot;FocusStates&quot; &amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;vsm:VisualState x:Name=&quot;Focused&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Storyboard&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ObjectAnimationUsingKeyFrames Storyboard.TargetName=&quot;FocusVisualElement&quot; Storyboard.TargetProperty=&quot;Visibility&quot; Duration=&quot;0&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DiscreteObjectKeyFrame KeyTime=&quot;0&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DiscreteObjectKeyFrame.Value&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Visibility&amp;gt;Visible&amp;lt;/Visibility&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DiscreteObjectKeyFrame.Value&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DiscreteObjectKeyFrame&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ObjectAnimationUsingKeyFrames&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Storyboard&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/vsm:VisualState&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;vsm:VisualState x:Name=&quot;Unfocused&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/vsm:VisualStateGroup&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/vsm:VisualStateManager.VisualStateGroups&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Rectangle x:Name=&quot;fillColor&quot; Opacity=&quot;0&quot; Fill=&quot;#FFBADDE9&quot; IsHitTestVisible=&quot;False&quot; RadiusX=&quot;1&quot; RadiusY=&quot;1&quot;&amp;nbsp; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Rectangle x:Name=&quot;fillColor2&quot; Opacity=&quot;0&quot; Fill=&quot;#FFBADDE9&quot; IsHitTestVisible=&quot;False&quot; RadiusX=&quot;1&quot; RadiusY=&quot;1&quot;&amp;nbsp; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ContentPresenter x:Name=&quot;contentPresenter&quot; Content=&quot;{TemplateBinding Content}&quot; ContentTemplate=&quot;{TemplateBinding ContentTemplate}&quot; HorizontalAlignment=&quot;Left&quot; Margin=&quot;{TemplateBinding Padding}&quot;&amp;nbsp; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Rectangle x:Name=&quot;FocusVisualElement&quot; Stroke=&quot;#FF6DBDD1&quot; StrokeThickness=&quot;1&quot; Visibility=&quot;Collapsed&quot; RadiusX=&quot;1&quot; RadiusY=&quot;1&quot;&amp;nbsp; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Setter.Value&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;lt;/Setter&amp;gt;&lt;br /&gt;
&amp;lt;/Style&amp;gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;br /&gt;
너무 길죠?^^ 제가 알기 쉽게 Template부분만 간단히 정리해보죠. &lt;br /&gt;
&lt;br /&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #faffa9&quot;&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #ffdaed&quot;&gt;&lt;FONT color=#177fcd&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;ControlTemplate TargetType=&quot;ListBoxItem&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;Grid&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;vsm:VisualStateManager.VisualStateGroups/&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;ContentPresenter /&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&lt;/FONT&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;br /&gt;
&amp;nbsp;간단하죠?^^ 간단히 말하면 ListBoxItem은 하나의 ContentPresenter를 가지고 있는 &lt;br /&gt;
ContentControl 이죠. VisualStateManager는 Item 상태를 결정 해주는 것이고요.&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;사실 ContentPresenter이 없어도 됩니다. 다만 ItemTemplate이 무용지물이 되어버리죠.구지 ItemsTemplate을 쓰지 않고 Container로 모두 끝내도 된다면 상관없겠죠.&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;그리고 특히 Select나 MouseOver에 대해 특별한 애니메이션이 필요하다면 꼭 ItemContainerStyle을 다시 설정해주어야 하겠죠.&amp;nbsp;&amp;nbsp;또 ItemTemplate은 위의 ListBoxItem Style 중에 &amp;lt;ContentPresenter /&amp;gt; 부분을 대체하는 부분이기 때문에 ListBoxItem의 전체적인 디자인을 바꾸지는 못하겠죠. &lt;br /&gt;
&lt;br /&gt;결국 간단히 &lt;br /&gt;
&lt;br /&gt;&lt;STRONG&gt;ItemContainerStyle은 ListBoxItem의 Style을 바꾸는 것이고 &lt;br /&gt;
ItemTemplate은 ListBoxItem의 ContentPresenter 부분을 바꾸는 것입니다.&lt;/STRONG&gt; &lt;br /&gt;
&lt;br /&gt;(이렇게 간단한 걸.. 이렇게.. 길게 어렵게 설명한 것인가....--;;;)&lt;br /&gt;
&lt;br /&gt;아직 이해를 못하신 분들을 위해 두가지 예제를 보여드리죠. &lt;br /&gt;
&lt;br /&gt;다음의 경우를 살펴봅시다. &lt;br /&gt;
&lt;br /&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #fedec7 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #fedec7 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #fedec7 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #fedec7 1px solid; BACKGROUND-COLOR: #fedec7&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;FONT color=#57048c&gt;&amp;nbsp; &amp;lt;ListBox Width=&quot;60&quot; x:Name=&quot;ItemTemplateSettingListBox&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ListBox.ItemTemplate&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;DataTemplate&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;StackPanel Orientation=&quot;Horizontal&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Ellipse Width=&quot;5&quot; Height=&quot;5&quot; Margin=&quot;5&quot; Fill=&quot;Black&quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBlock Text=&quot;{Binding }&quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/StackPanel&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/DataTemplate&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ListBox.ItemTemplate&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ListBox&amp;gt;&lt;/FONT&gt;&lt;br /&gt;
&lt;/DIV&gt;&lt;br /&gt;
이 후 비하인드 코드에서 다음과 같이 셋팅해줍시다. &lt;br /&gt;

&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;&lt;FONT color=#57048c&gt;&amp;nbsp;ItemTemplateSettingListBox.ItemsSource = new List&amp;lt;string&amp;gt;() { &quot;하나&quot;, &quot;둘&quot;, &quot;셋&quot;, &quot;넷&quot; };&lt;/FONT&gt;&lt;br /&gt;
&lt;/DIV&gt;&lt;br /&gt;
결과는 다음과 같죠. &lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs15.tistory.com/image/4/tistory/2008/12/10/09/13/493f099084154&quot; alt=&quot;&quot; filemime=&quot;&quot; filename=&quot;ListBoxResult.JPG&quot; height=&quot;200&quot; width=&quot;62&quot;/&gt;&lt;/div&gt;ListBoxItem 안에들어가는 내용물 디자인이 바뀌긴 했지만 MouseOver나 Select시 State&amp;nbsp;변화는 똑같은 걸 알 수 있죠.&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; ItemsContainerStyle 을 바꾸어야 하는데 이것은 조금더 복잡하기 때문에 Blend를 사용하는 것이 좋을 것같습니다. Blend에서 ListBox를 선택한 후 ItemsContainerStyle을 바꿀려고 보니 아래 그림과 같이 메뉴가 없는 걸 알 수 있습니다. &lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs15.tistory.com/image/25/tistory/2008/12/10/09/21/493f0b7938c26&quot; alt=&quot;&quot; filemime=&quot;&quot; filename=&quot;WhereListBoxItemStyle1.JPG&quot; height=&quot;81&quot; width=&quot;414&quot;/&gt;&lt;/div&gt;&lt;br /&gt;
ItemTemplate과 다음장에 배울 ItemsPanel은 수정할 수 있는데 ItemsContainerStyle은 찾아볼 수가 없죠. 오른쪽 프로퍼티 창에는 존재하지만 GUI로 작업할 방법이 없는 듯 싶은데요..그래서 여기선 한가지 우회 방법을 써야만 합니다. &lt;br /&gt;
바로 ListBoxItem을 하나 만들어서 그 Style을 만들고 ItemsContainerStyle에 적용하는 것입니다. &lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 왼쪽 Control 메뉴를 클릭하면 선택할 수 있는 모든 컨트롤이 나옵니다.(아니 &quot;Show All&quot; 이 Check 되어있을 경우만요..)&lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs12.tistory.com/image/17/tistory/2008/12/10/09/25/493f0c73e981d&quot; alt=&quot;&quot; filemime=&quot;&quot; filename=&quot;WhereListBoxItemStyle2.JPG&quot; height=&quot;319&quot; width=&quot;650&quot;/&gt;&lt;/div&gt;&lt;br /&gt;
ListBoxItem을 클릭한 후에 ListBoxItem을 적당한 크기로 생성을 합니다. 그리고 ListBoxItem 의 Style을 조정해 주면 됩니다. &lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs14.tistory.com/image/16/tistory/2008/12/10/09/27/493f0ce73f60c&quot; alt=&quot;&quot; filemime=&quot;&quot; filename=&quot;WhereListBoxItemStyle3.JPG&quot; height=&quot;108&quot; width=&quot;318&quot;/&gt;&lt;/div&gt;&lt;br /&gt;
Style을 변경하는 방법은 다른 강좌에서 설명하기로 하고 여기서는 간단히 제가 임의로 수정하도록 하겠습니다. &lt;br /&gt;
Style을 다 만들고 나면 오른쪽 Resource Tab메뉴에 다음과 같이 Style이 생겨 있음을 볼 수 있습니다. &lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs10.tistory.com/image/25/tistory/2008/12/10/09/34/493f0eb0b7ee5&quot; alt=&quot;&quot; filemime=&quot;&quot; filename=&quot;WhereListBoxItemStyle4.JPG&quot; height=&quot;140&quot; width=&quot;292&quot;/&gt;&lt;/div&gt;그러면 이 등록된 Style을 ListBox의 ItemsContainerStyle에 적용하기만 하면 됩니다. 적용방법은 간단하죠. ListBox선택후 오른쪽 속성창에서 다음 그림에서 보이는 것처럼 설정해주시면 됩니다. &lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs15.tistory.com/image/34/tistory/2008/12/10/09/39/493f0fd46e4a8&quot; alt=&quot;&quot; filemime=&quot;&quot; filename=&quot;WhereListBoxItemStyle5.JPG&quot; height=&quot;245&quot; width=&quot;357&quot;/&gt;&lt;/div&gt;이제 적용된 결과를 테스트 해보시면 ListBox의 Item들이 전혀 다르게 Style이 적용된다는 것을 알 수 있을 겁니다. &lt;br /&gt;
&lt;br /&gt;그럼 다음에는 ItemsPanel 에 대해 설명하죠. 다음 장에는 좀더 자세히 설명을 해야겠다는 반성을.....--;;&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - smile -&lt;br /&gt;
&lt;br /&gt;
&lt;DIV style=&quot;MARGIN-LEFT: 16em&quot;&gt;p.s. 역시 샘플 프로젝트를 첨부합니다. &lt;br /&gt;
&lt;br /&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://error1001.tistory.com/attachment/493f249969c0aDY.zip&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/zip.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; MakeListBox.zip&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV&gt;&lt;br /&gt;
&amp;nbsp;&lt;/DIV&gt;</description>
			<category>Pre-Lecture</category>
			<category>ItemsContainerStyle</category>
			<category>ItemTemplate</category>
			<category>ListBox</category>
			<category>ListBoxItem</category>
			<category>silverlight</category>
			<category>실버라이트</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/18</guid>
			<comments>http://error1001.com/18#entry18comment</comments>
			<pubDate>Wed, 10 Dec 2008 11:09:21 +0900</pubDate>
		</item>
		<item>
			<title>[강좌] 1. Listbox의 기본적인 사용.(1) 아이템 셋팅.</title>
			<link>http://error1001.com/15</link>
			<description>&amp;nbsp;일단 대략적인 사용법은 아래의 강좌를 참고 하시길 바랍니다. &lt;br /&gt;
&lt;br /&gt;&lt;U&gt;스캇 구슬리의 영문 강좌&lt;/U&gt;&lt;br /&gt;
&lt;A href=&quot;http://weblogs.asp.net/scottgu/pages/silverlight-tutorial-part-5-using-the-listbox-and-databinding-to-display-list-data.aspx&quot;&gt;http://weblogs.asp.net/scottgu/pages/silverlight-tutorial-part-5-using-the-listbox-and-databinding-to-display-list-data.aspx&lt;/A&gt;&lt;br /&gt;
&lt;br /&gt;번역.&lt;br /&gt;
&amp;nbsp; &lt;A href=&quot;http://hoons.kr/board.aspx?Name=sivlerlighttip&amp;amp;board_idx=457368&amp;amp;page=1&amp;amp;Mode=2&amp;amp;BoardIdx=11410&quot;&gt;http://hoons.kr/board.aspx?Name=sivlerlighttip&amp;amp;board_idx=457368&amp;amp;page=1&amp;amp;Mode=2&amp;amp;BoardIdx=11410&lt;/A&gt;&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
그럼 전 따분한 이론은 별로 좋아하지 않으니 바로 실전으로 들어가보겠습니다. &lt;br /&gt;
&lt;br /&gt;ListBox의 프로퍼티나 메소드에 대한 설명은 강좌 중간, 중간에 설명하도록 하겠습니다. &lt;br /&gt;
&lt;br /&gt;그럼 일단 ListBox를 만들어 보죠.&lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs9.tistory.com/image/3/tistory/2008/07/14/09/57/487aa460b2dce&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;399&quot; width=&quot;553&quot;/&gt;&lt;/div&gt;&lt;br /&gt;
일단 테두리만 보일 뿐 아무것도 보이지 않는군요. 일단 여기에 Source를 셋팅 시켜야 겠죠.&lt;br /&gt;
이부분은 코드단에서 해야 하죠. 그럼 Page.xaml.cs 화일로 돌아가서 Item을 셋팅시켜주고 오겠습니다. &lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 여기서 Item을 셋팅 시켜주는 방법은 2가지가 있는데요 하나씩 알아보도록 하죠. &lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 먼저 &amp;nbsp;ListBoxItems 에 직접 셋팅해주는 방법입니다. 다음과 같죠.&lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs7.tistory.com/original/22/tistory/2008/07/14/10/12/487aa7f2cc0dc&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;310&quot; width=&quot;416&quot;/&gt;&lt;/div&gt;&lt;br /&gt;
코드로는 아래와 같죠.&lt;br /&gt;

&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #c9edff&quot;&gt;&lt;FONT color=#9b18c1&gt;myList.Items.Add(myRect);&lt;br /&gt;
myList.Items.Add(myEllipse);&lt;br /&gt;
&lt;/FONT&gt;&lt;/DIV&gt;&lt;br /&gt;
&lt;br /&gt;이렇게 아이템을 셋팅했을 때의 좋은 점은 소수의 아이템을 셋팅 시 간편하고 추가시킨 UIElement를 &lt;FONT color=#9b18c1&gt;MyList.Items&lt;/FONT&gt;&amp;nbsp;Collection을 통해 직접 가지고 올 수 있다는 것입니다. &lt;br /&gt;
&lt;br /&gt;그런데 이렇게 Item을 셋팅시켰을 때는 한가지 문제점이 생깁니다. 한번 Item으로 셋팅된 Item은 다시는 다른 곳에 셋팅시킬 수 없다는 것입니다. 이것은 버그성 같기도 하지만 어쨋든 다음과 같은 코드는 에러를 수반합니다. &lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs9.tistory.com/original/27/tistory/2008/07/14/10/28/487aaba788ffa&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;77&quot; width=&quot;370&quot;/&gt;&lt;/div&gt;&lt;br /&gt;
&amp;nbsp;이에 대한 것은 다른 글에 포스팅을 이미 했으니 참고 하시길 바랍니다. &lt;br /&gt;
&lt;br /&gt;&lt;A href=&quot;http://error1001.com/16&quot;&gt;http://error1001.com/16&lt;/A&gt;&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 두번째 방법은 위의 방법보다 정상적인 방법이라고 하겠습니다. 바로 ItemsSource 에 DataClass 의 Collection 을 셋팅하는 방법입니다. &lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 간단히 정리하면...&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; MyListBox.ItemsSource = collection;&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 뭐 이렇게 된다는 것이죠.&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 여기서 약간은 복잡한 루틴이 들어가는데..&amp;nbsp; 먼저 다음과 같은 코드를 써보죠.&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;

&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #c9edff&quot;&gt;&amp;nbsp; &lt;FONT color=#9b18c1&gt;MyList.ItemsSource = new List&amp;lt;int&amp;gt;() { 1,2,3,4,5 };&lt;/FONT&gt;&lt;/DIV&gt;&lt;br /&gt;
&amp;nbsp; 결과는 다음과 같습니다. &lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;img src=&quot;http://cfs7.tistory.com/image/30/tistory/2008/07/15/10/31/487bfdd684aad&quot; alt=&quot;사용자 삽입 이미지&quot; height=&quot;120&quot; width=&quot;405&quot;/&gt;&lt;/div&gt;&lt;br /&gt;
&amp;nbsp;내부적으로 이루어지는 코드를 살펴 보면 다음과 같습니다. (아래는 beta1때 공개된 Mix Control 소스입니다. 현재버전과는 조금 상이한 부분이 있습니다. 하지만 내부적인 구현은 비슷합니다.)&lt;br /&gt;
&lt;br /&gt;
&lt;DIV style=&quot;PADDING-RIGHT: 10px; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; PADDING-TOP: 10px; BACKGROUND-COLOR: #c9edff&quot;&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&lt;FONT color=#9b18c1&gt; protected override void PrepareContainerForItemOverride(DependencyObject element, object item) &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; base.PrepareContainerForItemOverride(element, item);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ListBoxItem listBoxItem = element as ListBoxItem; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Debug.Assert(null != listBoxItem);&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; listBoxItem.ParentListBox = this; &lt;br /&gt;
&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; bool setContent = true;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (listBoxItem != item) &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (null != ItemTemplate) &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; listBoxItem.ContentTemplate = ItemTemplate; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; else if (!string.IsNullOrEmpty(DisplayMemberPath)) &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; Binding binding = new Binding(DisplayMemberPath); &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; binding.Converter = new DisplayMemberValueConverter();&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; listBoxItem.SetBinding(ContentControl.ContentProperty, binding);&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; setContent = false; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;br /&gt;
&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; listBoxItem.Item = item;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if (setContent)&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; { &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; listBoxItem.Content = item;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; ObjectToListBoxItem[item] = listBoxItem; &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; } &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; // Apply ItemContainerStyle&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; if ((null != ItemContainerStyle) &amp;amp;&amp;amp; (null == listBoxItem.Style)) &lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; listBoxItem.Style = ItemContainerStyle;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; }&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; .&lt;br /&gt;
&lt;/FONT&gt;&lt;/DIV&gt;&lt;br /&gt;
여기서 PrepareContainerForItemOverride 함수는 ItemsControl의 Virtual 함수인데 &lt;br /&gt;
&lt;br /&gt;Listbox에 들어갈 Item들을 준비해주는 함수입니다. 아이템의 생성은 다른 부분에서&lt;br /&gt;
&lt;br /&gt;일어나고 여기서는 이미 생성된 아이템의 스타일이나 프로퍼티 값등을 설정해주는 &lt;br /&gt;
&lt;br /&gt;부분입니다. &lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 여기서 DependencyObject 로 들어오는 element가 바로 ListBoxItem 에 해당하는&lt;br /&gt;
&lt;br /&gt;UI 객체에 해당하고 object로 들어오는 item은 바로 사용자가 셋팅해준 collection의 &lt;br /&gt;
&lt;br /&gt;한 item 이 됩니다. &lt;br /&gt;
&lt;br /&gt;여기서 보면 &lt;FONT color=#9b18c1&gt;listBoxItem.Content = item; &lt;/FONT&gt;&lt;FONT color=#000000&gt;이렇게 셋팅해주는 부분이 있는데 이 부분에서&lt;br /&gt;
&lt;br /&gt;item이 UIElement가 아닐 경우에는 object의 ToString 값이 화면에 표시가 됩니다.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&amp;nbsp; 이부분은 앞서 설명했듯이. ListBoxItem 도 하나의 ContentControl로써 ContentPresenter를 포함하고 있습니다. &lt;br /&gt;
ContentControl은 Content로 UIElement가 들어올 경우에는 PlaceHolder 역할을 합니다. 하지만 다른 경우에는 TextBlock으로 대체하게 됩니다.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 여기서 DataBinding 을 좀더 잘 활용하기 위해서는&amp;nbsp; ListBox의 ItemTemplate과 ItemContainerStyle 속성을 활용하여야 하는데 이 이야기는 다음강좌에 하도록 하죠. 일단은 의도와는 다르게 벌써 글이 길어져서..^^&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - smile -&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;/FONT&gt;&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
&lt;br /&gt;&amp;nbsp; &lt;br /&gt;</description>
			<category>Pre-Lecture</category>
			<category>Item 셋팅.</category>
			<category>ListBox</category>
			<category>silverlight</category>
			<category>실버라이트</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/15</guid>
			<comments>http://error1001.com/15#entry15comment</comments>
			<pubDate>Wed, 10 Dec 2008 09:00:20 +0900</pubDate>
		</item>
		<item>
			<title>[강좌] ContentControl?? ContentPresenter</title>
			<link>http://error1001.com/40</link>
			<description>&lt;br /&gt;
바로 리스트 박스로 들어가자고 하니 초반부터 낙오자가 많을 것같다는 생각이 들더군요. 그래서 아주 기본 컨트롤부터 시작하기로 했습니다. &lt;br /&gt;
&lt;br /&gt;
  ContentControl은 아주 유용한 Control이면서 아주 기본적인 Control입니다. 우리가 알고 있는 대부분의 Control이 ContentControl을 상속받고 있죠. 일단 모든 Button류가 상속하고 있고 ListBoxItem등도 상속하고 있는 클래스입니다. &lt;br /&gt;
&lt;br /&gt;
   그럼 이것이 도데체 어떤 컨트롤인지 알아보기 위해 한번 화면에 뿌려보도록 하겠습니다. &lt;br /&gt;
&lt;br /&gt;
다음처럼 간단한 코드를 Xaml에 추가해보죠..&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#801fbf&quot;&gt;&amp;lt;ContentControl Content=&quot;This is a ContentControl!!&quot;/&gt;&lt;/font&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;span&gt;화면에 단순히 &lt;span style=&quot;FONT-SIZE: 9pt&quot;&gt;&lt;strong&gt;&quot;This is a ContentControl!!&quot; &lt;/strong&gt;이라고 뿌려지는 것을 볼 수 있을 겁니다. &lt;br /&gt;
&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;
뭐야... 그냥 TextBlock 인거야?... 하지만 다음과 같은 코드를 뿌려보면 단번에 뭐하는 녀석인지 알 수 있습니다. &lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
       &lt;font color=&quot;#801fbf&quot;&gt;&amp;lt;ContentControl&gt;&lt;br /&gt;
            &amp;lt;ContentControl.Content&gt;&lt;br /&gt;
                &amp;lt;Ellipse Width=&quot;50&quot; Height=&quot;50&quot; Fill=&quot;Purple&quot;/&gt;&lt;br /&gt;
            &amp;lt;/ContentControl.Content&gt;&lt;br /&gt;
        &amp;lt;/ContentControl&gt;&lt;br /&gt;
&lt;/font&gt;&lt;/div&gt;
&lt;br /&gt;
결과는 단순히 보라색 동그라미가 화면에 뿌려지는 것일 겁니다. (여기서 ContentControl.Content 태그는 생략해도 상관없습니다.)&lt;br /&gt;
&lt;br /&gt;
아하 그러면 결국 이놈은 그냥 Content를 표시해주는 역활을 해주는 것이군요... &lt;br /&gt;
&lt;br /&gt;
사실 좀더 세부적으로 어떻게 구현되는 가를 살펴보기 위해 ContentControl의 Template을 살펴보도록 하죠. &lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#801fbf&quot;&gt;&amp;lt;ControlTemplate TargetType=&quot;ContentControl&quot; &gt;&lt;br /&gt;
    &amp;lt;ContentPresenter Content=&quot;{TemplateBinding Content}&quot;  ContentTemplate=&quot;{TemplateBinding ContentTemplate}&quot; Cursor=&quot;{TemplateBinding Cursor}&quot; Margin=&quot;{TemplateBinding Padding}&quot; HorizontalAlignment=&quot;{TemplateBinding HorizontalContentAlignment}&quot; VerticalAlignment=&quot;{TemplateBinding VerticalContentAlignment}&quot; /&gt;&lt;br /&gt;
&amp;lt;/ControlTemplate&gt;&lt;/font&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;br /&gt;
여러가지 속성들이 TemplateBinding 되어있는데 이런 속성들은 그냥 ContentControl의 속성을 ContentPresenter에 셋팅시켜주는 것일 뿐이고 결국은 내부적으로 ContentPresenter만 달랑 들어있는 형상이네요. &lt;br /&gt;
&lt;br /&gt;
  그럼 이 ContentPresenter 란 놈은 무슨 일을 하는지 알아봐야 겠죠. 아쉽게도 ContentPresenter는 Template도 없고 더 뜯어볼 코드도 없습니다. &lt;br /&gt;
&lt;br /&gt;
  예전 beta1때 공개되었던 코드를 참고하자면 다음과 같습니다. (현재의 CotentPresenter와 다른 점이 있을 수 있습니다. 일단 Text관련 Property들이 대부분 사라졌습니다. 현재는 ContentPresenter에 Content와 ContentTemplate 두가지 속성만이 있습니다. )&lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://error1001.tistory.com/attachment/493dce59a9e909U.cs&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/unknown.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; ContentPresenter.cs&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
  코드를 살펴보면 다음과 같은 DefaultTemplate을 가지고 있는 것을 알 수 있습니다. &lt;br /&gt;
&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;font color=&quot;#801fbf&quot;&gt;private const string ContentPresenterDefaultTemplate =&lt;br /&gt;
            &quot;&amp;lt;ControlTemplate &quot; +&lt;br /&gt;
              &quot;xmlns=\&quot;&lt;/font&gt;&lt;a href=&quot;http://schemas.microsoft.com/client/2007/&quot;&gt;&lt;font color=&quot;#801fbf&quot;&gt;http://schemas.microsoft.com/client/2007\&lt;/font&gt;&lt;/a&gt;&lt;font color=&quot;#801fbf&quot;&gt;&quot; &quot; + &lt;br /&gt;
              &quot;xmlns:x=\&quot;&lt;/font&gt;&lt;a href=&quot;http://schemas.microsoft.com/winfx/2006/xaml/&quot;&gt;&lt;font color=&quot;#801fbf&quot;&gt;http://schemas.microsoft.com/winfx/2006/xaml\&lt;/font&gt;&lt;/a&gt;&lt;font color=&quot;#801fbf&quot;&gt;&quot; &quot; + &lt;br /&gt;
              &quot;xmlns:controls=\&quot;clr-namespace:System.Windows.Controls;assembly=System.Windows.Controls\&quot; &quot; +&lt;br /&gt;
              &quot;TargetType=\&quot;controls:ContentPresenter\&quot;&gt;&quot; + &lt;br /&gt;
                &quot;&amp;lt;Grid x:Name=\&quot;RootElement\&quot; &quot; +&lt;br /&gt;
                  &quot;Background=\&quot;{TemplateBinding Background}\&quot; &quot; +&lt;br /&gt;
                  &quot;Cursor=\&quot;{TemplateBinding Cursor}\&quot;&gt;&quot; + &lt;br /&gt;
                    &quot;&amp;lt;TextBlock x:Name=\&quot;TextElement\&quot; &quot; +&lt;br /&gt;
                      &quot;FontFamily=\&quot;{TemplateBinding FontFamily}\&quot; &quot; +&lt;br /&gt;
                      &quot;FontSize=\&quot;{TemplateBinding FontSize}\&quot; &quot; + &lt;br /&gt;
                      &quot;FontStretch=\&quot;{TemplateBinding FontStretch}\&quot; &quot; + &lt;br /&gt;
                      &quot;FontStyle=\&quot;{TemplateBinding FontStyle}\&quot; &quot; +&lt;br /&gt;
                      &quot;FontWeight=\&quot;{TemplateBinding FontWeight}\&quot; &quot; + &lt;br /&gt;
                      &quot;Foreground=\&quot;{TemplateBinding Foreground}\&quot; &quot; +&lt;br /&gt;
                      &quot;HorizontalAlignment=\&quot;{TemplateBinding HorizontalContentAlignment}\&quot; &quot; +&lt;br /&gt;
                      &quot;Padding=\&quot;{TemplateBinding Padding}\&quot; &quot; + &lt;br /&gt;
                      &quot;TextAlignment=\&quot;{TemplateBinding TextAlignment}\&quot; &quot; +&lt;br /&gt;
                      &quot;TextDecorations=\&quot;{TemplateBinding TextDecorations}\&quot; &quot; +&lt;br /&gt;
                      &quot;TextWrapping=\&quot;{TemplateBinding TextWrapping}\&quot; &quot; + &lt;br /&gt;
                      &quot;VerticalAlignment=\&quot;{TemplateBinding VerticalContentAlignment}\&quot; &quot; + &lt;br /&gt;
                      &quot;Visibility=\&quot;Collapsed\&quot; /&gt;&quot; +&lt;br /&gt;
                &quot;&amp;lt;/Grid&gt;&quot; + &lt;br /&gt;
            &quot;&amp;lt;/ControlTemplate&gt;&quot;;&lt;/font&gt;&lt;/div&gt;
&lt;br /&gt;
  간단히 Grid 안에 TextBlock 하나 있는 그런 Template인 거죠. &lt;br /&gt;
&lt;br /&gt;
  내부적인 구현을 보면 Content와 ContentTemplate Property Change 시 마다 자신의 DataContext에 Content나 ContentTemplate을 엮어준 후 PrepareContentPresenter라는 메소드를 호출해줍니다. 여기서 PrepareContentPresenter 라는 메소드에서는 다음과 같은 작업을 수행합니다. &lt;br /&gt;
&lt;ol style=&quot;LIST-STYLE-TYPE: decimal&quot;&gt;
&lt;li&gt;먼저 Default Template을 통해 들어있던 객체를 Grid로부터 제거 합니다. &lt;/li&gt;
&lt;li&gt;그리고 새로 받은 Template이 있으면 Template을 Content에 UIElement가 있으면 Content를 엘리먼트에 집어넣어줍니다. &lt;/li&gt;
&lt;li&gt;새로 셋팅된 Template도 없고 Content가 UIElement도 아닌 경우 Default Template에 있던 TextBlock의 Text값에  Content를 ToString 해서 넣어줍니다.&lt;/li&gt;
&lt;/ol&gt;
결국 ContentPresenter는 단순한 PlaceHolder 역활을 해준다는 것입니다. 여기서 한가지 알아보지 않은 것이 ContentTemplate 인데 ContentPresenter에 새로운 Template을 넣어준다고 생각하면 쉬울 것같습니다. 다음과 같은 코드를 실행해 보죠.&lt;br /&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;
&lt;br /&gt;
&lt;font color=&quot;#801fbf&quot;&gt;        &amp;lt;ContentControl Content=&quot;This is a ContentControl!!!&quot;&gt;&lt;br /&gt;
            &amp;lt;ContentControl.ContentTemplate&gt;&lt;br /&gt;
                &amp;lt;DataTemplate&gt;&lt;br /&gt;
                    &amp;lt;Grid&gt;&lt;br /&gt;
                        &amp;lt;Ellipse Width=&quot;200&quot; Height=&quot;50&quot; Fill=&quot;LightSteelBlue&quot;/&gt;&lt;br /&gt;
                        &amp;lt;TextBlock Text=&quot;{Binding }&quot; VerticalAlignment=&quot;Center&quot; HorizontalAlignment=&quot;Center&quot; /&gt;&lt;br /&gt;
                    &amp;lt;/Grid&gt;&lt;br /&gt;
                &amp;lt;/DataTemplate&gt;&lt;br /&gt;
            &amp;lt;/ContentControl.ContentTemplate&gt;&lt;br /&gt;
        &amp;lt;/ContentControl&gt;&lt;/font&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
결과는  &lt;table style=&quot;display: inline; border-collapse: collapse&quot;&gt;&lt;tr&gt;&lt;td&gt;&lt;img src=&quot;http://cfs13.tistory.com/image/34/tistory/2008/12/09/11/22/493dd66cdfa6e&quot; alt=&quot;&quot; filemime=&quot;&quot; filename=&quot;ContentControl3.JPG&quot; height=&quot;51&quot; width=&quot;203&quot;/&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;  요렇습니다. &lt;/div&gt;
&lt;div&gt;
여기서 &lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(128, 31, 191); &quot;&gt;Text=&quot;{Binding }&quot;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(51, 51, 51); &quot;&gt; 부분은 ContentControl의 DataContext 바로 Content를 Binding 하겠다는 뜻입니다. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
그러니까 &quot;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(128, 31, 191); &quot;&gt;This is a ContentControl!!!&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(51, 51, 51); &quot;&gt;&quot; 요 문장을 Text에 바인딩한 것이죠. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
Content 값이 바뀜에 따라 글자가 얼마든지 바뀔 수 있습니다. 그러면 다음과 같은 시도를 해보면 어떨까요?&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(87, 4, 140);&quot;&gt;      &lt;/span&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(128, 31, 191);&quot;&gt;  &amp;lt;ContentControl x:Name=&quot;contentControl&quot;&gt;&lt;br /&gt;
           &amp;lt;ContentControl.ContentTemplate&gt;&lt;br /&gt;
               &amp;lt;DataTemplate&gt;&lt;br /&gt;
                    &amp;lt;Grid&gt;&lt;br /&gt;
                       &amp;lt;Ellipse Width=&quot;200&quot; Height=&quot;50&quot; Fill=&quot;LightSteelBlue&quot;/&gt;&lt;br /&gt;
                       &amp;lt;TextBlock Text=&quot;{Binding Tag}&quot; /&gt;&lt;br /&gt;
                    &amp;lt;/Grid&gt;&lt;br /&gt;
                &amp;lt;/DataTemplate&gt;&lt;br /&gt;
            &amp;lt;/ContentControl.ContentTemplate&gt;&lt;br /&gt;
        &amp;lt;/ContentControl&gt;&lt;/span&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
그리고 비하인드 코드에 다음과 같은 코드를 추가 시킵니다. &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
&lt;div class=&quot;txc-textbox&quot; style=&quot;border-top-style: solid; border-right-style: solid; border-bottom-style: solid; border-left-style: solid; border-top-width: 1px; border-right-width: 1px; border-bottom-width: 1px; border-left-width: 1px; border-top-color: rgb(219, 232, 251); border-right-color: rgb(219, 232, 251); border-bottom-color: rgb(219, 232, 251); border-left-color: rgb(219, 232, 251); background-color: rgb(219, 232, 251); padding-top: 10px; padding-right: 10px; padding-bottom: 10px; padding-left: 10px; &quot;&gt;
  public partial class Page : UserControl&lt;br /&gt;
  {&lt;br /&gt;
        public Page()&lt;br /&gt;
        {&lt;br /&gt;
            InitializeComponent();&lt;br /&gt;
            contentControl.Content = new TestData() { Tag = &quot;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(128, 31, 191); &quot;&gt;This is a ContentControl!!!&lt;/span&gt;&quot; };&lt;br /&gt;
         }&lt;br /&gt;
   }&lt;br /&gt;
&lt;br /&gt;
    public class TestData&lt;br /&gt;
   {&lt;br /&gt;
        public string Tag { get; set; }&lt;br /&gt;
   }&lt;/div&gt;
&lt;/div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
결과는 바로위의 예제와 같습니다. &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
이번에는 TextBlock의 Text가 ,Content로 엮인 TestData의 Tag Property와 Binding 이 된 것이죠.&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
그럼 ContentControl에 대해 이해가 잘 되셨는지 모르겠군요.^^ &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
마지막으로 한가지 팁을 알려드리자면. ContentControl은 Grid 나 Popup 같이 DataContext를 줄 수 없는 객체에 바인딩을 하는 용도로도 쓸 수 있어요.   Popup 이나 Grid 등을 ContentControl로 감싸고 ContentControl에 DataContext 값을 주면 되죠.. 이런게 어디 쓸모 있을까 싶겠지만 나중에 복잡한 바인딩 모델을 쓰다보면 불가피하게 써야 하는 경우가 생기더군요. &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
  그럼 모두 삽질 덜 하시길..~^^&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
                                                                                                                         - smile -&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div style=&quot;margin-left: 8em; &quot;&gt;
p.s. 샘플프로젝트를 첨부합니다. &lt;/div&gt;
&lt;div style=&quot;margin-left: 8em; &quot;&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div style=&quot;margin-left: 8em; &quot;&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://error1001.tistory.com/attachment/493ded2442075DQ.zip&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/zip.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; ContentControlTest.zip&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;</description>
			<category>Pre-Lecture</category>
			<category>ContentControl</category>
			<category>ContentPresenter</category>
			<category>silverlight</category>
			<category>실버라이트</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/40</guid>
			<comments>http://error1001.com/40#entry40comment</comments>
			<pubDate>Tue, 09 Dec 2008 13:00:12 +0900</pubDate>
		</item>
		<item>
			<title>[강좌] ListBox 를 사용하자!!</title>
			<link>http://error1001.com/14</link>
			<description>대략적인 강좌 진행은 다음같이 할 예정입니다. &lt;br /&gt;
&lt;br /&gt;&amp;nbsp;1. ListBox 의 기본 적인 사용법&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;2. ListBox 의 확장.(ListBox 상속 받아 쓰기)&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;3. Listbox Clone 만들기.&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;4. RichListBox 만들기. &lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;이 중 1, 2, 3 번은 확정이고 4번은 고민중입니다. 아직 구현된 component가 제대로 작동하는지 충분히 테스트 해보지 못했기 때문입니다. 그럼 이제 시작해보죠. &lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp;&amp;nbsp; - smile -</description>
			<category>Pre-Lecture</category>
			<category>ListBox</category>
			<category>silverlight</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/14</guid>
			<comments>http://error1001.com/14#entry14comment</comments>
			<pubDate>Tue, 09 Dec 2008 08:58:15 +0900</pubDate>
		</item>
		<item>
			<title>ListBox의 Select된 객체 해제하기.(Select취소하기)</title>
			<link>http://error1001.com/39</link>
			<description>&lt;br /&gt;
ListBox는 많은 프로젝트에서 가장 많이 사용하면서도 쓰기 어려운 컨트롤중에 하나죠. 여기서 가끔 사용하게 되는 것이 이미 Select된 객체를 취소시키는 것입니다. 코드로 Select를 하는 방법은 두가지가 있죠. 하나는 SelectedItem을 이용하는 방법이고 하나는 SelectedIndex를 사용하는 방법입니다.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; SelectedIndex는 선택된 객체의 순서를 반환해주고 SelectedItem은 선택된 객체의 Binding된 Data 값을 반환해주죠.&lt;br /&gt;
셋팅을 해줄 때도 역시 선택할 객체의 Index값을 SelectedIndex에 넣어주거나 우리가 선택하고 싶은 Data를 SelectedItem에 셋팅해줌으로써 Select된 객체를 바꿀 수 있습니다.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 그리고 선택이 되지 않은 초기 값은 SelctedIndex 는 -1 이며 SelectedItem 은 null 값이 됩니다.&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 그러면 반대로 선택을 해제 시키려면 SelectedIndex 에 -1값을 넣어주거나 SelectedItem에 null값을 집어넣어주면 되겠죠... &lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp; 그런데 문제는 이것이 잘 안먹는다는데 있습니다. 간단하게 테스트를 해보죠.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&amp;nbsp;Xaml 코드에서 ListBox를 하나 생성해준 뒤 이름을 그냥 &quot;list&quot; 라고 넣어두었습니다. &lt;br /&gt;
&lt;br /&gt;그리고 코드는 다음과 같습니다. &lt;br /&gt;
&lt;br /&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;&lt;br /&gt;
&lt;FONT color=#ffffff&gt;&amp;nbsp;&lt;FONT color=#57048c&gt;public Page()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.ItemsSource = new List&amp;lt;int&amp;gt; { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.SelectionChanged += new SelectionChangedEventHandler(list_SelectionChanged);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;&lt;FONT color=#57048c&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void list_SelectionChanged(object sender, SelectionChangedEventArgs e)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&lt;/FONT&gt;
&lt;DIV style=&quot;MARGIN-LEFT: 4em&quot;&gt;&lt;FONT color=#57048c&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.SelectedItem = null; // 혹은 list.SelectedIndex = -1;&lt;br /&gt;
&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV&gt;&lt;FONT color=#57048c&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;br /&gt;
선택하자 마자. Select를 풀어주자는 것이죠. 그런데 결과를 보면 절대로 Select는 풀리지 않죠.. Select가 풀리지 않으니 한번 선택한 객체를 다시 선택 이벤트를 받는 것은 불가능해지는 것이죠... --;; 어쩐다..&lt;br /&gt;
&lt;br /&gt;해결 방법은 간단합니다. &quot;&lt;FONT color=#57048c&gt; list.SelectedItem = null;&quot;&lt;/FONT&gt;&amp;nbsp;요 부분을 다음과 같이 바꿔주면 정상 작동합니다. &lt;br /&gt;
&lt;br /&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;&lt;br /&gt;
if (e.AddedItems.Count != 0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;list.Dispatcher.BeginInvoke(() =&amp;gt; { list.SelectedItem = null; });&lt;br /&gt;
&lt;br /&gt;&lt;/DIV&gt;&lt;br /&gt;
내부적인 작동은 알수 없지만 추측해보자면.. SelectionChanged 이벤트가 일어나는 타이밍의 문제가 아닐까 싶습니다. &lt;br /&gt;
&lt;br /&gt;SelectionChanged가 일어났을때는 아직 SelectedIndex나 SelectedItem 설정에 대한 로직이 아직 진행중인 상태인 거죠.&amp;nbsp; 로직이 완전히 끝났을 때 다시 SelectedIndex를 설정해주어야만 정상작동하게 되는 것이죠. Dispatcher는 현재 UI스레드 작업이 완료되면 그 다음 작업을 실행시켜주는 것이니 현재는 아마 처음 Selection 에대한 작업이 실행될 것이고 이 작업이 끝나면 자동적으로 SelectedIndex나 SelectedItem설정에 대한 로직도 끝나 있는 것이죠. 그리고 그 후에 Disptcher에 등록시켜둔 list.SelectedItem = null 이라는 명령을 수행하게 되면 정상작동하게 되는게 아닐까 합니다. &lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 순전히 추측일뿐 정확한 이야기는 아닐 수 있습니다. 확인 방법은 ListBox 의 내부 코드를 뜯어보는 수밖에..(사실 예전에 뜯어봤는데 지금 다시 뜯어보기 귀찮아서..--;;)&lt;br /&gt;
&lt;br /&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt&quot;&gt;&amp;nbsp; 일단 간단히&amp;nbsp;SelectionChanged에서&amp;nbsp;Select 된 객체를 바꿔주거나 해제시켜주고 싶을 때는 Dispatcher를 사용하면 된다는 것입니다.&amp;nbsp;&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 여기서 좀더 흥미로운 실험을 더 해보도록 하겠습니다. 신기하게도 제가 이사실을 발견하고 Gilbert에게 이 사실에 대해 알려주었을 때 Gilbert군은 그냥 SelectedItem 에 null 값을 넣어주면 아이템이 해제된다고 하더군요.. 그래서 Gilbert가 구현한 코드를 보았습니다. 신기하게도 Dispatcher를 사용하지 않고 정상작동되더군요.&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; Gilbert가 구현한 부분은 여러개의 리스트 박스가 있어 여러개의 리스트 박스 중 한개의 리스트 박스에만 Selected Item이 존재하도록 하는 것이었습니다. 그래서 하나의 리스트 박스에서 SelectionChanged이벤트로 Selection이 일어났을 때 다른 ListBox객체들의 SelectedItem 값을 null로 만들어주어서 다른 리스트 박스의 선택값을 해제시켜주는 것이죠.&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; Gibert군의 코드에서 이건 정말 잘 작동하였습니다. 그래서 저는 다시 테스트를 해보기로 했습니다. 이번에는 ListBox를 하나더 추가하고 이름을 &quot;list2&quot;라고 지어줬습니다. &lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp; 그리고 아래와 같이 코드를 구성했습니다. &lt;br /&gt;
&lt;br /&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;&lt;br /&gt;
&amp;nbsp; &lt;FONT color=#57048c&gt;public Page()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.ItemsSource = new List&amp;lt;int&amp;gt; { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.SelectionChanged += new SelectionChangedEventHandler(list_SelectionChanged);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list2.ItemsSource = new List&amp;lt;int&amp;gt; { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list2.SelectionChanged += new SelectionChangedEventHandler(list2_SelectionChanged);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;&lt;FONT color=#57048c&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void list2_SelectionChanged(object sender, SelectionChangedEventArgs e)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;list.SelectedItem = null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;&lt;FONT color=#57048c&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void list_SelectionChanged(object sender, SelectionChangedEventArgs e)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list2.SelectedItem = null;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/DIV&gt;&lt;br /&gt;
결과는... 일단 처음에 list에 3을 클릭하고 list2의 4를 클릭했을 때 분명히 list의 3이 선택해제가 되었습니다. 오.. 이것은 되는 구나 했지만... 그다음에 바로 오작동이 시작되었습니다. 다시&amp;nbsp;list의&amp;nbsp;3을 클릭했을 때 list2의 4는 선택해제가 되지 않았습니다. 뿐만 아니라 그 이후에 list의 3을 클릭해도 list2의 4를 클릭해도 전혀 SelectionChaged 이벤트가 들어오지 않더군요..&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 이 오작동을 가지고 Gilbert가 실제로 구현해 놓은 부분에 가서 확인을 해보았습니다. 그런데 정말 신기하게도 이런 오작동도 발견되지 않더군요. 그래서 다음처럼 구현을 해보았습니다. &lt;br /&gt;
&lt;br /&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;&lt;FONT color=#57048c&gt;public Page()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.ItemsSource = new List&amp;lt;int&amp;gt; { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.SelectionChanged += new SelectionChangedEventHandler(list_SelectionChanged);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list2.ItemsSource = new List&amp;lt;int&amp;gt; { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 };&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list2.SelectionChanged += new SelectionChangedEventHandler(list_SelectionChanged);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;&lt;FONT color=#57048c&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void list_SelectionChanged(object sender, SelectionChangedEventArgs e)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (e.AddedItems.Count == 0)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; return;&lt;/FONT&gt;&lt;/DIV&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;&lt;FONT color=#57048c&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (sender == list)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list2.SelectedItem = null;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; else&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;/FONT&gt;&lt;FONT color=#57048c&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; list.SelectedItem = null;&amp;nbsp;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;
&lt;/FONT&gt;&lt;/DIV&gt;&lt;br /&gt;
list와 list2에서 같은 EventHandler를 사용하는 것이죠. 이렇게 하는 것이 무슨 차이점이 있는지 알 수 없지만 Gilbert군이 구현해놓은 코드에는 이런식으로 구현이 되어있었습니다. &lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 결과는.... 정말 잘 작동합니다....&amp;nbsp;&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 이게 잘 작동하는 이유는 정말 알 수가 없군요...&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
결국 정리하자면 이렇습니다. &lt;br /&gt;
&lt;br /&gt;&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 12pt&quot;&gt;SelectionChaged 이벤트에서 listBox의 Selection을 바꿔주고 싶을 때는&amp;nbsp;왠만하면&amp;nbsp;Dispatcher를 쓰자!!!!&lt;br /&gt;
&lt;/SPAN&gt;&lt;br /&gt;
&lt;br /&gt;&lt;/STRONG&gt;그럼 모두 삽질 덜하시길...^^&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - smile -&lt;br /&gt;</description>
			<category>Tip</category>
			<category>ListBox</category>
			<category>selectedIndex</category>
			<category>SelectedItem</category>
			<category>silverlight</category>
			<category>선택취소</category>
			<category>실버라이트</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/39</guid>
			<comments>http://error1001.com/39#entry39comment</comments>
			<pubDate>Tue, 02 Dec 2008 12:27:50 +0900</pubDate>
		</item>
		<item>
			<title>현재 나에게 걸린 프로젝트.</title>
			<link>http://error1001.com/38</link>
			<description>&lt;br /&gt;
뭐 내가 나에게 거는 프로젝트이기도 하지만.. &lt;br /&gt;
&lt;br /&gt;1. 일단은 어젯밤 달린 DeepZoomable 인터페이스.&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp; 일단 Draggable과 Zoomable로 분화 뒤 구현은 성공. 하지만 Boundary 적용을 어떻게 할지 아직 고민중.&lt;br /&gt;
&amp;nbsp; 나중에 통합했을 때 Boundary 적용은 또 어떻게 해야 할지 고민..&lt;br /&gt;
&lt;br /&gt;2. MediaFlow Component 설명서 만들기... &lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 아... SandCastle 자꾸 out of Memory 나온다..&amp;nbsp;&lt;br /&gt;
&amp;nbsp; 추가로 구현해야 하는 Media 연속재생과 광고부분은 어떻게 할지 아직 고민중.&lt;br /&gt;
&amp;nbsp; &lt;br /&gt;
3. ColorPicker Custom Control 화.&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 생각보다 쉽지 않다.. 그냥 막 만들어도 되긴 하지만 그래도..&lt;br /&gt;
&amp;nbsp; 뭐 중요도는 높지 않아 안할수도..&lt;br /&gt;
&lt;br /&gt;4. Me2Day 그림판.&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 지난번 만박님의 압박으로 좀 급해지긴 했는데.. 막상 손에 안잡힌다. 이건 도데체 언제 한다냐...&lt;br /&gt;
&lt;br /&gt;5. Library 정리.&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; Never Ending Project... 흠냐... &lt;br /&gt;
&amp;nbsp; Unit Test는 몰라도 Sample project추가하는 일은 다른 사람에게 할당해야 겠다. &lt;br /&gt;
&lt;br /&gt;6. 책쓰기. 강좌 쓰기..&lt;br /&gt;
&lt;br /&gt;&amp;nbsp; 아놔.. 몰라... &lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;생각보다 정말 할 일 많구만... + 영업 및 교육도 간간히 있을터니 어찌 할꼬...&lt;br /&gt;
&lt;br /&gt;그런데... 어째 돈되는 일은 하나도 없구만...--;;&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - smile -</description>
			<category>푸념</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/38</guid>
			<comments>http://error1001.com/38#entry38comment</comments>
			<pubDate>Sun, 30 Nov 2008 08:46:53 +0900</pubDate>
		</item>
		<item>
			<title>FontSource 설정시 주의!!!</title>
			<link>http://error1001.com/37</link>
			<description>&lt;br /&gt;
FontSource 를 셋팅하는 방법은 다음과 같습니다. &lt;br /&gt;
&lt;br /&gt;tbText.FontSource = new FontSource(stream);&lt;br /&gt;
&lt;br /&gt;여기서 stream은 보통&amp;nbsp;폰트 화일을 압축한 zip화일을 WebClient로 불러와서 설정해주게 되죠.&lt;br /&gt;
&lt;br /&gt;여기서 주의 할 점.&lt;br /&gt;
&lt;br /&gt;Font 화일이 화일명이 한글 화일이면 폰트가 제대로 적용안된다는 것입니다. &lt;br /&gt;
&lt;br /&gt;쉽게 말해.&lt;br /&gt;
&lt;br /&gt;&#039;나눔고딕.ttf&#039; 이런 화일을 압축해서 &quot;NanumGothic.zip&quot; 화일로 압축했다고 하면. &lt;br /&gt;
&lt;br /&gt;이 zip&amp;nbsp;화일의 stream 을 FontSource에다가 넣어준 경우 Font stream을 제대로 얻어오지 못한다는 것입니다. &lt;br /&gt;
&lt;br /&gt;&#039;NanumGothic.ttf&#039;로 화일명을 변경후 압축해서 WebClient를 통해&amp;nbsp;Stream을 받으면 정상 작동하게 되죠..^^&lt;br /&gt;
&lt;br /&gt;그럼 모두 삽질 금지!!!!&lt;br /&gt;
&lt;br /&gt;
&lt;DIV style=&quot;MARGIN-LEFT: 36em&quot;&gt;-&amp;nbsp; smile -&lt;/DIV&gt;</description>
			<category>Don&#039;t Panic</category>
			<category>FontSource</category>
			<category>silverlight</category>
			<category>실버라이트</category>
			<category>폰트</category>
			<category>폰트소스</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/37</guid>
			<comments>http://error1001.com/37#entry37comment</comments>
			<pubDate>Tue, 25 Nov 2008 23:11:48 +0900</pubDate>
		</item>
		<item>
			<title>YouCard Re-visited: Implementing the ViewModel pattern 해석</title>
			<link>http://error1001.com/36</link>
			<description>제목 : ViewModel 패턴의 적용(Implementing)&lt;div&gt;
(원문: &lt;a href=&quot;http://jonas.follesoe.no/YouCardRevisitedImplementingTheViewModelPattern.aspx&quot;&gt;&lt;/a&gt;&lt;a href=&quot;http://jonas.follesoe.no/YouCardRevisitedImplementingTheViewModelPattern.aspx&quot; target=&quot;_blank&quot; title=&quot;[http://jonas.follesoe.no/YouCardRevisitedImplementingTheViewModelPattern.aspx]로 이동합니다.&quot;&gt;http://jonas.follesoe.no/YouCardRevisitedImplementingTheViewModelPattern.aspx)&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
Model-View-Control 패턴(MVC 패턴)은 요즘 가장 잘 알려진 패턴일 것입니다. 마이크로소프트도 ASP.NET MVC 프레임워크로 시류에 편승하고 있으며, Ruby on Rails, Django(Python) 그리고 Spring MVC 프레임워크(Java) 같은 다른 유명한 프레임워크 들도 이 유명한 패턴들을 적용하고 있습니다. MVC 패턴은 Request-Response 기반의 웹환경에 잘 맞는 패턴입니다. Request 가 들어옴에 따라 Controller 가 어떤 행동이 이루어져야 하는지 결정을 하고 Model 에게 알려주고, 렌더링에 대한 책임을 View 엔진에게 넘겨줍니다. &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
반면 실버라이트는 비록 웹에서 실행되지만 전통적인 웹 애플리켜이션보다는 WPF(Window Presentation Foundation)와 같은 Rich Client 애플리케이션에 가깝습니다. 이런 이유로 애플리케이션을 설계 할 때 다른 방법이 요구 됩니다. 이 포스트에서는 Model-View-ViewModel(MVVM) 패턴,(혹은 Fowler가 부르듯이&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; &quot;&gt; &lt;a href=&quot;http://jonas.follesoe.no/ct.ashx?id=81bc3760-d23b-47e0-8e60-72208806c98d&amp;amp;url=http%3a%2f%2fmartinfowler.com%2feaaDev%2fPresentationModel.html&quot; style=&quot;font-weight: bold; color: rgb(231, 71, 150); text-decoration: none; &quot;&gt;the Presentation Model&lt;/a&gt;&lt;/span&gt;) 에 대해 이야기 하려고 합니다. 저의 YouCard 애플리케이션을 이 패턴으로 &lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px; &quot;&gt;리팩토링 &lt;/span&gt;함으로써 예시를 보여드리려고 합니다. &lt;a href=&quot;http://jonas.follesoe.no/ct.ashx?id=81bc3760-d23b-47e0-8e60-72208806c98d&amp;amp;url=http%3a%2f%2fmartinfowler.com%2feaaDev%2fPresentationModel.html&quot; target=&quot;_blank&quot; title=&quot;[http://jonas.follesoe.no/ct.ashx?id=81bc3760-d23b-47e0-8e60-72208806c98d&amp;amp;url=http%3a%2f%2fmartinfowler.com%2feaaDev%2fPresentationModel.html]로 이동합니다.&quot;&gt;&lt;/a&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px; &quot;&gt;&lt;a href=&quot;http://jonas.follesoe.no/ct.ashx?id=81bc3760-d23b-47e0-8e60-72208806c98d&amp;amp;url=http%3a%2f%2fblogs.msdn.com%2fjohngossman%2f&quot; style=&quot;font-weight: bold; color: rgb(231, 71, 150); text-decoration: none; &quot;&gt; Jon Gossman&lt;/a&gt;&lt;/span&gt; 과 &lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; &quot;&gt;&lt;a href=&quot;http://jonas.follesoe.no/ct.ashx?id=81bc3760-d23b-47e0-8e60-72208806c98d&amp;amp;url=http%3a%2f%2fblogs.msdn.com%2fdancre%2f&quot; style=&quot;font-weight: bold; color: rgb(231, 71, 150); text-decoration: none; &quot;&gt;Dan Crevier&lt;/a&gt;&lt;/span&gt; 가  &lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; &quot;&gt;&lt;a href=&quot;http://jonas.follesoe.no/ct.ashx?id=81bc3760-d23b-47e0-8e60-72208806c98d&amp;amp;url=http%3a%2f%2fblogs.msdn.com%2fdancre%2farchive%2f2006%2f07%2f23%2fdatamodel-view-viewmodel-pattern-1.aspx&quot; style=&quot;font-weight: bold; color: rgb(231, 71, 150); text-decoration: none; &quot;&gt;MVVM pattern in a WPF context&lt;/a&gt;&lt;/span&gt;&lt;a href=&quot;http://jonas.follesoe.no/ct.ashx?id=81bc3760-d23b-47e0-8e60-72208806c98d&amp;amp;url=http%3a%2f%2fblogs.msdn.com%2fdancre%2farchive%2f2006%2f07%2f23%2fdatamodel-view-viewmodel-pattern-1.aspx&quot;&gt; 에 관해 블로깅 하였고 &lt;/a&gt;, 최근 &lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; &quot;&gt;&lt;a href=&quot;http://jonas.follesoe.no/ct.ashx?id=81bc3760-d23b-47e0-8e60-72208806c98d&amp;amp;url=http%3a%2f%2fwww.nikhilk.net%2f&quot; style=&quot;font-weight: bold; color: rgb(231, 71, 150); text-decoration: none; &quot;&gt;Nikhil Kothari&lt;/a&gt;&lt;/span&gt;가 &quot;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; &quot;&gt;&lt;a href=&quot;http://jonas.follesoe.no/ct.ashx?id=81bc3760-d23b-47e0-8e60-72208806c98d&amp;amp;url=http%3a%2f%2fwww.nikhilk.net%2fSilverlight-ViewModel-Pattern.aspx&quot; style=&quot;font-weight: bold; color: rgb(231, 71, 150); text-decoration: none; &quot;&gt;ViewModel Pattern in Silverlight using Behaviors&lt;/a&gt;&lt;/span&gt;&quot; 란 제목의 훌륭한 포스팅을 올렸습니다. Martin Fowler 역시 &lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; &quot;&gt;&lt;a href=&quot;http://jonas.follesoe.no/ct.ashx?id=81bc3760-d23b-47e0-8e60-72208806c98d&amp;amp;url=http%3a%2f%2fmartinfowler.com%2feaaDev%2fPresentationModel.html&quot; style=&quot;font-weight: bold; color: rgb(231, 71, 150); text-decoration: none; &quot;&gt;the Presentation Model&lt;/a&gt;&lt;/span&gt; 이란 이름으로 이 패턴에 과한 글을 썼습니다. ViewModel이 실버라이트와 WPF에서 이렇게 관심을 끄는 이유는 바로 이 모델이 실버라이트와 WPF에서 지원하는 강력한 데이터 바인딩의 장점을 얻을 수 있게 해주게 때문입니다. MVVM 패턴의 중요개념중의 하나는 특정한 View (사용자 인터페이스)에 맞춘 Model을 만드는 것입니다. View-Model은 &lt;a href=&quot;http://jonas.follesoe.no/ct.ashx?id=81bc3760-d23b-47e0-8e60-72208806c98d&amp;amp;url=http%3a%2f%2fmartinfowler.com%2feaaDev%2fPresentationModel.html&quot;&gt;&lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px; &quot;&gt;IsDiscountingEnabled나 PageTitle 같은 특별한 필드를 포함하고 있을 겁니다. 그리고 이 필드들은 도메인 모델에 깔려있는 하나이상의 필드 폼에 기반한 것입니다. 이 IsDiscountingEnabled 필드는 로그인한 사용자가 discount(할인)에 관한 권한을 가지고 있는지 없는지에 기반할 것이지만 실제 View 는 이것에 대해 알지도 못하며 관심도 없을 것입니다. View는 오직 View-Model의&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(51, 51, 51); font-family: 굴림; font-size: 12px; line-height: 18px; &quot;&gt;&lt;a href=&quot;http://jonas.follesoe.no/ct.ashx?id=81bc3760-d23b-47e0-8e60-72208806c98d&amp;amp;url=http%3a%2f%2fmartinfowler.com%2feaaDev%2fPresentationModel.html&quot; style=&quot;color: rgb(51, 51, 51); text-decoration: none; &quot;&gt; &lt;/a&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px; &quot;&gt;IsDiscountingEnabled 필드에만 관심이 있고 도메인 모델(domain model)과는  동기화 되지 않습니다.   사용자가 Apply나 Save 버튼을 누르는 것 같이 특정 순간에 View-Model과 도메인 모델은 동기화가 발생하게 됩니다. 그리고 이 동안에  View와 View-Model은 아주 밀접하게 동기화(highly synchronized) 되게 됩니다. 어떻게 View와 View-Model의 동기화를 적용할 것인지는 사용하는 기술에 의존적이겠지만 Fowler는 Data Binding을 통해 이루어질 수 있다고 제안했습니다. &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div style=&quot;margin-left: 4em; &quot;&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&quot;아마도 Presentation 모델에서 가장 귀찮은 일은 Presentation Model과 View를 동기화하는 것일 것이다. 이것은 작성하기에는 간단한 코드지만 난 항상 이 반복적인 지루한 코딩을 최소화하고 싶어진다. 이상적으로 몇몇 종류의 프레임워크가 이런 일을 할 수 있지만 나는 닷넷의 데이터 바인딩과 같은 기술과 함께 나타나길 희망한다.&quot;  - Martin Fowler -&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
 Fowler가 말하고 있는 동기화 코드는 Name-TextBox에서 Person이라는 객체의 Name 프로퍼티로 Value를 전달하는코드를 말합니다. 저는 우리가 모두 이런 코드를 쓰고 있고 이것이 지루하고 반복적인 일이라는데 동의할 것이라고 확신합니다. 고맙게도 데이터 바인딩은 닷넷1.1과 윈도우 폼 때 부터 상당히 향상되어 왔고 WPF와 실버라이트에서는 데이터 바인딩이 동기화를 적용하기 위한 자연스런 선택이 되었습니다. &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(231, 71, 150); font-family: &#039;segoe ui&#039;; font-size: 13px; font-weight: bold; &quot;&gt;&lt;img height=&quot;482&quot; alt=&quot;YouCard Screenshot&quot; src=&quot;http://jonas.follesoe.no/content/binary/WindowsLiveWriter/YouCardRevisitedImplementingtheViewModel_1A2C/youcardscreenshot_3.jpg&quot; width=&quot;624&quot; border=&quot;0&quot; style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px; &quot;&gt;&lt;/span&gt;&lt;div&gt;
&lt;div&gt;
   &lt;/div&gt;
&lt;div&gt;
제가 이 패턴의 예제로 앞으로 사용할 애플리케이션은 저의&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px; &quot;&gt;&lt;a href=&quot;http://jonas.follesoe.no/ct.ashx?id=81bc3760-d23b-47e0-8e60-72208806c98d&amp;amp;url=http%3a%2f%2fjonas.follesoe.no%2fREMIX08YouCardDemo.aspx&quot; style=&quot;font-weight: bold; color: rgb(231, 71, 150); text-decoration: none; &quot;&gt; 오스트리아 Remix 때 보여준 YouCard application &lt;/a&gt;입니다.  리믹스에서 전 &#039;디자이너를 위한 실버라이트2&#039;에 대해 이야기 했었습니다. 이야기의 중심은 블랜드 2.5를 사용하여 애플리케이션을 디자인하고 만드는 것이었습니다. 애플리케이션의 핵심은 YouCardData 클래스와 데이터 바인딩 되어있는 YouCard  UserControl 입니다. 이 클래스는 Twitter 와 Flickr로 부터 데이터를 받아들이고 애플리케이션의 Model과 View-Model로써 행동하는 기능들을 포함하고 있습니다. 이것은 또한 Twitter터로 부터 Http Request를 이용해 다운받은 Twitter-Feed에 관한 Tweet이나 Name, Bio 같은 View의 특수한 필드도 포함하고 있습니다.  YouCardData 클래스는 일정간격으로 Twitter와 Flickr로 부터 데이터를 다운받는 타이머를 실행시킵니다.  단독책임(Single Responsibility) 같은 좋은 프로그래밍 원칙을 따라 저는 Twitter와 Flickr 기능들을 외부 클래스들로 분리 시킬려고 합니다. 이 클래스들은 Model이 될 것이고 Xml을 다운로드 받고 객체로 파싱하는 책임을 지게 될 것입니다. YouCardData는 ViewModel이 되고 Twitter 와 Flickr 서비스 이용을 위한 책임을 지고, View를 위한 로직과 UI로 부터 필요한 필드를 구성하게 될 것입니다. YourCardData의 본래 디자인이 데이터 바인딩을 위한 강력한 지원과 블래드2.5에서의 디자인 타임 지원을 강조하기 위해 구성되었기 때문에 리팩토링(refactoring) 작업을 시작하기 좋을 것 같습니다. 다음 그림은 현재 디자인(left)과 리팩토링 후의 원하는 디자인을 보여줍니다. &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;line-height: 18px; &quot;&gt;&lt;img height=&quot;329&quot; alt=&quot;youcardviewmodeldiagram&quot; src=&quot;http://jonas.follesoe.no/content/binary/WindowsLiveWriter/YouCardRevisitedImplementingtheViewModel_1A2C/youcardviewmodeldiagram_3.jpg&quot; width=&quot;648&quot; border=&quot;0&quot; style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px; &quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;첫번째 작업은 외부 서비스를 위한 인터페이스를 정의하는 것입니다. 저는 ITwitter나 IFlickr 인터페이스를 정의하는 대신 IMicroBlog 나 IPhotoService같은 보다 일반적인 이름을 사용하기로 결정했습니다. 만약 우리가 FriendFeed나 Picasa, Windows Live Photo Gallery 같은 서비스를 지원한다고 할 때 이 편이 보다 합리적이라고 생각합니다. 그리고 현재의 코드를 각각의 인터페이스의 구체적인 구현(implementation)으로 리팩토링 할 것입니다.  하나는 실제 온라인 서비스를 위한 것이고 하나는 더미 데이터(역자주: 실제 서비스로 부터 불러오는 데이터가 아닌 직접 코딩, 하드 코딩을 통한 데이터)를 이용한 가짜 구현이 될 것입니다.  앞서 말했듯이 이 애플리케이션은 리믹스의 Creative 트랙을 위해 만들어진 데모이고 블랜드에서의 좋은 디자인 경험을 위해 만들어졌습니다. 때문에 디자이너가 실제 코드가 어떻게 작동하는지 알 수 있게 하기 위해 더미 데이터를 생성해야만 했습니다. 만약 XAML을 사용한 디자이너-개발자 워크플로우의 이점을 활용하려고 한다면, 디자인 툴에서 코드가 어떻게 작동할지 생각해 봐야 합니다. 현재 구현 에서는, 만약 생성자에서 블랜드에서 실행되는 것인지 아닌지를 체크하고 있다면  if-문을 통해서 YouCardData 클래스 안에 더미 데이터를 제공 할 수 있을 것입니다. 만약 블랜드 안에서 실행되고 있다면 YouCardData 클래스는 Twitter와 Flickr 서비스의 가짜 구현부분을 이용할 것이고 브라우저에서 실행되고 있다면 YouCardData안에 timer가 실행되고 실제 구현부분을 통해 Twitter와 Flickr를 통해 실제 데이터를 다운 받기 시작할 것입니다. 이것과 관련된 YouCardData 생성자의 중요한 부분은 다음과 같습니다. &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;line-height: 18px; &quot;&gt; &lt;img height=&quot;234&quot; alt=&quot;Code sample 1&quot; src=&quot;http://jonas.follesoe.no/content/binary/WindowsLiveWriter/YouCardRevisitedImplementingtheViewModel_1A2C/mvvp-code1_3.gif&quot; width=&quot;412&quot; border=&quot;0&quot; style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px; &quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;이 코드에는 Dependency Injection(역자주: &lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(51, 51, 51); font-family: 굴림; font-size: 12px; line-height: 18px; &quot;&gt;&lt;a href=&quot;http://jonas.follesoe.no/YouCardRevisitedImplementingDependencyInjectionInSilverlight.aspx&quot;&gt;http://jonas.follesoe.no/YouCardRevisitedImplementingDependencyInjectionInSilverlight.aspx&lt;/a&gt; 참고)에 대한 선언이 들어가 있는데 이 것에 대한 내용은 다음 포스트에서 다루도록 하겠습니다. 여기서 현재 애플리케이션 Object 의 Type을 체크합니다. 실제로 실행중인 애플리케이션이 본래 애플리케이션의 객체를 반환할 때 블랜드는 블랜드 자신의 애플리케이션 오브젝트를 반환하게 됩니다. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
 리팩토링이 필요한 애플리케이션의 다음 조각은 메인 사용자 인터페이스(Main User Interface) 입니다. 내가 이해하는 바로는 Card에 관련된 모든 것들입니다. 현재 애플리케이션은 Twitter 사용자 이름을 넣을 TextBox와 Card를 새로 추가할 Add-Button 을 가지고 있습니다. Click-이벤트 핸들러 에서 새로운 YouCard 사용자 컨트롤의 Instance를 생성하고 StackPanel에 추가하게 됩니다. 그리고 YouCard 컨트롤에 의해 발생한 Close-Event를 후킹합니다. 만약 이벤트rk 발생하면 StackPanel로부터 컨트롤을 제거해주게 됩니다. 이 접근은 몇몇 안좋은 점이 있습니다. 첫번째 큰 문제는 View(Xaml페이지의 코드 비하인드)부분에 너무 많은 작동과 로직을 세워야 한다는 것입니다. 예를 들어 디자이너는 코드를 바꾸지 않고는 StackPanel을 FlowPanel로 바꿀 수 있는 방법이 없게됩니다. 그리고 또 많은 애플리케이션 로직이 특별한 UI-Control들과 UI-Event들과 연결되어 있기 때문에 단위 테스트(Unit Test)를 하기도 힘들어 집니다. &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
  이런 문제를 해결 하기 위해 YouCardData 의 Observable Collection(역자주: Collection의 Item의  변화를 Event나 바인딩으로 감시할 수 잇는 Collection을 말합니다.) 을 포함한 Users라고 불리는 새로운 View-Model을 만듭니다. 이 Collection은 Items Presenter Control(역자주: ItemsControl을 말합니다.) 와 바인딩 되어있고 ItemsControl은 YouCard 사용자 컨트롤을 Data Template으로 사용하게 됩니다. &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; &quot;&gt;&lt;img height=&quot;351&quot; alt=&quot;Code sample 2&quot; src=&quot;http://jonas.follesoe.no/content/binary/WindowsLiveWriter/YouCardRevisitedImplementingtheViewModel_1A2C/mvvp-code2_3.gif&quot; width=&quot;543&quot; border=&quot;0&quot; style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
 이제 두 UI가 View-Models와 바인딩 되는 경우를 통해 데이터를 보여주는 법을 다룰 수 있게 되었습니다. 그러나 이제 반 정도 왔을 뿐입니다. 우리는 사용자가 Card를 추가하고 삭제하는 것을 View-Models와 어떻게 상호작용(Interact) 할 것인지 알아야 합니다. &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; &quot;&gt;&lt;img height=&quot;168&quot; alt=&quot;YouCard interaction photo&quot; src=&quot;http://jonas.follesoe.no/content/binary/WindowsLiveWriter/YouCardRevisitedImplementingtheViewModel_1A2C/youcardinteraction_3.jpg&quot; width=&quot;605&quot; border=&quot;0&quot; style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px; &quot;&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;YouCard 애플리케이션에서는 View-Models에 영향을 주는 두개의 사용자 인터랙션이 있습니다. 새로운 사용자를 추가하는 TextBox와 Button, 그리고 List에서 카드를 제거하는 빨간 Button이 있습니다. 사용자는 Card를 추가하기 위해 사용자 이름을 입력하고 엔터를 칠 수도 있고 Add Button을 클릭할 수도 있습니다. Add Button은 사용자 이름이 올바른 값이 들어왔을 때만 활성화 되어야 합니다. 사용자가 Close 버튼을 클릭했을 때는 View-Model의 Collection으로 부터 item을 제거해 주어야 합니다. 이 경우 하나의 View에서 다른 View의 View-Model로의 의사소통이 섞여있습니다. YouCard 사용자 컨트롤은 메인 UI가 리스트로부터 자기자신을 삭제하도록 View-Model에게 알려주어야 합니다. &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;가장 확실한 방법은 Add 버튼에 클릭 이벤트 리스너(click event listner)를 추가해주고 View-Model에서 새로운 사용자를 추가하는 메소드를 불러주는 것입니다. 그리고 TextBox의 Text Changed 이벤트를 통해 입력된 값이 적당한 값인지 확인하고 텍스트에 기초한 TextBox가 되도록 활성화(Enable) 혹은 비활성화(Disable) 할 수 있을 것입니다. 그리고 빨간 Button에 Click Event를 받을 수도 있습니다.  메인 View는 이 이벤트를 받아서 View-Model로 부터 상응하는 카드를 제거할 수 있습니다. 이 솔루션의 문제는 역시 또 우리는 디자이너가 소유해야만 하는 View 부분에 로직과 작동들을 쌓아두어야 한다는 것입니다.  또한 이것 역시 유효 법칙(Validation Rules) 같은 Unit Test 등을 하거나 사용자의 추가나 삭제를 Local 머신의 독립적인 저장공간(isolated storage)에 남기는 것을 힘들게 합니다.&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;그래서 View와 View-Model 사이의 인터랙션 문제를 해결하기 위해 Command 패턴을 적용하려고 합니다. Command 패턴은 하나의 액션을 하나의 Command 객체로 캡슐화 시켜줍니다(encapsulate). Command 객체는 일반적으로 실행 메소드(excute method), 이름(name), 설명(description)과 Command가 실행가능한지에 대한 &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;정보를 포함하고 있습니다. 하나의 Command가 여러개의 UIElement에 붙을 수 있습니다. 보통 버튼이나 단축키나 메뉴 아이템등을 통해 OpenFile-Command를 실행시키고 싶을 것입니다. WPF에는 Commands를 위한 이런 것들이 내장되어 있지만 실버라이트에는 포함되어 있지 않습니다. &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;Nikhil 은  &lt;a href=&quot;http://jonas.follesoe.no/ct.ashx?id=81bc3760-d23b-47e0-8e60-72208806c98d&amp;amp;url=http%3a%2f%2fwww.nikhilk.net%2fEntry.aspx%3fid%3d194&quot; style=&quot;font-weight: bold; color: rgb(231, 71, 150); text-decoration: none; &quot;&gt;Silverlight behaviors&lt;/a&gt;를 통해 Command와 같은 기능을 어떻게 가능하게 할 건지에 대한 좋은 아이디어를 소개하고 있습니다. 이것은 AJAX 작동을 위한 ASP.NET 컨틀롤 확장에서 사용되었던 것과 동일한 컨셉입니다. 그의 첫번째 ViewModel 포스트에서 그는 Xaml로 부터 Command를 실행시키기 위해 다음과 같은 코드를 사용하고 있습니다. &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;line-height: 18px; &quot;&gt;&lt;img height=&quot;164&quot; alt=&quot;Code sample 3&quot; src=&quot;http://jonas.follesoe.no/content/binary/WindowsLiveWriter/YouCardRevisitedImplementingtheViewModel_1A2C/mvvp-code3_3.gif&quot; width=&quot;471&quot; border=&quot;0&quot; style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px; &quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;그는 부착 프로퍼티(Attached Proeprty) 를 사용하여  Button 에 Search TextBox의 TextProperty를 파라미터로 넘겨주고 View-Model의 Search 메소드를 불러주는 작동을 추가해 주었습니다.  다음 포스팅에서 Nikhil은 Dynamic Language 런타임을 사용하여 어떻게 좀더 간결한 코드를 얻을 수 있는지 보여주고 있습니다. (&lt;a href=&quot;http://jonas.follesoe.no/ct.ashx?id=81bc3760-d23b-47e0-8e60-72208806c98d&amp;amp;url=http%3a%2f%2fwww.nikhilk.net%2fViewModel-Pattern-DLR.aspx&quot; style=&quot;font-weight: bold; color: rgb(231, 71, 150); text-decoration: none; &quot;&gt;get the syntax even more compact using the Dynamic Language Runtime)&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;line-height: 18px; &quot;&gt;&lt;img height=&quot;55&quot; alt=&quot;Code sample 4&quot; src=&quot;http://jonas.follesoe.no/content/binary/WindowsLiveWriter/YouCardRevisitedImplementingtheViewModel_1A2C/mvvp-code4_3.gif&quot; width=&quot;576&quot; border=&quot;0&quot; style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px; &quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;이 접근법의 근사한 점은 연결된 Click 이벤트에 어떤 Dynamic Language 도 쓸 수 있다는 것입니다.  이것은 페이지안의 다른 엘리먼트들의 파라미터를 얻거나 메소드를 실행시키는 것도 가능합니다. 이것은 View를 View-Model과 연결시키는데 놀랄만한 융통성을 보여 줍니다. 하지만 이 접근법의 문제점은 실버라이트 애프리케이션의 사이즈에 영향을 주는 Dynamic Language Runtime에 의존한다는 것이고, 이것보다 더 중요한 단점은 블랜드 2.5의 디자인 타임(desind time) 깨뜨린다는 데에 있습니다. 그래서 다른 대안이 필요했습니다. &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt; 저는  &lt;a href=&quot;http://jonas.follesoe.no/ct.ashx?id=81bc3760-d23b-47e0-8e60-72208806c98d&amp;amp;url=http%3a%2f%2fwww.codeplex.com%2fSLExtensions&quot; style=&quot;font-weight: bold; color: rgb(231, 71, 150); text-decoration: none; &quot;&gt;&quot;Silverlight Extensions&quot; project on CodePlex &lt;/a&gt;에서 발견한 좀더 고전적인 Command 패턴을 사용하기로 했습니다. 프로젝트는 Controls와 Helper Class들 그리고 확장 메소드(extension methods)등을 포함하고 있습니다. 지금은 오직 커멘드 패턴 구현 부분에만 관심이 있기 때문에 이 클래스들을 YouCard 프로젝트로 옮기기로 합시다. 여기서 TextBox와 Button에 대한 Xaml 코드는 다음과 같습니다. &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;line-height: 18px; &quot;&gt;&lt;img height=&quot;199&quot; alt=&quot;Code sample 5&quot; src=&quot;http://jonas.follesoe.no/content/binary/WindowsLiveWriter/YouCardRevisitedImplementingtheViewModel_1A2C/mvvp-code5_3.gif&quot; width=&quot;518&quot; border=&quot;0&quot; style=&quot;border-top-width: 0px; border-left-width: 0px; border-bottom-width: 0px; border-right-width: 0px; &quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;텍스트 박스는 View-Model에서 Username 프로퍼티와 바인딩되어 있습니다. 두 컨트롤 모두 View-Model의 Username을 파라미터로 받아 AddCard Command를 부릅니다. &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;커멘드들은 다음과 같이 정의 됩니다. &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;line-height: 18px; &quot;&gt;&lt;img height=&quot;351&quot; alt=&quot;Code sample 6&quot; src=&quot;http://jonas.follesoe.no/content/binary/WindowsLiveWriter/YouCardRevisitedImplementingtheViewModel_1A2C/mvvp-code6_cba7796d-54ee-4a17-8b5c-c854ff1cdf07.gif&quot; width=&quot;432&quot; border=&quot;0&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;Static Command 클래스는 애플리케이션의 모든 Command들을 참조로 가지고 있습니다. 새로운 Command 객체가 생성될 때, Command 객체 안의 static Dictionary에 애플리케이션에 의해 만들어진 cashing된 Command 객체가 추가 됩니다.  Xaml에서 CommandService Attribute를 사용할 때 CommandService 클래스는 CommandSubscription 클래스를 사용하여 적당한 Command를 UI 객체와 연결시켜주게 됩니다. 사용자가 AddUser-버튼을 클릭하거나 TextBox에서 enter를 쳤을 경우 CommandSubscription 클래스는 올바른 UI-event를 받게 되고 올바른 Command 객체의 Excuted event를 발생 시키게 됩니다.  이 커맨드가 실행되었을때 특정 액션을 하고 싶은 클래스는 간단히 Command 객체의 Excuted event만 연결해주면 됩니다. 여기선 View-Model 클래스에 카드를 추가하거나 삭제하는 것을 조정해주고자 합니다:&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;line-height: 18px; &quot;&gt;&lt;img height=&quot;292&quot; alt=&quot;Code sample 7&quot; src=&quot;http://jonas.follesoe.no/content/binary/WindowsLiveWriter/YouCardRevisitedImplementingtheViewModel_1A2C/mvvp-code7_7c16f9af-91c8-4012-9313-ee46c56cb384.gif&quot; width=&quot;556&quot; border=&quot;0&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;또한 AddUser 버튼의 활성, 비활성(enabling/disabling) 부분도 언급하는게 좋을 것 같습니다. 이것은 버튼의 IsEnabled 프로퍼티를 View-Model의 IsAddEnabled 프로퍼티와 데이터 바인딩 해줌으로써 구현할 수 있습니다. IsAddEnabled 프로퍼티는 다음과 같습니다. &lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;span class=&quot;Apple-style-span&quot; style=&quot;line-height: 18px; &quot;&gt;&lt;img height=&quot;385&quot; alt=&quot;mvvp-code8&quot; src=&quot;http://jonas.follesoe.no/content/binary/WindowsLiveWriter/YouCardRevisitedImplementingtheViewModel_1A2C/mvvp-code8_cb7a567d-0c8d-41ea-9875-3366de044f2f.gif&quot; width=&quot;451&quot; border=&quot;0&quot;&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
TextBox는 IsAddEnabled 프로퍼티의 PropertyChanged 이벤트를 발생시킬 UserName 프로퍼티와 바인딩 되어있습니다. 프로퍼티를 얻는 곳(getter,역자주:프로퍼티의 get 부분)에 버튼이 활성화 되어야 하는지 아닌지 결정할 Validation rule 을 적용해주어야 합니다. &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
희망차게도 이 글은 어떻게 MVVM 패턴이 사용자 인터페이스와 분리하여 코드를 짤 수 있게 도와주는지에 대한 좋은 예를 보여줍니다.  WPF와 실버라이트에서 지원하는 강력한 데이터 바인딩은 하드 코딩을 통해 View와 View-Model를 동기화 하는 것에 대한 걱정을 덜어줌으로써, 이 패턴을 특별히 흥미롭게 만들어줍니다. 커맨드들을 사용함으로써 구체적인 UI-Element의 이벤트로부터 애플리케이션의 액션들을 분리할 수 있습니다. 이것은 디자이너가 애플리케이션 네의 다양한 액션을 일으키는 UI 객체들을 자유롭게 선택할 수 있게 해줍니다. 무엇보다도 가장 좋은 점은 블랜드에서 지원하는 디자인 타임이 깨지지 않는 상태에서 이 모든 것이 가능하다는 것입니다. 다음 포스트에서는 Dependency Injection을 소개하면서 YouCard 애플리케이션을 좀더 테스트가 쉽게 향상 시킬 것입니다. &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; &quot;&gt;&lt;iframe marginwidth=&quot;0&quot; marginheight=&quot;0&quot; src=&quot;http://cid-1a08c11c407c0d8e.skydrive.live.com/embedrowdetail.aspx/Code%20samples/YouCard%20Silverlight%202%20RTW.zip&quot; frameborder=&quot;0&quot; scrolling=&quot;no&quot; style=&quot;border-right-color: rgb(221, 229, 233); border-right-width: 1px; border-right-style: solid; padding-right: 0px; border-top-color: rgb(221, 229, 233); border-top-width: 1px; border-top-style: solid; padding-left: 0px; padding-bottom: 0px; margin-top: 3px; margin-right: 3px; margin-bottom: 3px; margin-left: 3px; border-left-color: rgb(221, 229, 233); border-left-width: 1px; border-left-style: solid; width: 240px; padding-top: 0px; border-bottom-color: rgb(221, 229, 233); border-bottom-width: 1px; border-bottom-style: solid; height: 66px; background-color: rgb(255, 255, 255); &quot;&gt;&lt;/iframe&gt;&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
&lt;span class=&quot;Apple-style-span&quot; style=&quot;color: rgb(0, 0, 0); font-family: &#039;segoe ui&#039;; font-size: 13px; line-height: 19px;&quot;&gt;&lt;br /&gt;
&lt;/span&gt;&lt;/div&gt;
&lt;div&gt;
  ----------------------------------------------------------------------------------------------------------&lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
역자 후기: 흠냐... 생각보다 포스트가 길어 힘들군요..^^;; 100% 모든 프로젝트에 적용될 수 있는 모델은 아니지만 꽤 이상적인 모델중에 하나인 것같습니다. 무엇보다도 Command 패턴은 복잡하고 불분명한 EventHandler로 부터 코드를 깔끔하게 지킬 수 있는 모델이라는 점에서 참 마음에 듭니다. MVVM 패턴도 친구 Gilber군이 이야기 한데로 Model을 다른 프로젝트로 분리시킬 경우 UI에 대한 독립성이 상당히 높아져서 멀티 플랫폼 환경이나 동일 서비스위의 다양한 애플리케이션 모델을 구축하는데 상당히 유리해 보입니다. 마지막으로 Interface와 더미데이터를 통한 디자이너를 배려한 구현은 개발자와 디자이너의 협업 관계에서 상당히 괜찮은 모델로 보입니다. &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
  그럼 모두들 도움 많이 되셨길.. 그리고 좋은 포스트를 남겨준 원작자에게 감사를... Thank you for your great post.!! &lt;/div&gt;
&lt;div&gt;
&lt;br /&gt;
&lt;/div&gt;
&lt;div&gt;
   &lt;/div&gt;
&lt;/div&gt;</description>
			<category>Command Pattern</category>
			<category>Model-View-ViewModel</category>
			<category>mvvm pattern</category>
			<category>silverlight</category>
			<category>ViewModel</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/36</guid>
			<comments>http://error1001.com/36#entry36comment</comments>
			<pubDate>Wed, 12 Nov 2008 21:22:15 +0900</pubDate>
		</item>
		<item>
			<title>Wheel 지원 리스트 박스</title>
			<link>http://error1001.com/35</link>
			<description>&lt;br /&gt;
간단하게 Wheel이 지원되는 리스트 박스 만드는 방법을 알려드리도록 하죠.^^&lt;br /&gt;
&lt;br /&gt;먼저 Wheel 을 지원 받을 수 있도록 아래 포스트에 가서 Wheel을 지원할 수 있게 하는 class를 다운 받습니다. &lt;br /&gt;
&lt;A href=&quot;http://cafe.naver.com/mssilverlight/693&quot;&gt;http://cafe.naver.com/mssilverlight/693&lt;/A&gt;&lt;br /&gt;
&lt;br /&gt;아니면 새로 짜도 상관은 없습니다. &lt;br /&gt;
&lt;br /&gt;그리고 아래와 같은 클래스를 만듭니다. &lt;br /&gt;
&lt;br /&gt;&lt;PRE class=c# name=&quot;code&quot;&gt;using System;
using System.Windows;
using System.Windows.Controls;
using HugeFlow.Interface;

namespace HugeFlow.Controls
{
    [TemplatePart(Name = WheelListBox.ElementScrollViewerName, Type = typeof(ScrollViewer))]
    public class WheelListBox : ListBox
    {
        #region ScrollOffset
        /// &lt;SUMMARY&gt; 
        /// Gets or sets the ScrollOffset possible Value of the double object.
        /// &lt;/SUMMARY&gt; 
        public double ScrollOffset
        {
            get { return (double)GetValue(ScrollOffsetProperty); }
            set { SetValue(ScrollOffsetProperty, value); }
        }

        /// &lt;SUMMARY&gt; 
        /// Identifies the ScrollOffset dependency property.
        /// &lt;/SUMMARY&gt; 
        public static readonly DependencyProperty ScrollOffsetProperty =
                    DependencyProperty.Register(
                          &quot;ScrollOffset&quot;,
                          typeof(double),
                          typeof(WheelListBox),
                          null);
        #endregion ScrollOffset

        public WheelListBox() : base()
        {
            DefaultStyleKey = typeof(ListBox);
            ScrollOffset = 20;
            (new MouseWheelHelper(this)).WheelScroll += new EventHandler&amp;lt;MouseWheelEventArgs&amp;gt;&lt;MOUSEWHEELEVENTARGS&gt;(Wheel_Moved);
        }

        void Wheel_Moved(object sender, MouseWheelEventArgs e)
        {
            e.Handled = true;

            double tempOffset = ElementScrollViewer.VerticalOffset - ScrollOffset * e.Delta;

            if (tempOffset &amp;lt; 0)
                tempOffset = 0;
            else if (tempOffset &amp;gt; ElementScrollViewer.ScrollableHeight)
                tempOffset = ElementScrollViewer.ScrollableHeight;

            ElementScrollViewer.ScrollToVerticalOffset(tempOffset);
        }

        /// &lt;SUMMARY&gt; 
        /// Identifies the optional ScrollViewer element from the template.
        /// &lt;/SUMMARY&gt;
        internal ScrollViewer ElementScrollViewer { get; set; }
        private const string ElementScrollViewerName = &quot;ScrollViewer&quot;;

        public override void OnApplyTemplate()
        {
            base.OnApplyTemplate();
            ElementScrollViewer = GetTemplateChild(ElementScrollViewerName) as ScrollViewer;
        }
    }
}
&lt;/PRE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;어째 간단하게 보이실런지..^^ 쉽게 갔다 쓰는 용으로 프로젝트도 하나 만들어 봤습니다. 첨부합니다. 그럼 유용하게 사용하시길.^^&lt;/P&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://error1001.tistory.com/attachment/4911345920c769O.zip&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/zip.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; WheelListBoxTest.zip&lt;/a&gt;&lt;/div&gt; - smile -</description>
			<category>Tip</category>
			<category>ListBox</category>
			<category>silverlight</category>
			<category>wheelListBox</category>
			<category>Wheel지원</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/35</guid>
			<comments>http://error1001.com/35#entry35comment</comments>
			<pubDate>Wed, 05 Nov 2008 14:52:13 +0900</pubDate>
		</item>
		<item>
			<title>shiverlight.net GuestInk Update!!!</title>
			<link>http://error1001.com/34</link>
			<description>&lt;br /&gt;
Gilbert 가 처음에 만들었던 GuestInk를 PeterC 와 협조해서 Update를 했습니다. &lt;br /&gt;
디자인을 어느정도 수정을 했고요. 퍼가기가 가능하도록 해놓았습니다. &lt;br /&gt;
향후에는 me2day 에 직접 글을 작성할 수 있게 하려고 합니다. &lt;br /&gt;
&lt;br /&gt;
&lt;object data=&quot;data:application/x-silverlight,&quot; type=&quot;application/x-silverlight-2&quot; width=&quot;196&quot; height=&quot;216&quot;&gt;&lt;param name=&quot;source&quot; value=&quot;http://shiverlight.net/Demos_v2/GuestInk/SimpleGuestInk.xap&quot;/&gt;&lt;param name=&quot;onerror&quot; value=&quot;onSilverlightError&quot;/&gt;&lt;param name=&quot;background&quot; value=&quot;white&quot;/&gt;&lt;param name=&quot;EnableHtmlAccess&quot; value=&quot;true&quot;/&gt;&lt;param name=&quot;initParams&quot; value=&quot;srl=800&quot;/&gt;&lt;a href=&quot;http://go.microsoft.com/fwlink/?LinkID=108182&quot; style=&quot;text-decoration: none;&quot;&gt;     &lt;img src=&quot;http://go.microsoft.com/fwlink/?LinkId=108181&quot; alt=&quot;Get Microsoft Silverlight&quot; style=&quot;border-style: none&quot;&gt;&lt;/a&gt;&lt;/object&gt;&lt;br /&gt;
&lt;br /&gt;
이제 그린 그림을 마음대로 퍼가세요.^^&lt;br /&gt;
&lt;br /&gt;
                                                                                                                - smile -&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;</description>
			<author>Boxmile</author>
			<guid>http://error1001.com/34</guid>
			<comments>http://error1001.com/34#entry34comment</comments>
			<pubDate>Tue, 04 Nov 2008 17:26:10 +0900</pubDate>
		</item>
		<item>
			<title>VisualStudio 에서의 미리 보기 에러</title>
			<link>http://error1001.com/32</link>
			<description>&lt;br /&gt;
비쥬얼 스튜디오를 쓰다보면 가끔 이런 에러가 뜰 때가 있습니다. &lt;br /&gt;
&lt;br /&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;&lt;FONT color=#000000&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #ffffff&quot;&gt;&lt;FONT style=&quot;BACKGROUND-COLOR: #dae8f6&quot; color=#587693&gt;Error&amp;nbsp;1&amp;nbsp;요소 UserControl1에 알 수 없는 Margin 특성이 있습니다. [Line: 716 Position: 37]&amp;nbsp;D:\DevTest\StyleTest\StyleTest\Page.xaml&amp;nbsp;6&amp;nbsp;25&amp;nbsp;StyleTest&lt;/FONT&gt;&lt;br /&gt;
&lt;/FONT&gt;&lt;/FONT&gt;&lt;/DIV&gt;&lt;br /&gt;
그런데 실행은 잘 되죠.&lt;br /&gt;
&lt;br /&gt;테스트 결과.&lt;br /&gt;
&lt;br /&gt;App.Xaml에서 스타일이&amp;nbsp;정의가 되어 있고, 그 스타일을 사용한 객체를 A라고 하고,&lt;br /&gt;
A를 포함한 어떤 유저컨트롤을 B라고 가정합니다.&lt;br /&gt;
&lt;br /&gt;이때 유저컨트롤 B를&amp;nbsp;가지고 있는 객체 C를&lt;br /&gt;
비주얼 스튜디오에서 미리보기 하는 순간 위와 같은 에러를 반환합니다. &lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;br /&gt;Preview상의 버그이고 프로그램에는 전혀 지장을 안 주는 것 같으니 무시합시다. --;;&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - smile -&lt;br /&gt;
&lt;br /&gt;예제를 첨부하죠.&lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://error1001.tistory.com/attachment/49055893868b0DH.zip&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/zip.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; StyleTest.zip&lt;/a&gt;&lt;/div&gt;</description>
			<category>Don&#039;t Panic</category>
			<category>Preview</category>
			<category>silverlight</category>
			<category>style</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/32</guid>
			<comments>http://error1001.com/32#entry32comment</comments>
			<pubDate>Mon, 27 Oct 2008 14:55:30 +0900</pubDate>
		</item>
		<item>
			<title>RepeatedButton 의 Style이름 필수 요소</title>
			<link>http://error1001.com/31</link>
			<description>&lt;br /&gt;
바로 메인 루트의 이름을 &quot;Root&quot; 라고 꼭 이름을 넣어주어야 Repeated 버튼을 제대로 이용할 수 있습니다. &lt;br /&gt;
&lt;br /&gt;이름을 주지 않을 경우 Repeated가 더이상 Repeated가 되지 않더군요.^^&lt;br /&gt;
&lt;br /&gt;그럼 모두들 주의!!!&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - smile -</description>
			<category>RepeatedButton</category>
			<category>Sivleright</category>
			<category>style</category>
			<category>리피티드버튼</category>
			<category>스타일</category>
			<category>실버라이트</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/31</guid>
			<comments>http://error1001.com/31#entry31comment</comments>
			<pubDate>Fri, 10 Oct 2008 10:11:17 +0900</pubDate>
		</item>
		<item>
			<title>Silverlight Unit Test Template</title>
			<link>http://error1001.com/30</link>
			<description>&lt;br /&gt;
&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://error1001.tistory.com/attachment/48e9a43d5f8796N.dll&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/dll.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; Microsoft.Silverlight.Testing.dll&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://error1001.tistory.com/attachment/48e9a43db656c6M.dll&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/dll.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; Microsoft.Silverlight.Testing.Framework.dll&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://error1001.tistory.com/attachment/48e9a43e0bd606K.dll&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/dll.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; Microsoft.VisualStudio.QualityTools.UnitTesting.Silverlight.dll&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;
dll 은 여기서 다운 받습니다. &lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://error1001.tistory.com/attachment/48e9a1b226be07Q.zip&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/zip.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; SilverlightTestClass.zip&lt;/a&gt;&lt;/div&gt;이건 클래스 템플릿,&amp;nbsp; \Documents\Visual Studio 2008\Templates\ItemTemplates\Visual C#\Silverlight&amp;nbsp; &lt;br /&gt;
&amp;nbsp;요 위치에 붙여 넣습니다. &lt;br /&gt;
&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://error1001.tistory.com/attachment/48e9a1e39a2937U.zip&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/zip.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; SilverlightUnitTestProjectTemplate.zip&lt;/a&gt;&lt;/div&gt;이건 프로젝트 템플릿, \Documents\Visual Studio 2008\Templates\ProjectTemplates\Visual C#\Silverlight&lt;br /&gt;
&amp;nbsp;요 위치에 붙여 넣습니다.&amp;nbsp; 프로젝트가 위에 dll 위치를 못찾을 수 있으므로 dll을 제대로 추가해준 뒤 &lt;br /&gt;
다시 export하여 zip 화일을 같은 경로에 붙여 넣어줍시다. &lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
자 이제 유닛테스트로 개발 해봅시다. &lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - smile -</description>
			<category>Tip</category>
			<category>silverlight</category>
			<category>template</category>
			<category>unittest</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/30</guid>
			<comments>http://error1001.com/30#entry30comment</comments>
			<pubDate>Mon, 06 Oct 2008 14:29:30 +0900</pubDate>
		</item>
		<item>
			<title>팁 : 실버라이트 2 RC0 포팅 시 Style에서 발생하는 오류</title>
			<link>http://error1001.com/29</link>
			<description>&lt;SPAN style=&quot;FONT-SIZE: 14pt&quot;&gt;
&lt;TABLE style=&quot;DISPLAY: inline; BORDER-COLLAPSE: collapse&quot;&gt;
&lt;TBODY&gt;
&lt;TR&gt;
&lt;TD&gt;&lt;STRONG&gt;&lt;IMG height=331 alt=&quot;&quot; src=&quot;http://cfs8.tistory.com/image/34/tistory/2008/09/29/21/56/48e0d06b18871&quot; width=500&gt;&lt;/STRONG&gt;&lt;/TD&gt;&lt;/TR&gt;&lt;/TBODY&gt;&lt;/TABLE&gt;&lt;br /&gt;
&lt;A title=&quot;[http://www.flickr.com/photos/andymccarthyuk/492498233/]로 이동합니다.&quot; href=&quot;http://www.flickr.com/photos/andymccarthyuk/492498233/&quot; target=_blank&gt;&lt;SPAN style=&quot;FONT-SIZE: 10pt&quot;&gt;&lt;FONT color=#ff9600&gt;사진출처 : flickr.com&lt;/FONT&gt;&lt;/SPAN&gt;&lt;/A&gt;&lt;STRONG&gt;&lt;br /&gt;
&lt;br /&gt;포팅작업 돌입!&lt;/STRONG&gt;&lt;/SPAN&gt;&lt;br /&gt;
&lt;br /&gt;얼마전 실버라이트 RC0가 공개되어, &lt;br /&gt;
휴즈플로우의 은대리는 이전에 만들어 둔 프로젝트를 포팅하는 작업에 들어갔다.&lt;br /&gt;
컴파일과 디버깅을 거듭한 끝에 드디어 컴파일 에러 제로!&lt;br /&gt;
&lt;br /&gt;근데 실행을 시켜 본 순간, 이게 무슨 문제인가?&lt;br /&gt;
App.xaml.cs의 &lt;STRONG&gt;InitializeComponent()에서 런타임 에러&lt;/STRONG&gt;가 발생한다.&lt;br /&gt;
&lt;br /&gt;App.xaml을 열자 잘못된 부분에 밑줄이 그어지면서&amp;nbsp;VS가&amp;nbsp;이곳저곳 오류를 보고해준다.&lt;br /&gt;
&lt;br /&gt;&#039;아... &lt;STRONG&gt;ContentTemplate&lt;/STRONG&gt;가 Control 부모를 버리고 &lt;STRONG&gt;FrameworkElement에게 입양&lt;/STRONG&gt; 되었었지...&#039;&lt;br /&gt;
그 결과 많은 프로퍼티들이 사라졌으므로 오류가 발생하는 것이다.&lt;br /&gt;
은대리는 FontStyle 등 밑줄이 그어진 많은 프로퍼티를 XAML 코드에서 삭제해 나갔다.&lt;br /&gt;
그리고 &lt;STRONG&gt;VisualTransition&lt;/STRONG&gt;의 Duration도&amp;nbsp;잊지않고 &lt;STRONG&gt;GeneratedDuration&lt;/STRONG&gt;으로 바꿔주었다.&lt;br /&gt;
&lt;br /&gt;오류가 눈앞에서 모두 사라졌다.&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
&lt;STRONG&gt;&lt;SPAN style=&quot;FONT-SIZE: 14pt&quot;&gt;마지막 고비&lt;/SPAN&gt;&lt;/STRONG&gt;&lt;br /&gt;
&lt;br /&gt;이번엔 프로그램이 뜰까? 은대리는 다시 실행해본다...&lt;br /&gt;
다시 또 오류다.&lt;br /&gt;
&lt;br /&gt;마지막 문제는 Visual Studio가 힌트를 주지 않는다.&lt;br /&gt;
&lt;STRONG&gt;은대리의 삽질을 막고자&lt;/STRONG&gt;하면 아래의 팁을 알려주라!&lt;br /&gt;
&lt;br /&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #9fd331 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #9fd331 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #9fd331 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #9fd331 1px solid; BACKGROUND-COLOR: #e7fdb5&quot;&gt;App.xaml에서 &lt;br /&gt;
&lt;br /&gt;1. &lt;STRONG&gt;vsm:Style&lt;/STRONG&gt; 엔티티를 &lt;STRONG&gt;Style&lt;/STRONG&gt;로 Replace 한다.&amp;nbsp;&lt;br /&gt;
2. &lt;STRONG&gt;vsm:Setter&lt;/STRONG&gt; 엔티티를 &lt;STRONG&gt;Setter&lt;/STRONG&gt;로 Replace 한다.&lt;br /&gt;
&lt;/DIV&gt;&lt;br /&gt;
자, 이제 프로그램이 잘 뜬다.

 &lt;div class=&quot;entry-ccl&quot; style=&quot;clear: both; text-align: right; margin-bottom: 10px&quot;&gt;
	&lt;img id=&quot;ccl-icon-29-0&quot; class=&quot;entry-ccl-by&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black01.png&quot; alt=&quot;저작자 표시&quot;/&gt;
	&lt;img id=&quot;ccl-icon-29-1&quot; class=&quot;entry-ccl-nc&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black02.png&quot; alt=&quot;비영리&quot;/&gt;
	&lt;img id=&quot;ccl-icon-29-2&quot; class=&quot;entry-ccl-sa&quot; src=&quot;http://cfs.tistory.com/static/admin/editor/ccl_black04.png&quot; alt=&quot;동일 조건 변경 허락&quot;/&gt;
	&lt;!--
	&lt;rdf:RDF xmlns=&quot;http://web.resource.org/cc/&quot; xmlns:dc=&quot;http://purl.org/dc/elements/1.1/&quot; xmlns:rdf=&quot;http://www.w3.org/1999/02/22-rdf-syntax-ns#&quot;&gt;
		&lt;Work rdf:about=&quot;&quot;&gt;
			&lt;license rdf:resource=&quot;http://creativecommons.org/licenses/by-nc-sa/2.0/kr/&quot; /&gt;
		&lt;/Work&gt;
		&lt;License rdf:about=&quot;http://creativecommons.org/licenses/by-nc-sa/&quot;&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Reproduction&quot;/&gt;
			&lt;permits rdf:resource=&quot;http://web.resource.org/cc/Distribution&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Notice&quot;/&gt;
			&lt;requires rdf:resource=&quot;http://web.resource.org/cc/Attribution&quot;/&gt;
			&lt;prohibits rdf:resource=&quot;http://web.resource.org/cc/CommercialUse&quot;/&gt;
		&lt;/License&gt;
	&lt;/rdf:RDF&gt;
	--&gt;
&lt;/div&gt;
</description>
			<category>Tip</category>
			<category>RC0</category>
			<category>silverlight</category>
			<category>vsm</category>
			<category>실버라이트</category>
			<category>포팅</category>
			<category>휴즈플로우</category>
			<author>길버트</author>
			<guid>http://error1001.com/29</guid>
			<comments>http://error1001.com/29#entry29comment</comments>
			<pubDate>Mon, 29 Sep 2008 21:50:57 +0900</pubDate>
		</item>
		<item>
			<title>Transform과 StoryBoard Animation</title>
			<link>http://error1001.com/28</link>
			<description>&lt;br /&gt;
예전에는 StoryBoard의 Animation 에서 Transform의 값을 변화 시키면 그 값이 직접적으로 바뀌었었죠.&lt;br /&gt;
&lt;br /&gt;하지만 rc에서는 이상하게도 Transform 값이 변하지 않더군요. 다음과 같은 간단한 데모로 확인할 수 있습니다. &lt;br /&gt;
&lt;br /&gt;Page.xaml&lt;br /&gt;

&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #dbe8fb 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #dbe8fb 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #dbe8fb 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #dbe8fb 1px solid; BACKGROUND-COLOR: #dbe8fb&quot;&gt;&amp;lt;UserControl x:Class=&quot;StoryBoardTest.Page&quot;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns=&quot;&lt;A href=&quot;http://schemas.microsoft.com/winfx/2006/xaml/presentation&quot;&gt;http://schemas.microsoft.com/winfx/2006/xaml/presentation&lt;/A&gt;&quot; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; xmlns:x=&quot;&lt;A href=&quot;http://schemas.microsoft.com/winfx/2006/xaml&quot;&gt;http://schemas.microsoft.com/winfx/2006/xaml&lt;/A&gt;&quot; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; Width=&quot;400&quot; Height=&quot;300&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;lt;UserControl.Resources&amp;gt;&lt;br /&gt;

&lt;DIV&gt;&amp;nbsp;&amp;nbsp;&amp;lt;Storyboard x:Name=&quot;Storyboard1&quot;&amp;gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV style=&quot;MARGIN-LEFT: 4em&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DoubleAnimationUsingKeyFrames BeginTime=&quot;00:00:00&quot; Storyboard.TargetName=&quot;rectangle&quot; Storyboard.TargetProperty=&quot;(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.X)&quot;&amp;gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV style=&quot;MARGIN-LEFT: 4em&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;SplineDoubleKeyFrame KeyTime=&quot;00:00:02&quot; Value=&quot;177&quot;/&amp;gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV style=&quot;MARGIN-LEFT: 4em&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/DoubleAnimationUsingKeyFrames&amp;gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV style=&quot;MARGIN-LEFT: 4em&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;DoubleAnimationUsingKeyFrames BeginTime=&quot;00:00:00&quot; Storyboard.TargetName=&quot;rectangle&quot; Storyboard.TargetProperty=&quot;(UIElement.RenderTransform).(TransformGroup.Children)[3].(TranslateTransform.Y)&quot;&amp;gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV style=&quot;MARGIN-LEFT: 4em&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;SplineDoubleKeyFrame x:Name=&quot;keyValue&quot; KeyTime=&quot;00:00:02&quot; Value=&quot;105&quot;/&amp;gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV style=&quot;MARGIN-LEFT: 4em&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/DoubleAnimationUsingKeyFrames&amp;gt;&lt;br /&gt;
&lt;/DIV&gt;
&lt;DIV&gt;&amp;nbsp;&amp;nbsp;&amp;lt;/Storyboard&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;lt;/UserControl.Resources&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid x:Name=&quot;LayoutRoot&quot; Background=&quot;White&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;TextBlock x:Name=&quot;tbValue&quot; Text=&quot;value&quot; /&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;Rectangle Height=&quot;63&quot; HorizontalAlignment=&quot;Left&quot; Margin=&quot;68,57,0,0&quot; VerticalAlignment=&quot;Top&quot; Width=&quot;98&quot; Fill=&quot;#FFC13A3A&quot; Stroke=&quot;#FF000000&quot; RenderTransformOrigin=&quot;0.5,0.5&quot; x:Name=&quot;rectangle&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;lt;Rectangle.RenderTransform&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;TransformGroup&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;ScaleTransform/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;SkewTransform/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;RotateTransform/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;TranslateTransform x:Name=&quot;tfValue&quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;lt;/TransformGroup&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;nbsp;&amp;lt;/Rectangle.RenderTransform&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;nbsp;&amp;lt;/Rectangle&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;lt;/UserControl&amp;gt;&lt;/DIV&gt;&lt;/DIV&gt;&lt;br /&gt;
간략히 요약하자면. 사각형 하나를 그리고 블랜드에서 특정 위치로 이동하는 animation을 만들었습니다. &lt;br /&gt;
그리고 TranslateTransform에 이름을 붙였죠. &lt;br /&gt;
&lt;br /&gt;예전이라면 animation 중간에 &quot;tfValue&quot;의 값을 얻어와서 animation의 경과 상태를 알 수 있었죠. &lt;br /&gt;
&lt;br /&gt;코드는 다음과 같습니다. &lt;br /&gt;
&lt;br /&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #e7fdb5 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #e7fdb5 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #e7fdb5 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #e7fdb5 1px solid; BACKGROUND-COLOR: #e7fdb5&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; public partial class Page : UserControl&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; DispatcherTimer timer = new DispatcherTimer();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; public Page()&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; InitializeComponent();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; timer.Tick += new EventHandler(timer_Tick);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; timer.Start();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Storyboard1.Begin();&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/DIV&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #e7fdb5 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #e7fdb5 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #e7fdb5 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #e7fdb5 1px solid; BACKGROUND-COLOR: #e7fdb5&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; void timer_Tick(object sender, EventArgs e)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;FONT color=#e31600&gt;tbValue.Text = string.Format(&quot;({0},{1})&quot;, tfValue.X, tfValue.Y);&lt;/FONT&gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;/DIV&gt;&lt;br /&gt;
간단하죠. timer를 계속 돌리면서 value값을 얻어 오는 것이죠. &lt;br /&gt;
&lt;br /&gt;결과는 어떨까죠? &lt;br /&gt;
&lt;br /&gt;결과는 예상 밖입니다. 값이 전혀 변하지 않고 &quot;(0,0)&quot;만 찍어내고 있는 것을 볼 수 있습니다. &lt;br /&gt;
&lt;br /&gt;빨간 글자 부분을 다음과 같이 바꾸어 봤습니다. &lt;br /&gt;
&lt;br /&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #9fd331 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #9fd331 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #9fd331 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #9fd331 1px solid; BACKGROUND-COLOR: #e7fdb5&quot;&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tfValue = ((rectangle.RenderTransform as TransformGroup).Children[3] as TranslateTransform);&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; if (tfValue != null)&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; tbValue.Text = string.Format(&quot;({0},{1})&quot;, tfValue.X, tfValue.Y);&lt;br /&gt;
&lt;/DIV&gt;&lt;br /&gt;
이렇게 했더니 정말 값이 잘 들어옵니다. &lt;br /&gt;
&lt;br /&gt;그래서 한번 다음을 체크해보았습니다. &lt;br /&gt;
&lt;br /&gt;
&lt;DIV class=txc-textbox style=&quot;BORDER-RIGHT: #9fd331 1px solid; PADDING-RIGHT: 10px; BORDER-TOP: #9fd331 1px solid; PADDING-LEFT: 10px; PADDING-BOTTOM: 10px; BORDER-LEFT: #9fd331 1px solid; PADDING-TOP: 10px; BORDER-BOTTOM: #9fd331 1px solid; BACKGROUND-COLOR: #e7fdb5&quot;&gt;(rectangle.RenderTransform as TransformGroup).Children[3].Equals(tfValue)&lt;/DIV&gt;&lt;br /&gt;
다음과 같은 코드를 디버그를 걸어놓고 Watch 창에서 감시해 보면 다음과 같은 현상을 볼 수 있습니다. &lt;br /&gt;
&lt;br /&gt;먼저 timer 가 시작될 때 까지는 &quot;true&quot;를 반환 합니다. &lt;br /&gt;
&lt;br /&gt;그 후에 Storyboard가 Begin 되는 순간 값은 &quot;false&quot;로 바뀝니다. &lt;br /&gt;
&lt;br /&gt;생각해보면 Storyboard가 Begin 되는 순간 RenderTransform을 다시 새로 만든다는 것으로 생각해볼 수 있습니다. &lt;br /&gt;
&lt;br /&gt;그래서 rectangle부터 찾아온 TranslateTransform 값은 업데이트가 되지만 &lt;br /&gt;
&lt;br /&gt;그전에 찾아온 TranslateTransform값은 값이 업데이트 되지 않는 것입니다 .&lt;br /&gt;
&lt;br /&gt;이부분은 명백한 버그로 보이는데 하루 빨리 고쳐지길 바라며 이런 문제로 기존에 작성한 애니메이션이 잘 작동하지 &lt;br /&gt;
&lt;br /&gt;않는 분은 부디 더이상 삽질 하지 않으시길 바랍니다. 그럼..&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; - smile -&lt;br /&gt;</description>
			<author>Boxmile</author>
			<guid>http://error1001.com/28</guid>
			<comments>http://error1001.com/28#entry28comment</comments>
			<pubDate>Sat, 27 Sep 2008 18:42:20 +0900</pubDate>
		</item>
		<item>
			<title>VisualState 의 동적 제어.</title>
			<link>http://error1001.com/27</link>
			<description>&lt;br /&gt;
일단 VisualStateManager class를 통해서 해당 스테이트의 Storyboard를 가지고 오는 방법입니다. &lt;br /&gt;
&lt;br /&gt;VisualStateManager.GetVisualStateGroups({객체})[{index1}].States[{index2}].Storyboard&lt;br /&gt;
&lt;br /&gt;뭐 이런 식입니다. &lt;br /&gt;
&lt;br /&gt;여기서 주의할 점은 &quot;객체&quot;는 해당 컨트롤을 뜯하는 것이 아닙니다. &lt;br /&gt;
&lt;br /&gt;VisualStateManger는 각 객체의 Dependecy Attached Property와 비슷한 속성을 가지고 있기 때문에 &lt;br /&gt;
&lt;br /&gt;VisualStateManager가 정의 되어 있는 object가&amp;nbsp; 되겠습니다. 쉽게 말하면.. 다음과 같은 xaml코드가 있을 때&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;ControlTemplate TargetType=&quot;controls:DropDownBox&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Grid x:Name=&quot;Root&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;vsm:VisualStateManager.VisualStateGroups&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;vsm:VisualStateGroup x:Name=&quot;CommonStates&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;vsm:VisualState x:Name=&quot;Normal&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Storyboard&amp;nbsp;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/vsm:VisualState&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;vsm:VisualState x:Name=&quot;MouseOver&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Storyboard/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/vsm:VisualState&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/vsm:VisualStateGroup&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/vsm:VisualStateManager.VisualStateGroups&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/Grid&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/ControlTemplate&amp;gt;&lt;br /&gt;
&lt;br /&gt;바로 &quot;Root&quot;가 &quot;객체&quot;가 된다는 것이죠. 이 템플릿을 가지고 있는 Control이 아닌..&lt;br /&gt;
&lt;br /&gt;이렇게 지저분한 방법 말고는 Storyboard에 이름을 붙여주는 방법있습니다. &lt;br /&gt;
&lt;br /&gt;똑같은 코드에 아래와 같이 Storyboard에 이름을 붙이고&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;vsm:VisualState x:Name=&quot;Normal&quot;&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;Storyboard&amp;nbsp; x:Name=&quot;NormalStory&quot;/&amp;gt;&lt;br /&gt;
&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &amp;lt;/vsm:VisualState&amp;gt;&lt;br /&gt;
&lt;br /&gt;&lt;br /&gt;
코드 몇 윗부분 TemplatePart를 선언해주는 부분에&lt;br /&gt;
&lt;br /&gt;&amp;nbsp;[TemplatePart(Name = &quot;NormalStory&quot;, Type = typeof(Storyboard))]&lt;br /&gt;
&lt;br /&gt;이와 같은 코드를 추가해주시면 &lt;br /&gt;
&lt;br /&gt;GetTemplateChild(&quot;NormalStory&quot;) &lt;br /&gt;
&lt;br /&gt;요런 방법으로 Storyboard를 얻어 올 수 있습니다. &lt;br /&gt;
&lt;br /&gt;이런식으로 VisualState로 선언된 Storyboard도 동적 제어가 가능합니다. &lt;br /&gt;
&lt;br /&gt;</description>
			<category>Tip</category>
			<category>silverlight</category>
			<category>storyboard</category>
			<category>VisualStateManger</category>
			<category>실버라이트</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/27</guid>
			<comments>http://error1001.com/27#entry27comment</comments>
			<pubDate>Fri, 19 Sep 2008 20:28:44 +0900</pubDate>
		</item>
		<item>
			<title>실버라이트에서 MD5 암호화</title>
			<link>http://error1001.com/26</link>
			<description>&lt;A href=&quot;http://blogs.msdn.com/jeffwilcox/archive/2008/03/05/silverlight-2-md5-hash-string-provider-implementation.aspx&quot;&gt;http://blogs.msdn.com/jeffwilcox/archive/2008/03/05/silverlight-2-md5-hash-string-provider-implementation.aspx&lt;/A&gt;&lt;br /&gt;&lt;br /&gt;착한 외국분이 이미 개발해 주셨군요. 감사히 가져다 씁시다. &lt;br /&gt;&lt;br /&gt;사용법도 아주 간단합니다. &lt;br /&gt;&lt;br /&gt;이건 혹시나 링크가 없어질까봐.. 첨부합니다. &lt;br /&gt;&lt;br /&gt;&lt;div class=&quot;imageblock center&quot; style=&quot;text-align: center; clear: both;&quot;&gt;&lt;a href=&quot;http://error1001.tistory.com/attachment/ik4.zip&quot;&gt;&lt;img src=&quot;http://cfs.tistory.com/blog/image/extension/zip.gif&quot; alt=&quot;&quot; style=&quot;vertical-align: middle;&quot; /&gt; Silverlight.Md5.zip&lt;/a&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; &amp;nbsp; - smile -</description>
			<category>Tip</category>
			<category>MD5</category>
			<category>silverlight</category>
			<author>Boxmile</author>
			<guid>http://error1001.com/26</guid>
			<comments>http://error1001.com/26#entry26comment</comments>
			<pubDate>Thu, 11 Sep 2008 16:38:52 +0900</pubDate>
		</item>
		<item>
			<title>님하 커스텀 커서 지원 점...</title>
			<link>http://error1001.com/24</link>
			<description>때로는 기본 제공 커서 외에 특별한 형태의 커서를 사용하고 싶을 때가 있는 데요, 예를 들어 돋보기라던가...&lt;br /&gt;W3C의 CSS 표준에서도 다음과 같은 코드를 통해 지원하죠.&lt;br /&gt;&lt;br /&gt;
&lt;BLOCKQUOTE&gt;&amp;lt;style type=&quot;text/css&quot;&amp;gt;&lt;br /&gt;body {&lt;br /&gt;cursor: url(&quot;http://209.85.62.24/86/165/0/f78500/Normal.cur&quot;), pointer;&lt;br /&gt;}&lt;br /&gt;&amp;lt;/style&amp;gt;&lt;/BLOCKQUOTE&gt;물론 지금도 기본 커서를 숨긴 상태에서 마우스를 따라다니는 이미지로 커스텀 커서를 구현할 수 있지만 아래에 깔려있는 오브젝트가 많을 경우 욕나오게 느리고 버벅거리죠.&lt;br /&gt;&lt;br /&gt;커서 변경 기능은 CSS표준인데다가 IE와 FF모두 지원하는 만큼 실버라이트 런타임도 &quot;CUR&quot;파일을 사용한 커스텀 커서를 허용해줬으면 좋겠어요.&lt;br /&gt;</description>
			<category>Wish List</category>
			<category>cursor</category>
			<category>silverlight</category>
			<category>커서</category>
			<author>gongdo</author>
			<guid>http://error1001.com/24</guid>
			<comments>http://error1001.com/24#entry24comment</comments>
			<pubDate>Tue, 26 Aug 2008 22:13:45 +0900</pubDate>
		</item>
	</channel>
</rss>
