在Android上运行时,我一直遇到使用ScrollView的ScrollToAsync功能的问题,尚未在iOS上测试过。 我正在使用.Net Standard的Xamarin.Forms版本2.5.1.444934 在Android模拟器(8.0,API26)和Google Pixel(8.1 API27)上进行测试都存在同样的问题。
我使用NavigationPage和Navigation.PushAsync在页面之间移动(因此每页都有导航栏)。
我想创建一个自动填充字段控件,用户输入前几个字母,然后在数据库/静态字符串列表中查找结果,并显示以下结果,供用户单击/点击。 我使用复合控件(下面标记的帧的内容)。 我遇到的问题是滚动视图以显示结果。
我的页面有这种布局层次结构: -
ContentPage
StackLayout
ScrollView
StackLayout
Frame (some label and entry fields inside a stack layout)
Frame (some label and entry fields inside a stack layout)
Frame (some label and entry fields inside a stack layout)
Frame (the interesting one that deals with scrolling)
StackLayout
Heading Label
StackLayout
Label x:Name="ScrollToLabel"
Entry x:Name="ScrollToEntry"
Grid x:Name="ScrollToGrid"
Entry x:Name="Hidden" Text="I should stay visible as you type"
/StackLayout
/StackLayout
/Frame
Frame (some label and entry fields inside a stack layout)
Frame (some label and entry fields inside a stack layout)
/StackLayout
/ScrollView
StackLayout
Button Text = Done
/StackLayout
/StackLayout
/ContentPage
当用户点击/点击ScrollToEntry时,键盘会打开并将控件平移到键盘上方(确定到目前为止)。 当用户开始键入ScrollToEntry时,代码将使用最多5个结果填充ScrollToGrid。 此时,我想确保网格结果可供用户点击。 我尝试了两种不同的选项,ScrollToAsync(ScrollToLabel,Start)和ScrollToAsync(隐藏,MakeVisible)。
在100%的时间里都没有像我想的那样工作。
ScrollToAsync(ScrollToLabel, Start)
如果ScrollToEntry位于屏幕底部,则隐藏导航栏并且视图平移得太远。 ScrollToLabel现在不在屏幕顶部。 单击/点击第二个字母时,将恢复导航栏并滚动滚动,ScrollToLabel位于屏幕顶部。 如果ScrollToEntry位于屏幕顶部附近,则导航栏不会被隐藏,而且会正确滚动。
ScrollToAsync(Hidden, MakeVisible)
这是我的首选选项,因为它只会根据需要滚动显示所有结果(不是一直到顶部)。 这比第一个更糟糕。 在大多数情况下,它根本不滚动,我认为它认为它已经可见但实际上是在键盘后面? 如果它滚动,标签Hidden仍然不显示(我使用HeightRequest =“0”版本和可见版本进行了测试,结果相同)。
我尝试使用以下代码将adjust更改为调整大小。
Application.Current.On<Xamarin.Forms.PlatformConfiguration.Android>().UseWindowSoftInputModeAdjust(WindowSoftInputModeAdjust.Resize);
2个问题, 1.因为它调整大小,完成按钮现在位于键盘上方,占用空间。 2.单击硬件后退按钮(不是完成或导航后退按钮)时,前一个视图现在有一个键盘所在的空白区域。 如果使用完成或导航返回,屏幕最初会显示空白区域,但随后会刷新到全屏。
我创建了一个示例应用程序,突出显示问题(默认情况下使用pan,而不是调整大小)。 这是我正在使用的布局中最简单的版本......
我做错了什么或者这是怎么回事?如果它的工作原理,那一定是个bug?如果我做错了,有人可以告诉我什么或建议采用不同的做法吗?