如何检测xamarin表单中的列表视图滚动方向

时间:2017-05-17 05:56:03

标签: xamarin.forms

我试图检测列表视图的滚动方向。我的要求是需要在列表视图向上滚动和向下滚动时实现不同的功能。请建议检测列表视图滚动方向的任何想法。我在列表视图中尝试过以下语法。

示例代码:

 <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>

3 个答案:

答案 0 :(得分:2)

我认为默认情况下你不能这样做,你只能对出现或消失的项目采取行动。因此,您需要通过创建一些获取(dis)出现项目索引的代码并查看索引是否越来越高来确定是否有人向上或向下滚动。或者你需要连接一个自定义渲染器,但我不确定本机控件是否有任何东西可以检测到它。

我为你准备了一个非常基本的例子,你可以找到full code here

基本上挂钩可用事件,跟踪类变量中的最后一个索引,并将其与出现的项目的当前索引进行比较。

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中显示它,但当然您可以创建一些枚举来返回或触发事件或其他东西,以使代码更可重用。以下是行动中的代码:

Sample on iOS Simulator

答案 1 :(得分:0)

根据这篇文章,此方法略有不同,以处理淡入和淡出。

Xamarin.Forms ListView向上/向下滚动检测

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

答案 2 :(得分:0)

最近遇到了此问题,并通过以下方式解决了该问题:

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


    }