2013-03-16 55 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