网格视图中的性能非常低

时间:2016-01-12 18:18:06

标签: gridview windows-phone-8.1 windows-phone

我最近构建了一个页面,该页面使用表格左侧和表格左侧的元素进行一些计算,并将结果放在网格视图中。

一切正常,但表现太可怕了。不仅如此,它在手机上无法使用(我目前正在使用Lumia 1020)。 从问题开始,它有一个可怕的内存泄漏(也许它需要100MB的RAM,所有这些都不会在返回或在应用程序的其他地方解放)。

然后,如果我在同一个线程中加载所有元素,加载时间很长6-7秒,如果我在后台加载它们,用户可以很容易地看到元素在网格视图中被加载,在此期间它无法使用。

加载完成后,滚动非常迟缓。有时甚至它不响应用户。顶部,左侧和中间元素的滚动是同步的,但是当移动中间网格视图时,其他元素需要半秒钟才能达到相同的偏移量。当它发生在另一个方向上时,在滚动中获得相同的偏移需要一秒或更多时间,并且它会发生跳跃(不顺利)。

我喜欢加载和计算20x50元素。

以下是代码:

                           

<Grid.ColumnDefinitions>
    <ColumnDefinition Width="75"/>
    <ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>

<Grid x:Name="tbMain" Width="75" Height="75" Margin="1.5,1.5,-1.5,1.5" DoubleTapped="tbHMain_DoubleTapped">
    <TextBlock Grid.Row="0" Grid.Column="0" x:Name="tbMainHeaderTable" Text="some text"
               Margin="1" HorizontalAlignment="Center" VerticalAlignment="Center" TextWrapping="WrapWholeWords"
               Style="{StaticResource BodyTextBlockStyle}"/>
</Grid>

<ScrollViewer Grid.Row="0" Grid.Column="1" x:Name="Top" ViewChanged="Top_ViewChanged" Margin="0,1.5,1.5,0"
              HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden">
    <ListView x:Name="gridTop" Grid.Row="0" Grid.Column="1" Margin="1.5,1.5,1.5,0" ItemsSource="{Binding}"
              DataContext="{Binding listFocal}" HorizontalContentAlignment="Stretch" IsTapEnabled="False"
              IsHoldingEnabled="False">
        <ListView.ItemsPanel>
            <ItemsPanelTemplate>
                <VirtualizingStackPanel Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </ListView.ItemsPanel>

        <ListView.ItemTemplate>

            <DataTemplate>
                <GridViewItem Margin="1" HorizontalAlignment="Stretch" Width="75" Height="75"
                              Background="{StaticResource DarkGreyThemeColor}">
                    <TextBlock x:Name="tbTop" Text="{Binding}" HorizontalAlignment="Center"
                               VerticalAlignment="Center" Style="{StaticResource GoldenThemeStyle}"/>
                </GridViewItem>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>
</ScrollViewer>

<ScrollViewer Grid.Row="1" Grid.Column="0" x:Name="Left" ViewChanged="Left_ViewChanged" Margin="0,1.5,0,1.5"
              HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden">

    <ListView x:Name="gridLeft" ItemsSource="{Binding}" HorizontalContentAlignment="Stretch" IsTapEnabled="False"
              IsHoldingEnabled="False">
        <ListView.ItemTemplate>
            <DataTemplate>
                <GridViewItem Margin="1" HorizontalAlignment="Stretch" VerticalAlignment="Center" Width="75"
                              Height="75" Background="{StaticResource DarkGreyThemeColor}">
                    <TextBlock x:Name="tbLeft" Text="{Binding}" HorizontalAlignment="Center"
                               VerticalAlignment="Center" Style="{StaticResource GoldenThemeStyle}"/>
                </GridViewItem>
            </DataTemplate>
        </ListView.ItemTemplate>
    </ListView>

</ScrollViewer>

<ScrollViewer Grid.Row="1" Grid.Column="1" x:Name="Middle" ViewChanged="Middle_ViewChanged" Margin="1.5"
              HorizontalScrollBarVisibility="Hidden" VerticalScrollBarVisibility="Hidden">

    <GridView x:Name="gridMiddle" ItemsSource="{Binding}" HorizontalContentAlignment="Stretch" IsTapEnabled="False"
              IsHoldingEnabled="False">
        <GridView.ItemsPanel>
            <ItemsPanelTemplate>
                <VariableSizedWrapGrid MaximumRowsOrColumns="28" Orientation="Horizontal"/>
            </ItemsPanelTemplate>
        </GridView.ItemsPanel>
        <GridView.ItemContainerStyle>
            <Style TargetType="GridViewItem">
                <Setter Property="Template">
                    <Setter.Value>
                        <ControlTemplate>
                            <ContentPresenter x:Name="contentPresenter"
                                              HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}"
                                              VerticalAlignment="{TemplateBinding VerticalContentAlignment}"
                                              Margin="{TemplateBinding Padding}"/>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Style>
        </GridView.ItemContainerStyle>
        <GridView.ItemTemplate>
            <DataTemplate>
                <Grid Margin="1" HorizontalAlignment="Stretch" VerticalAlignment="Stretch" Width="75" Height="75"
                      Background="{StaticResource MediumDarkGreyThemeColor}">
                    <TextBlock x:Name="tbResult" Text="{Binding}" HorizontalAlignment="Center"
                               VerticalAlignment="Center"/>
                </Grid>
            </DataTemplate>
        </GridView.ItemTemplate>
    </GridView>
</ScrollViewer>

private void Middle_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{
Top.ChangeView(Middle.HorizontalOffset, null, null, true);
Left.ChangeView(null, Middle.VerticalOffset, null, true);
}

private void Left_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{
Middle.ChangeView(null, Left.VerticalOffset, null, true);
}

private void Top_ViewChanged(object sender, ScrollViewerViewChangedEventArgs e)
{
Middle.ChangeView(Top.HorizontalOffset, null, null, true);
}

private void tbMain_DoubleTapped(object sender, DoubleTappedRoutedEventArgs e)
{
Middle.ChangeView(0, 0, null, false);
}

1 个答案:

答案 0 :(得分:0)

如果要加载这么多项目,则应使用增量加载,即当用户接近要显示的项目时加载项目。请检查this link