2013-03-16 75 views
0

我正在使用帶有模板選擇器的GridView,並在後面的代碼中傳遞了項目源。與此問題是,VariableSizedWrapGrid是非常慢,收集傳遞約80個項目大(集合是由幾個字符串組成)。刪除variableSizedWrapGrid解決了這個問題,但讓我在寬度較小的模板之間留下很大空白。Windows 8 Xaml Slow VariableSizedWrapGrid

這裏是GridView控件:

<SemanticZoom x:Name="Zoom" Grid.Row="1" IsZoomedInViewActive="False" ViewChangeStarted="Zoom_ViewChangeStarted_1" IsZoomOutButtonEnabled="False" Margin="0,0,0,29" Grid.RowSpan="2"> 
     <SemanticZoom.ZoomedInView> 
      <!-- Horizontal scrolling grid used in most view states --> 
      <GridView 
     x:Name="itemGridView" 
     AutomationProperties.AutomationId="ItemsGridView" 
     AutomationProperties.Name="Items" 
     TabIndex="1" 
     ItemTemplateSelector="{StaticResource DayTemplateSelector}" 
     SelectionMode="None" 
     IsSwipeEnabled="True" 
     ItemContainerStyle="{StaticResource GridViewItemStyle1}" 
     ScrollViewer.HorizontalScrollBarVisibility="Auto" 
     IsItemClickEnabled="True" 
     ScrollViewer.IsHorizontalScrollChainingEnabled="False" 
     ItemClick="ItemView_ItemClick"> 
       <GridView.ItemsPanel> 
        <ItemsPanelTemplate> 
         <VariableSizedWrapGrid ItemWidth="380" ItemHeight="500"/> 
        </ItemsPanelTemplate> 
       </GridView.ItemsPanel> 
      </GridView> 
     </SemanticZoom.ZoomedInView> 

和模板選擇:

 class DayTemplateSelecter : DataTemplateSelector 
{ 
    public DataTemplate DayOffTemplate { get; set; } 

    public DataTemplate DutyTemplate { get; set; } 

    public DataTemplate RestTemplate { get; set; } 

    protected override DataTemplate SelectTemplateCore(object item, DependencyObject container) 
    { 
     var templateItem = item as DutyItem; 
     var element = container as FrameworkElement; 


     if (templateItem.Trip.Count > 0 || templateItem.OtherTrip.Count > 0) 
     { 
      container.SetValue(VariableSizedWrapGrid.ColumnSpanProperty, 2); 
       return DutyTemplate; 
     } 
     else if (templateItem.Codes.Count > 0) 
     { 
       container.SetValue(VariableSizedWrapGrid.ColumnSpanProperty, 1); 
       return DayOffTemplate; 

     } 
     else 
     { 
      container.SetValue(VariableSizedWrapGrid.ColumnSpanProperty, 1); 
      return RestTemplate; 
     } 

    } 

} 

我沒想到這都會有這樣的使用variableSized會給頁面帶來較大的性能difference..just 3秒的延遲,這在一些低端平板電腦上甚至更大。

我做錯了,有沒有更好的方法來做到這一點?

回答

1

與WrapGrid不同的VariableSizedWrapGrid不虛擬化其項目。我建議如果你必須顯示80個項目使用WrapGrid或者如果你必須使用VariableSizedWrapGrid減少項目的數量到一個更可管理的水平。

+0

有沒有辦法通過WrapGrid最小化模板之間的差距? GridView似乎根據集合中的第一個來修復項目寬度。 – user2165988 2013-03-17 22:22:14

+0

WrapGrid爲其所有項目執行相同的大小,並且您無法對其執行任何操作。您可能不得不重新考慮您的佈局或使用GridView重新考慮。如果不知道設計目標,我不能提出更具體的建議。 – Denis 2013-03-18 22:07:48