xamarin ScrollView使性能非常缓慢

pu82cl6c  于 2023-04-03  发布在  其他
关注(0)|答案(2)|浏览(160)

我有一个针对Android 10.0的Xamarin表单项目。
我正在使用SyncFusion SfDataGrid显示信息。
在DataGrid的每一行中,我都有一个输入字段。
我将DataGrid封装在ScrollView中,这样当用户在输入字段中点击时,键盘不会覆盖屏幕。
问题是,当我添加ScrollView时,页面加载的时间要长得多。当我删除ScrollView时,它非常敏捷,但专注于底部一行的输入控件会导致键盘覆盖该行。
为什么添加ScrollView会导致这些性能问题?

<Frame Padding="5" VerticalOptions="FillAndExpand" CornerRadius="5" HasShadow="True">
    <ScrollView>
        <datagrid:SfDataGrid ItemsSource="{Binding Items}" AutoGenerateColumns="False">
            <datagrid:SfDataGrid.GridStyle>
                <datagrid:DefaultStyle GridLinesVisibility="None"/>
            </datagrid:SfDataGrid.GridStyle>
            <datagrid:SfDataGrid.Columns>
                <datagrid:GridTextColumn HeaderText="Desc"  MappingName="Description"/>
                <datagrid:GridTemplateColumn MappingName="Qty">
                    <datagrid:GridTemplateColumn.CellTemplate>
                        <DataTemplate>
                            <ViewCell>
                                <Entry Text="{Binding Qty}" Keyboard="Numeric"/>
                            </ViewCell>
                        </DataTemplate>
                    </datagrid:GridTemplateColumn.CellTemplate>              
                </datagrid:GridTemplateColumn>           
            </datagrid:SfDataGrid.Columns>
        </datagrid:SfDataGrid>
    </ScrollView>
</Frame>
wswtfjt7

wswtfjt71#

问题是你在ScrollView中嵌套了一个可滚动的视图(SfDataGrid),这是不鼓励的(见链接)。
如果你想确保键盘不会隐藏聚焦的Entry,你应该删除ScrollView并指定一个Soft Keyboard Input Mode,例如使用PanResize值。
将以下内容添加到App.xaml.cs:

<Application
    xmlns:android="clr-namespace:Xamarin.Forms.PlatformConfiguration.AndroidSpecific;assembly=Xamarin.Forms.Core"
    android:Application.WindowSoftInputModeAdjust="Resize">
</Application>

或者,您也可以在应用的代码隐藏中设置WindowSoftInputModeAdjust

using Xamarin.Forms.PlatformConfiguration;
using Xamarin.Forms.PlatformConfiguration.AndroidSpecific;

//...

App.Current.On<Android>().UseWindowSoftInputModeAdjust(WindowSoftInputModeAdjust.Resize);

请注意,这将只适用于Android。

kokeuurv

kokeuurv2#

SfDatagrid基本上在屏幕后面使用虚拟化概念,这意味着它只有较少的实际行数(可视元素)基于SfDataGrid高度(视图端口高度)和行的位置将根据滚动位置而改变。这就是为什么它无论itemsource集合大小都具有出色的滚动和加载性能。但是当您将SfDataGrid放在scrollview中时,基本上,scrollview将测量SfDataGrid并根据内容大小(ItemSource集合大小)设置其高度,这将破坏虚拟化并导致基于itemsource集合大小创建所有行元素。
如果希望在滚动视图中使用SfDataGrid,请使用HeightRequest属性为SfDataGrid分配所需的高度。
希望这能澄清你的疑虑。
P.S:SfDataGrid前团队负责人

相关问题