Xamarin Forms - ScrollView - ScrollToAsync 到底部未按预期工作
Xamarin Forms - ScrollView - ScrollToAsync to bottom not working as expected
我有一个屏幕,它使用堆栈布局和滚动视图显示评论列表。用户可以再添加一条评论,然后单击“提交”将在 Xamarin Forms - Android 和 iOS 应用程序的滚动视图末尾再添加一条评论。要求是向上滚动此列表以显示最新的显示评论元素。为此,我使用了下面的代码行,但它不会向上滚动到最后一个元素,而是倒数第二个元素。我在 IOS 和 Android 中都观察到了它。
await scrollView.ScrollToAsync(stkMain, ScrollToPosition.End, true);
下图会提供更多信息。
如图所示,stack Layout 3 在屏幕上不可见,尽管我使用上面的代码滚动到最后。我必须向上滚动滚动视图才能看到堆栈布局 3。
预期行为 - 滚动视图应滚动到完成屏幕上显示的最后一个元素。如果我做的不对,请提出建议。
我忘记提及的一件事是,当我在调试模式下在具有 scrolToAsync 方法的行上创建点时。断点击中那条线,如果我击中 F5 将使最后一个元素可见。我很惊讶看到它,但它发生了
请记住,呈现方法通常是异步的,并且隐藏的代码可以 运行 在呈现屏幕上的元素可用之前 。我知道这不是最好的解决方案,但有时我曾经在 运行 任何视觉交互之前强制延迟 300 毫秒。
尝试在添加新的评论元素后稍等片刻(例如 100 或 200 毫秒),然后尝试滚动到 stkMain
的最后一个子元素。
像这样:
// Here goes your logic to add the new comment
await Task.Delay(100);
var lastChild = stkMain.Children.LastOrDefault();
if(lastChild != null)
scrollView.ScrollToAsync(lastChild, ScrollToPosition.MakeVisible, true);
如果你只想滚动到底部试试
Device.BeginInvokeOnMainThread(async () =>
{
// Update your children here, add more or remove.
// todo
if (Device.RuntimePlatform == Device.Android)
{
await scrollView.ScrollToAsync(0, stkMain.Height, true);
}
else
{
await Task.Delay(10); //UI will be updated by Xamarin
await scrollView.ScrollToAsync(stkMain, ScrollToPosition.End, true);
}
});
我有一个屏幕,它使用堆栈布局和滚动视图显示评论列表。用户可以再添加一条评论,然后单击“提交”将在 Xamarin Forms - Android 和 iOS 应用程序的滚动视图末尾再添加一条评论。要求是向上滚动此列表以显示最新的显示评论元素。为此,我使用了下面的代码行,但它不会向上滚动到最后一个元素,而是倒数第二个元素。我在 IOS 和 Android 中都观察到了它。
await scrollView.ScrollToAsync(stkMain, ScrollToPosition.End, true);
下图会提供更多信息。
如图所示,stack Layout 3 在屏幕上不可见,尽管我使用上面的代码滚动到最后。我必须向上滚动滚动视图才能看到堆栈布局 3。
预期行为 - 滚动视图应滚动到完成屏幕上显示的最后一个元素。如果我做的不对,请提出建议。
我忘记提及的一件事是,当我在调试模式下在具有 scrolToAsync 方法的行上创建点时。断点击中那条线,如果我击中 F5 将使最后一个元素可见。我很惊讶看到它,但它发生了
请记住,呈现方法通常是异步的,并且隐藏的代码可以 运行 在呈现屏幕上的元素可用之前 。我知道这不是最好的解决方案,但有时我曾经在 运行 任何视觉交互之前强制延迟 300 毫秒。
尝试在添加新的评论元素后稍等片刻(例如 100 或 200 毫秒),然后尝试滚动到 stkMain
的最后一个子元素。
像这样:
// Here goes your logic to add the new comment
await Task.Delay(100);
var lastChild = stkMain.Children.LastOrDefault();
if(lastChild != null)
scrollView.ScrollToAsync(lastChild, ScrollToPosition.MakeVisible, true);
如果你只想滚动到底部试试
Device.BeginInvokeOnMainThread(async () =>
{
// Update your children here, add more or remove.
// todo
if (Device.RuntimePlatform == Device.Android)
{
await scrollView.ScrollToAsync(0, stkMain.Height, true);
}
else
{
await Task.Delay(10); //UI will be updated by Xamarin
await scrollView.ScrollToAsync(stkMain, ScrollToPosition.End, true);
}
});