通过点击选项卡式页面顶部栏,Xamarin 表单滚动到选项卡式页面内的 listView 顶部

Xamarin forms scroll to top of listView which is inside a tabbed page by tapping Tabbed Page Top Bar

现状

我制作了一个 xamarin forms cross-platform 应用程序,它有一个带有无限滚动列表视图的选项卡式页面。 每当最后一项出现时,listView 就会以 10 项为增量进行填充。

正常行为

通常当我们第一次点击标签页的顶部栏(包含标签页标题的栏)时(如果我们当时没有查看标签),应用程序会切换到查看该页面.哪个好。

当我们第二次点击顶部栏时(当点击当前查看标签页的顶部栏时),没有任何反应(不像 twitter,你可以点击滚动到顶部)

我的问题

我希望能够在点击顶部栏时使 listView 滚动回顶部(列表中的第一个项目)(类似于 Twitter 在其 android 应用程序中的做法)同时仍然在我的 listView 中维护所有已加载的项目。

知道如何使顶部栏对点击做出反应以将 listView 滚动回顶部吗?

你应该尝试像这样向上滚动

ListViewName.ScrollTo(yourobject,ScrollToPosition.Start, true);
// true means boolean for animated.

希望对你有所帮助

TabbedPage 公开了一个 CurrentPageChanged 事件(或者您可以覆盖 OnCurrentPageChanged),该事件仅在所选选项卡更改时触发,因此如果您希望在用户更改选项卡时滚动,则需要订阅该事件。好像没这个必要,不过以防万一...

Xamarin.Forms 没有在第二次选择已选择的选项卡时触发的内置事件。不过,您可以通过对 Xamarin 的 TabbedPage 渲染器进行子类化来使用自定义渲染器实现这一点。我写了 here and have a working Xamarin.Forms solution for iOS, Android, and UWP here.

你没有提到平台,所以假设你想要 iOS 和 Android,核心位在下面。

iOS 自定义渲染器

public class MainTabPageRenderer : TabbedRenderer
{
    private UIKit.UITabBarItem _prevItem;

    public override void ViewDidAppear(bool animated)
    {
        base.ViewDidAppear(animated);

        if (SelectedIndex < TabBar.Items.Length)
            _prevItem = TabBar.Items[SelectedIndex];
    }

    public override void ItemSelected(UIKit.UITabBar tabbar,
                                      UIKit.UITabBarItem item)
    {
        if (_prevItem == item && Element is MainPage)
        {
            // the same tab was selected a second time, so do something
        }
        _prevItem = item;
    }
}

Android 自定义渲染器

public class MainTabPageRenderer : TabbedPageRenderer, TabLayout.IOnTabSelectedListener
{
    void TabLayout.IOnTabSelectedListener.OnTabReselected(TabLayout.Tab tab)
    {
        if (Element is MainPage)
        {
            // the same tab was selected a second time, so do something
        }
    }
}

捕获该事件后,使用 ListView.ScrollTo 方法滚动到顶部。