silverlight元素FrameworkElement.LayoutUpdated布局变化事件
silverlight的元素基類FrameworkElement有事件LayoutUpdated,該事件表示元素發(fā)生布局變化后出發(fā),什么是 布局發(fā)生變化,比較多了,比如尺寸的變化width height,或者位置的變化 left top,甚至被其他元素遮擋關系的變化,都算是布局變化。
這里主要說這個時間響應處理時的參數(shù)Sender,Sender不陌生,所有事件函數(shù)都有這個參數(shù),表示觸發(fā)該事件的對象。
Silverlight的元素LayoutUpdated事件中,Sender比較特殊,如果你實現(xiàn)一段代碼來響應這個事件,往往會發(fā)現(xiàn)Sender是Null,如果不佳判斷的使用它,將出現(xiàn)未初始化的異常錯誤。
來看看微軟官方關于FrameworkElement.LayoutUpdated的說明?
?
?
FrameworkElement.LayoutUpdated 事件
Silverlight
當 Silverlight 可視化樹的布局更改時發(fā)生。
備注
LayoutUpdated 是序列中準備好進行交互的控件之前要發(fā)生的最后一個對象生存期事件。但是,由于以下多種原因,在對象生存期期間也可能在運行時發(fā)生 LayoutUpdated:屬性更改、窗口大小調(diào)整或顯式請求(UpdateLayout 或 ApplyTemplate)。在樹中的所有可能 SizeChanged 事件引發(fā)完成后,引發(fā) LayoutUpdated 事件。
在 WPF 中,此事件是路由事件,它實際上位于 UIElement 而非 FrameworkElement 上。在 Silverlight 中,此事件不是路由事件,而是使用 EventArgs(而非 RoutedEventArgs)的標準 CLR 事件。
當附加處理程序的對象不必更改其下的可視化樹中的任何內(nèi)容時,可能發(fā)生 LayoutUpdated。例如,假設一個包含兩個元素的布局容器。如果第一個對象更改了一個強制執(zhí)行新布局的屬性,兩個對象都會引發(fā) LayoutUpdated,因為第二個對象可能會被重新定位,即使其自己的子布局不發(fā)生更改也是如此。
當您處理 LayoutUpdated 時,不要依賴于 sender 值。對于 LayoutUpdated,sender 始終為 null,而無論在何處附加處理程序。這是為了防止處理程序?qū)⑷魏魏x分配給 sender,例如,暗示正是由特定元素在可視化樹之外引發(fā)了此事件。相反,LayoutUpdated 暗示總體 Silverlight 可視化樹中的某些內(nèi)容已發(fā)生變化,樹中任何位置的每個特定對象都具有處理此事件的選項。Silverlight 版本的 LayoutUpdated 在一定程度上具有此行為,以保持 WPF 兼容性。
上文是微軟MSDN對silverlight? FrameworkElement.LayoutUpdated的說明片段,留意一下其中我紅色標注的一句,微軟也布局變化事件的Sender參數(shù)進行了 特別說明,不要去使用這個Sender,因為布局變化實在太頻繁太復雜影響也太廣泛,呵呵,以至于不好處理他的觸發(fā)對象是誰了。
我做了個 sl應用,大致是一個容器里有若干圖標可以通過拖動改變位置,并且我想再拖動圖標改變位置時對其父容器大小進行改變以能夠完全容納所有圖標。本來我是自己 擴展了一個事件,來表示圖標位置變化,后發(fā)現(xiàn)silverlight本來就有FrameworkElement.LayoutUpdated事件,就改用 這個事件響應處理,可發(fā)現(xiàn)異常不斷,因為元素之間相互交叉相互影響觸發(fā)的布局變化事件太多了,往往造成循環(huán)觸發(fā)而異常拋出。并且致命的是這個sender 還往往會給Null值,不能根據(jù)其來判斷我挪動了哪個圖標。最終無果,只有還是使用自己實現(xiàn)的位置變化的事件。
轉(zhuǎn)載于:https://www.cnblogs.com/shihao/archive/2011/04/20/2022964.html
總結(jié)
以上是生活随笔為你收集整理的silverlight元素FrameworkElement.LayoutUpdated布局变化事件的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 余额宝里莫名生钱,其实都是自己的钱转入
- 下一篇: 安装显卡驱动后分辨率低的办法