Windows 8 Xaml Slow VariableSizedWrapGrid

时间:2013-03-16 14:15:39

标签: c# xaml windows-8

我正在使用带有模板选择器的GridView并在后面的代码中传递项目源。这个问题是VariableSizedWrapGrid非常慢,传递的集合大约有80个项目(集合由几个字符串组成)。删除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会给页面延迟3秒,这在某些低端平板电脑上会更大。

我做错了吗,有更好的方法吗?

1 个答案:

答案 0 :(得分:1)

VariableSizedWrapGrid与WrapGrid不同,它不会虚拟化其项目。我建议如果你必须显示80个项目使用WrapGrid或者如果你必须使用VariableSizedWrapGrid减少项目数量到一个更易于管理的水平。