如何在Xamarin.Forms中基于ListView滚动方向显示和隐藏StackLayout?

时间:2019-01-09 17:33:43

标签: c# xamarin xamarin.forms

我有一个带有ListView的屏幕,其中显示了评论集合。另外,我有一个StackLayoutListView的末尾重叠,后者有一个Entry和一个Button以添加新的注释。

我想根据StackLayout的滚动方向来隐藏/显示此ListView

  • 如果用户向下滚动->隐藏StackLayout
  • 如果用户向上滚动->显示StackLayout

有人知道一种实现这种行为的方法吗?

谢谢!

1 个答案:

答案 0 :(得分:4)

Xamarin.Forms ListView提供了一个您可以订阅的OnItemAppearing事件。通过此操作,您可以通过找到出现的项目的索引并将其与出现的最后一项进行比较来跟踪滚动方向。尝试这样的事情:

public partial class MainPage : ContentPage
{
    public ObservableCollection<MyItemType> Items { get; set; } = new ObservableCollection<MyItemType>();
    int lastItemIndex;
    int currentItemIndex;

    public MainPage()
    {
        ...
        listView.ItemAppearing += ListView_ItemAppearing;
    }

    void ListView_ItemAppearing(object sender, ItemVisibilityEventArgs e)
    {
        MyItemType item = e.Item as MyItemType;

        currentItemIndex = Items.IndexOf(item);
        if (currentItemIndex > lastItemIndex)
        {
            stackLayout.IsVisible = false;
        }
        else
        {
            stackLayout.IsVisible = true;
        }
        lastItemIndex = currentItemIndex;
    }
}

编辑:闪烁实际上是由于ListView的显示和隐藏时StackLayout的大小已被调整,因此请确保ListView的大小不会被调整。也许将ListView和StackLayout放置在网格中,以便在显示和隐藏StackLayoutListView不会被调整大小,例如:

<Grid>
    <Grid.RowDefinitions>
        <RowDefinition Height="*" />
        <RowDefinition Height="35" />
    </Grid.RowDefinitions>
    <ListView x:Name="listView"
              ItemsSource="{Binding Items}" 
              Grid.Row="0">
        <ListView.ItemTemplate>
            ...
        </ListView.ItemTemplate>
    </ListView>
    <StackLayout x:Name="stackLayout"
                 Grid.Row="1">
        ...
    </StackLayout>
</Grid>

使用上述方法,不再发生闪烁。