閱讀706 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Windows Phone自定義控件

為了實現公司需求,不得不自己寫自定義控件。首先第一個需求是密碼掩碼和明碼顯示的切 換。做的時候發現PasswordBox沒有切換掩碼和明碼的屬性或方法。那好咱隻好自己動手實現,用一個TextBox和passwordBox來分別 實現掩碼和明碼的顯示。直接上效果圖吧。

明碼顯示

掩碼顯示

舊密碼仍舊掩碼顯示,而新編輯的密碼是明碼顯示

第二個控件是下拉刷新控件。下拉提示下拉可以刷新,下拉到一定程度提示鬆開可以刷新,鬆開手後顯示正在刷新。

這樣的控件網上還是有例子的,繼承ListBox,使用自己的控件模版來實現一個下拉刷新列表框。然而做好後發現,公司需求是要可以容納大批量數據的列表,而且還要提供複選框。

這沒關係,有Toolkit控件嘛,LongListSelector有虛擬化功能,可以加載大約8000條數據而不占用大量內存開銷,而且還有選擇狀態,列表項前麵有複選框。好吧,咱就繼承LongListSelector 控件實現一個下拉刷新控件。

照同樣的方法寫好了,然而發現數據綁定上去後,竟然顯示不出任何數據。這是為毛啊,為毛啊!斷點調試ItemsSource數據有綁定上去啊!瞬間淚奔啊!

後來從Toolkit的源碼裏麵找到LongListSelector 的控件模版,發現承載內容的模版是好像是叫ViewPorts的控件。好把咱把控件的模版裏麵內容承載的模版換成Viewport。再次運行,OK!顯示成功,瞬間內流滿麵!上圖

效果出來了,咱試試大批量數據加載,先加個800條看看,有些卡,不過還算正常。

再試試加載1000條數據,瞬間崩潰了,為啥呀,為啥呀!後來發現繼承LongListSelector 寫的控件的模版有ScrollViewer,這個東西破壞了虛擬化。從LongListSelector 的可視化樹中取ScrollViewer,壓根沒這東西,隻能取到ScrollBar。好吧!這樣寫是不行的,再次淚奔了。

最後絞盡腦筋隻能用控件的MouseEnter、MouseMove和MouseLeave三個事件,加上控件ScrollBar的Value值來 模擬這樣的效果。總算是能實現同樣的效果,不過效果比繼承的方法略差。好處是,完全不會破壞LongListSelector 的虛擬化,一次加載個1000條數據完全顯示正常,不會崩潰。總算能交差了!

最後更新:2017-04-03 20:43:08

  上一篇:go 進程通信係列-單向郵槽
  下一篇:go Mybatis中傳參包There is no getter for property named 'XXX' in 'class java.lang.String'