[Silverlight] Loaded & LayoutUpdated 的順序

2010/08/05

前幾天在測試一些東西,需要Silverlight 跟 Javascript 互相的呼叫..
但是我再把值傳進去時.. 將一些物件寫在UserControl 的Loaded 中..
發現竟然會出現null reference ... 尚未被 initialize 起來...
網路上查一下文件... 其中提到這句話....

You can handle LayoutUpdated instead of Loaded .
LayoutUpdated is the last “object lifetime” event in the sequence of spinning up a control in Silverlight UI.


我就很好奇寫一隻測試程式觀察一下…
到底他們之間的變化…
以下是畫面物件上面的配置…
sshot-12

其中對標示有顏色的物件,都分別加入了 Loaded , LayoutUpdated 的事件呼叫…

之後我發現原來他們呼叫順序是…

sshot-13



其中我們發現到,視覺上的物件都會先被Loaded 但是到最後重繪完成的時候才會呼叫 LayoutUpdated ..
但是Loaded 只會被執行一次,事實上畫面被重繪時都會再次呼叫LayoutUpdated ..
雖然LayoutUodated 是確定物件已經準備好了,但是請注意會被一直呼叫..
所以得妥善使用,注意記得回收...
像是這樣的寫法...
lstLog.LayoutUpdated -= lstLog_LayoutUpdated
這邊有msdn 說明LayoutUpdated 的說明..
裡面有一句令人玩味的話,順帶一題需要注意一下

當您處理 LayoutUpdated 時,請勿依賴 sender 值。對於 LayoutUpdated,無論處理常式附加在何處,sender 永遠一律為 Nothing。這是為了防止處理常式將任何意義指派給 sender,例如表示這是在視覺化樹狀結構外引發事件的特定項目。LayoutUpdated 表示在整體 Silverlight 視覺化樹狀結構有發生變更,而且樹狀結構中任意位置的每個特定物件都具有處理這種變更的選項。Silverlight 版本的 LayoutUpdated 具有部分的這種行為以維護 WPF 相容性。

參考來源 :
http://blogs.msdn.com/b/silverlight_sdk/archive/2008/10/24/loaded-event-timing-in-silverlight.aspx
http://msdn.microsoft.com/zh-tw/library/system.windows.frameworkelement.layoutupdated(VS.95).aspx

範例下載:


讚一下:


0 意見:

程式 . 生活 . D小調.@2010 | Binary Design: One Winged Angel.