【发布时间】:2018-03-08 22:57:15
【问题描述】:
我的应用中有一个 Xamarin.Forms ListView,而这个 ListView 使用由 DataTemplateSelector 选择的不同 ItemTemplates。使用某些模板效果很好,但其中一些模板会产生性能问题。这是一个坏模板的代码:
<DataTemplate x:Key="Template1">
<ViewCell>
<Grid Padding="10,0,10,0">
<Grid.Resources>
<ResourceDictionary>
<Style TargetType="Label" BasedOn="{StaticResource LabelStyle}"/>
<Style TargetType="BoxView" BasedOn="{StaticResource InactiveStyle}"/>
</ResourceDictionary>
</Grid.Resources>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="*"/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition/>
<RowDefinition/>
<RowDefinition/>
</Grid.RowDefinitions>
<Image Grid.Column="0" Grid.RowSpan="3" Source="Icon.png" HeightRequest="30" WidthRequest="30" Margin="0,0,10,0" VerticalOptions="Center" HorizontalOptions="Center"/>
<BoxView Grid.Column="1" Grid.Row="0" Grid.ColumnSpan="2" IsVisible="{Binding Inactive}"/>
<Label Grid.Column="1" Grid.Row="0" Grid.ColumnSpan="2" x:Name="Label1" Text="{Binding Column1}" FontAttributes="Bold"/>
<BoxView Grid.Column="1" Grid.Row="1" IsVisible="{Binding Inactive}"/>
<Label Grid.Column="1" Grid.Row="1" Text="{Binding Column2}" HorizontalOptions="Start"/>
<BoxView Grid.Column="2" Grid.Row="1" IsVisible="{Binding Inactive}"/>
<Label Grid.Column="2" Grid.Row="1" Text="{Binding Column3}" HorizontalOptions="End"/>
<BoxView Grid.Column="1" Grid.Row="2" IsVisible="{Binding Inactive}"/>
<Label Grid.Column="1" Grid.Row="2" Text="{Binding Column4}" HorizontalOptions="Start" />
<BoxView Grid.Column="2" Grid.Row="2" IsVisible="{Binding Inactive}"/>
<Label Grid.Column="2" Grid.Row="2" Text="{Binding Column5}" HorizontalOptions="End"/>
</Grid>
</ViewCell>
</DataTemplate>
我也发现了这个:Xamarin ListView Performance,但我无法让它滚动得更快。看起来它无法足够快地创建单元格,以至于列表滚动生涩(Android和iOS)。我能做些什么来更快地做到这一点?
编辑:
我切换到CachingStrategy="RetailElement" 并且能够优化一些东西。但总是在调用 OnSelectTemplate 方法时滚动变慢。即使此方法确实只在第一行返回一个模板。所以对我来说,这看起来模板需要很长时间才能构建。但我不知道为什么:(
【问题讨论】:
-
您能否发布一张
ListView外观的屏幕截图?如果可能的话,将有助于简化DataTemplate。你也在设置CachingStrategy吗? -
嗯,前面有 3 行 3 行包含文本和一个图像。如果文本处于非活动状态,则 boxviews 只是用来删除文本
-
您可以尝试使用具有
IsStrikeThrough属性的XLabs'ExtendedLabel。这将摆脱所有那些BoxView元素。摆脱尽可能多的元素应该会有所帮助。 -
您是否尝试过删除部分视图以查看可能对性能产生影响的因素?例如,尝试删除图像(仅作为测试)。了解布局的哪些部分显着减慢速度有助于确定下一步该做什么。此外,根据您的布局,您应该能够为第一列的宽度分配一个常量,这将导致比自动更快的布局时间。
-
我删除了
BoxView和Image。但它并没有变得更快。查看我编辑的问题
标签: c# xamarin xamarin.ios xamarin.forms xamarin.android