Xamarin Forms - ScrollView Как проверить, прокручиваете ли вы до конца - PullRequest
0 голосов
/ 20 января 2020
private void scrollView_Scrolled(object sender, ScrolledEventArgs e) {
    OnScroll(e.ScrollY);
    var CurrentHeight = scrollView.Bounds.Height + scrollView.ScrollY + scrollView.Padding.VerticalThickness;
    var ContentHeight = scrollView.ContentSize.Height;

    Debug.WriteLine("计算当前高度:" + CurrentHeight + "|" + "内容区域总高度:" + ContentHeight + "|" + "滚动条Y:" + e.ScrollY + "|" + "当前可视区域高度:" + scrollView.Bounds.Height);

    if (scrollView.Height == e.ScrollY) {

    }
    OnScrollEnd();
}

Я хочу проверить, прокручивается ли он до конца, но результаты кода меня не устраивают CurrentHeight(2716.38095238095)!=ContentHeight(2717.2380952381)

Хотя они близки, но не одинаковы, почему?

<?xml version="1.0" encoding="utf-8" ?>
<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             xmlns:d="http://xamarin.com/schemas/2014/forms/design"
             xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
             mc:Ignorable="d"
             x:Class="BookApp.Views.ChapterPageDetail"
             Title="{Binding Name}">


    <ScrollView x:Name="scrollView" Padding="0" Scrolled="scrollView_Scrolled" >
        <StackLayout x:Name="stackLayout" Padding="10">
            <Label Text="{Binding Content}" TextColor="#070707"/>
            <Button Text="Next chapter" Clicked="Button_Clicked"></Button>
            <StackLayout.GestureRecognizers>
                <SwipeGestureRecognizer Direction="Left" Swiped="OnSwipedLeft"/>
                <SwipeGestureRecognizer Direction="Right" Swiped="OnSwipedRight"/>
            </StackLayout.GestureRecognizers>
        </StackLayout>
    </ScrollView>
</ContentPage>

1 Ответ

0 голосов
/ 20 января 2020

Это отлично работает для меня, оба значения совпадают в конце прокрутки:

 private void ScrollView_OnScrolled(object sender, ScrolledEventArgs e)
        {
            var scrollView = sender as ScrollView;
            try
            {
                var contentSize = scrollView.ContentSize.Height;
                var contentSizeCheck = ((View) scrollView.Children[0]).Height; //for fun

                var maxPos = contentSize - scrollView.Height;

                Debug.WriteLine($"Scrolled to pos {e.ScrollY}, max: {maxPos}");
            }
            catch
            {

            }
        }

Также не уверен, что на вас что-то влияет следующее, но учтите, что на iOS есть некоторые ошибка, из-за которой ScrollView стремится установить свою позицию иногда на отрицательное значение, это можно исправить с помощью средства визуализации в

protected override void OnElementChanged(VisualElementChangedEventArgs e)

, установив симпатичное ((ScrollView)e.NewElement).SetScrolledPosition(0, 0);, это отключит подпрыгивая хотя ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...