Как определить направление прокрутки в виде списка в формах xamarin

Я попытался определить направление прокрутки списка. Мое требование заключается в необходимости реализации различных функций при прокрутке списка вверх и вниз. Пожалуйста, предложите любую идею для определения направления прокрутки списка. Я попробовал ниже синтаксис в моем представлении списка.

Образец кода:

 <StackLayout>
    <Label x:Name="Direction" />
    <ListView ItemsSource="{Binding Items}" HasUnevenRows = "true" ItemAppearing="Handle_ItemAppearing" IsPullToRefreshEnabled = "true">
    <ListView.ItemTemplate>
            <DataTemplate>
                <ViewCell>
                    <StackLayout>
                    <Label Text = "{Binding}" />
                    </StackLayout>
                </ViewCell>
            </DataTemplate>
    </ListView.ItemTemplate>
        </ListView>
</StackLayout>

1 ответ

Решение

Я не думаю, что вы можете сделать это по умолчанию, вы можете действовать только на элемент, который появляется или исчезает. Итак, вам нужно либо поработать с этим, создав некоторый код, который получает индекс (не) появляющихся элементов, и посмотреть, становятся ли индексы выше или ниже, чтобы определить, прокручивается ли кто-то вверх или вниз. Или вам нужно подключить пользовательский рендерер, но я не уверен, что в нативных элементах управления есть что-то, чтобы это обнаружить.

Я привел очень простой пример для вас, вы можете найти полный код здесь.

По сути, подключитесь к доступному событию, отследите последний индекс в переменной класса и сравните его с текущим индексом отображаемого элемента.

private void Handle_ItemAppearing (object sender, Xamarin.Forms.ItemVisibilityEventArgs e)
{
    var currentIdx = Items.IndexOf ((string)e.Item);

    if (currentIdx > _lastItemAppearedIdx)
        Direction.Text = "Up";
    else
        Direction.Text = "Down";

    _lastItemAppearedIdx = Items.IndexOf ((string)e.Item);
}

В этом коде я просто показываю это в Label, но, конечно, вы можете создать некоторое перечисление для возврата или запуска события или что-то еще, чтобы сделать код более пригодным для повторного использования. Вот код в действии:

Пример на iOS Симуляторе

Этот подход немного отличается, основанный на этом посте, для обработки появления и исчезновения.

Xamarin.Forms ListView Прокрутка вверх / вниз Обнаружение

https://ianvink.wordpress.com/2019/03/06/xamarin-forms-listview-scrolling-up-down-detection

Недавно столкнулся с этой проблемой и исправил ее следующим образом:

<StackLayout>
<Label x:Name="Direction" />
<ListView ItemsSource="{Binding Items}" HasUnevenRows = "true" ItemAppearing="Handle_ItemAppearing" ItemDisappearing="Handle_ItemDisappearing" IsPullToRefreshEnabled = "true">
<ListView.ItemTemplate>
        <DataTemplate>
            <ViewCell>
                <StackLayout>
                <Label Text = "{Binding}" />
                </StackLayout>
            </ViewCell>
        </DataTemplate>
</ListView.ItemTemplate>
    </ListView>

    string ScrollingDirection;
    int visibleTabIndex;
    int disappearingTabIndex;

    public async void Handle_ItemAppearing(object sender, ItemVisibilityEventArgs e)
    {
        var visibleTab = e.Item;
        visibleTabIndex = MyItemsList.IndexOf(visibleTab);
        if (disappearingTabIndex > visibleTabIndex) ScrollingDirection = "DOWN";
        else ScrollingDirection = "UP";

    }

    public async void Handle_ItemDisappearing(object sender, ItemVisibilityEventArgs e)
    {
        var invisibleTab = e.Item as TicketsList;
        disappearingTabIndex = tvm.Tickets.IndexOf(invisibleTab);


    }
Другие вопросы по тегам