Xamarin表单滚动到listView的顶部,通过点击Tabbed Page Top Bar在选项卡页面内

时间:2017-10-05 07:20:22

标签: c# listview xamarin.forms tabbedpage

现状

我制作了一个xamarin表单跨平台应用程序,它有一个带有无限滚动listView的标签页。 每当最后一项出现时,listView将以10个项目的增量填充。

正常行为

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

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

我的问题

我希望能够让listView滚动到顶部(到列表中的第一个项目),当点击顶部栏时(类似于Twitter在其Android应用程序中的作用),同时仍然保持所有已经我的listView中加载了项目。

有关如何使顶部栏对水龙头做出反应以将listView滚动回顶部的想法吗?

2 个答案:

答案 0 :(得分:0)

你应该尝试这样的东西来向上滚动

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

我希望这可以帮到你

答案 1 :(得分:0)

TabbedPage公开了一个CurrentPageChanged事件(或者您可以覆盖OnCurrentPageChanged),该事件仅在所选选项卡发生更改时触发,因此如果您想在用户更改选项卡时滚动,则需要订阅该事件。看起来似乎并不需要,但以防万一...

Xamarin.Forms没有内置事件,当第二次选择已经选择的选项卡时会触发该事件。您可以通过子类化Xamarin的TabbedPage渲染器,使用自定义渲染器实现这一点。我写了here并为iOS,Android和UWP here提供了一个有效的Xamarin.Forms解决方案。

你没有提到这些平台,所以假设你想要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方法滚动到顶部。