我有一个针对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>
2条答案
按热度按时间wswtfjt71#
问题是你在ScrollView中嵌套了一个可滚动的视图(SfDataGrid),这是不鼓励的(见链接)。
如果你想确保键盘不会隐藏聚焦的
Entry
,你应该删除ScrollView并指定一个Soft Keyboard Input Mode,例如使用Pan
或Resize
值。将以下内容添加到App.xaml.cs:
或者,您也可以在应用的代码隐藏中设置
WindowSoftInputModeAdjust
:请注意,这将只适用于Android。
kokeuurv2#
SfDatagrid基本上在屏幕后面使用虚拟化概念,这意味着它只有较少的实际行数(可视元素)基于SfDataGrid高度(视图端口高度)和行的位置将根据滚动位置而改变。这就是为什么它无论itemsource集合大小都具有出色的滚动和加载性能。但是当您将SfDataGrid放在scrollview中时,基本上,scrollview将测量SfDataGrid并根据内容大小(ItemSource集合大小)设置其高度,这将破坏虚拟化并导致基于itemsource集合大小创建所有行元素。
如果希望在滚动视图中使用SfDataGrid,请使用HeightRequest属性为SfDataGrid分配所需的高度。
希望这能澄清你的疑虑。
P.S:SfDataGrid前团队负责人