臨時記錄、分享一些小的開發技巧:
1. 在資料繫結時,如果資料來源需要被清空:collection.Clear(); 建議在語句後把集合置為null:collection.Clear(); collection= null;(開發過程中因為沒有置為null而報錯,Windows.UI.Xaml.dll的錯誤)
2. async void 函數與async Task函數不能混為一談。
async void FUNCTIONNAME1(){ ... await ...; Debug.WriteLine("FUNCTIONNAME1 over")};
async Task FUNCTIONNAME2(){ ... await ...; Debug.WriteLine("FUNCTIONNAME2 over")};
section1: FUNCTIONNAME1(); Debug.WriteLine("FUNCTIONNAME1");
section2: await FUNCTIONNAME2(); Debug.WriteLine("FUNCTIONNAME2");
以上兩段代碼中section1的代碼在執行時會非同步執行,有可能先輸出FUNCTIONNAME1,然後輸出FUNCTIONNAME1 over。第二段代碼則能保證在輸出FUNCTIONNAME2 over後再輸出FUNCTIONNAME2。
3. 你的代碼是不是真的實現了虛擬化?不能單單看你的代碼是不是寫了相關控制項,而需要用VirtualizingStackPanel的CleanUpVirtualizedItemEvent事件來確定是不是真正的實現了虛擬化。我們在gridview的style中修改了樣式,導致上述事件不觸發:
<Style x:Key="PaddingGridViewStyle" TargetType="GridView"> <Setter Property="Padding" Value="0,0,0,10"/> <Setter Property="IsTabStop" Value="False"/> <Setter Property="TabNavigation" Value="Once"/> <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto"/> <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Disabled"/> <Setter Property="ScrollViewer.HorizontalScrollMode" Value="Enabled"/> <Setter Property="ScrollViewer.IsHorizontalRailEnabled" Value="False"/> <Setter Property="ScrollViewer.VerticalScrollMode" Value="Disabled"/> <Setter Property="ScrollViewer.IsVerticalRailEnabled" Value="False"/> <Setter Property="ScrollViewer.ZoomMode" Value="Disabled"/> <Setter Property="IsSwipeEnabled" Value="True"/> <Setter Property="ItemContainerTransitions"> <Setter.Value> <TransitionCollection> <AddDeleteThemeTransition/> <ContentThemeTransition/> <ReorderThemeTransition/> <EntranceThemeTransition IsStaggeringEnabled="False"/> </TransitionCollection> </Setter.Value> </Setter> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="GridView"> <Border BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Padding="1"> <ScrollViewer x:Name="ScrollViewer" HorizontalScrollMode="{TemplateBinding ScrollViewer.HorizontalScrollMode}" HorizontalScrollBarVisibility="{TemplateBinding ScrollViewer.HorizontalScrollBarVisibility}" IsHorizontalRailEnabled="{TemplateBinding ScrollViewer.IsHorizontalRailEnabled}" IsHorizontalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsHorizontalScrollChainingEnabled}" IsVerticalScrollChainingEnabled="{TemplateBinding ScrollViewer.IsVerticalScrollChainingEnabled}" IsVerticalRailEnabled="{TemplateBinding ScrollViewer.IsVerticalRailEnabled}" TabNavigation="{TemplateBinding TabNavigation}" VerticalScrollBarVisibility="{TemplateBinding ScrollViewer.VerticalScrollBarVisibility}" VerticalScrollMode="{TemplateBinding ScrollViewer.VerticalScrollMode}" ZoomMode="{TemplateBinding ScrollViewer.ZoomMode}"> <Grid Margin="{TemplateBinding Padding}"> <ItemsPresenter HeaderTemplate="{TemplateBinding HeaderTemplate}" Header="{TemplateBinding Header}" HeaderTransitions="{TemplateBinding HeaderTransitions}" /> </Grid> </ScrollViewer> </Border> </ControlTemplate> </Setter.Value> </Setter> </Style>
代碼中紅色的部分導致虛擬化被破壞,修改後
<ScrollViewer x:Name="ScrollViewer" ...> <ItemsPresenter HeaderTemplate="{TemplateBinding HeaderTemplate}" Header="{TemplateBinding Header}" Margin="{TemplateBinding Padding}" HeaderTransitions="{TemplateBinding HeaderTransitions}" /></ScrollViewer>