Windows Phone性能优化建议
- 使用background thread解碼圖片
???? 在Windows Phone中支持的圖片格式有jpg和png,微軟建議使用png格式的圖片,因為png格式的圖片在解碼速度上要比jpg快。那么我們怎么來控制用后臺線程來解碼圖片呢?看下面的代碼。
<Image Height="100" Width="100" Margin="12,0,9,0"><Image.Source><BitmapImage UriSource="{Binding ImgURL}" CreateOptions="BackgroundCreation"/></Image.Source> </Image> var bi = new BitmapImage(); bi.CreateOptions = BitmapCreateOptions.BackgroundCreation;???? 這兩段代碼都設置了BitmapImage的CreateOptions屬性,這樣做避免了在UI線程來對圖片解碼,在使用過程中BackgroundCreation確實有效地提高了頁面的響應效率,尤其是在圖片密集型的頁面。需要注意的是,圖片位置可能出現短暫的空白,不過這段時間我們可以通過一個圖片占位符的方法來處理。CreateOptions屬性包括有四種:
- 減少不必要的PropertyChanged事件的觸發
???? 在MVVM模式的開發中,通過設置INotifyPropertyChanged接口使View作為一個觀察者,可以使我們方便的通過DataBinding更新UI內容,這里我們要說的其實PropertyChanged事件是一個冗長的方法。如果你使用的是VS2012或更高的版本使用工具欄的Code Map按鈕可以看到系統監聽的add_PropertyChanged事件,而且它在UI線程上執行。為了減少不必要的PropertyChanged事件的觸發,我們可以采用下面這種方法來對value的值提前做出判斷。
public string Text {get { return _text;}set{if( _text == value) return;_text = value;RaisePropertyChanged("Text");} }- 減少Databinding中Converter的使用
???? 在Databinding中我們可以創建一個繼承自IValueConverter的類實現Convert方法來對綁定的值做進一步處理,這個處理會直接影響到綁定的速度,而且這個轉換是在UI線程執行的,如果我們把一個很重的方法放在了這個Converter里,那綁定的速度就可想而知了。總之,對后臺數據的處理還是在后臺線程中準備好之后在通知UI更新,盡量避免因為Converter造成的UI阻塞。
- 開啟集合控件的虛擬化
???? 在之前的一篇博客中我們介紹了在Windows Phone中集合控件的使用。VirtualizingStackPanel是一個重要的概念,在ListBox中默認的Itmes的容器就是VirtualizingStackPanel,這個容器是虛擬化的,不同于StackPanel。它只創建了大約屏幕可見的數量,而非將ListBox中的Items一次全部創建,隨著上下滾動再次創建剩下為顯示在屏幕上的內容。這樣就大大節省了頁面首次渲染的時間。
???? VirtualizingStackPanel還有一個比較重要的屬性,就是VirtualizationMode。這個屬性有兩個值。
???? 顯然我們開啟VirtualizingStackPanel的Recycling模式來重用容器,避免新的容器的創建。下面是一個ListBox的示例代碼。
<ListBox ItemsSource="{StaticResource data}" VirtualizingStackPanel.IsVirtualizing="True"VirtualizingStackPanel.VirtualizationMode="Recycling" />- 動態加載PivotItem
???? 在Windows Phone開發中軸心控件Pivot絕對是一個布局很好的選擇。但是如果我們的頁面的PivotItem比較多,會直接影響到我們頁面的渲染時間,尤其是在首頁的時候,等待的時間可能會更加長。這時候我們可以考慮動態的加載PivotItem的方法來減輕首次加載頁面的時間,我們只需要在頁面定義空的PivotItem,再在OnLoadingPivotItem的事件中動態的創建UserControl并加入到相應的PivotItem的Content中即可。
<controls:Pivot x:Name="pivot" OnLoadingPivotItem="OnLoading"><controls:PivotItem x:Name="firstItem"/> </controls:Pivot> public void OnLoading(PivotItem item) {if(item.Content == null){var userControl = new CustemControl();item.Content = userControl;} }- 為ObservableCollection添加AddRange方法
???? ObservableCollection絕對是數據綁定過程中重要的集合,使用這個集合可以通過Add方法方便的更新集合。但當數據量大的情況下我們是否可以考慮自定義一個AddRange方法,來替換掉每次Add的時候觸發的NotifyCollectionChangedAction.Add類型的事件。而改用NotifyCollectionChangedAction.Reset使整個頁面只刷新一次。那么就來看看這個擴展類的寫法。
public class ObservableCollectionEx<T> : ObservableCollection<T> {public void AddRange(IEnumerable<T> list){foreach (T item in list){Items.Add(item);}OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));OnPropertyChanged(“Count”);} }- 使用Async、await、Task<TResult>異步編程
?
?
posted on 2014-04-10 13:01 NET未來之路 閱讀(...) 評論(...) 編輯 收藏轉載于:https://www.cnblogs.com/lonelyxmas/p/3656247.html
總結
以上是生活随笔為你收集整理的Windows Phone性能优化建议的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用before、after伪类制作三角
- 下一篇: csv转json文件