【问题标题】:How to show and hide a StackLayout based on ListView scroll direction in Xamarin.Forms?如何在 Xamarin.Forms 中显示和隐藏基于 ListView 滚动方向的 StackLayout?
【发布时间】:2019-01-09 17:33:42
【问题描述】:

我有一个带有ListView 的屏幕,它显示了一组cmets。另外,我有一个StackLayoutListView 的末尾重叠,它有一个Entry 和一个Button 来添加新评论。

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

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

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

提前致谢!

【问题讨论】:

  • 您可以将 SwipeGestureRecognizer 添加到 ListView 的 GestureRecognizers 集合中。在识别器上指定方向,并处理识别器的 Swipe 事件。不过,我不确定这是否会干扰 ListView 的滚动行为。
  • 你试过 Flutter 吗?

标签: c# xamarin xamarin.forms


【解决方案1】:

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

编辑:闪烁实际上是由于 ListViewStackLayout 显示和隐藏时调整大小,因此请确保 ListView 没有调整大小。也许将 ListView 和 StackLayout 放在一个网格中,这样当您显示和隐藏 StackLayout 时,ListView 不会调整大小,例如:

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

有了上述,闪烁不再发生。

【讨论】:

  • 感谢您的回复!我已经尝试过这样的事情,但是当我向上滚动时,StackLayout 会重复且非常快速地显示和隐藏,从而为用户产生奇怪的行为。我在ifelse 中写了控制台消息,我意识到当我向上滚动时,ItemAppearing 事件会触发到屏幕上已经存在的元素。我不知道如何避免这种行为。
  • 最好将您使用的代码发布出来,看看我们是否能找出原因。当我测试上述内容时,我没有遇到这个问题。
  • 啊,其实我可以重现这个问题,但它只有在滚动非常慢时才会出现。向下滚动非常缓慢,我可能会连续两次看到相同的项目,但向上滚动是我看到更不正确的地方。对于出现的项目和从屏幕底部消失的项目(在 iOS 上测试),都会调用该方法。在 Android 上也会发生同样的情况,并且在为列表视图中的每个项目调用该方法时更为明显。我会提交一个错误并报告。
  • 这正是我所说的!谢谢。
  • 找到了一个希望对您有用的解决方法。编辑我的答案。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 2015-02-15
  • 2016-12-29
  • 2013-06-15
  • 1970-01-01
  • 2017-09-29
  • 1970-01-01
相关资源
最近更新 更多