代码之家  ›  专栏  ›  技术社区  ›  Ravi Kanasagra

Xamarin表单-ScrollView-ScrollToAsync到底部未按预期工作

  •  9
  • Ravi Kanasagra  · 技术社区  · 7 年前

    我有一个屏幕,它显示评论列表使用堆栈布局和滚动视图。用户可以再添加一条评论,单击“提交”将在Xamarin表单(Android和iOS应用程序)的滚动视图末尾添加一条评论。要求向上滚动此列表以显示最新的显示注释元素。为此,我使用了下面的代码行,但它不会向上滚动到最后一个元素,而是最后一个元素。我在IOS和Android上都观察到了这一点。

    await scrollView.ScrollToAsync(stkMain, ScrollToPosition.End, true);
    

    下面的图片将给出更多关于它的想法。

    enter image description here

    如图所示,堆栈布局3在屏幕上不可见,尽管我使用了上述代码滚动到最后。我必须向上滚动滚动视图才能看到堆栈布局3。

    预期行为-滚动视图应滚动到屏幕上显示的完成最后一个元素。如果我做得不对,请提出建议。

    我忘了提及的一件事是,当我在调试模式下使用scrolToAsync方法在第行创建点时。断点碰到了那个条线,若我碰到F5,就会使最后一个元素可见。我很惊讶看到它,但它确实发生了

    2 回复  |  直到 7 年前
        1
  •  17
  •   Diego Rafael Souza    2 年前

    请记住,渲染方法通常是异步的,并且后面的代码可以运行 在元素在渲染屏幕上可用之前 . 我知道这不是最好的解决方案,但有时我会在运行任何视觉交互之前强制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);
    
        2
  •  12
  •   Nick Kovalsky    6 年前

            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);
                }
    
            });