我最近构建了一个页面,该页面使用表格左侧和表格左侧的元素进行一些计算,并将结果放在网格视图中。
一切正常,但表现太可怕了。不仅如此,它在手机上无法使用(我目前正在使用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);
}