Xamarin的形式通过点击标签页顶栏滚动的ListView这是一个标签页内的顶部

问题描述:

现状Xamarin的形式通过点击标签页顶栏滚动的ListView这是一个标签页内的顶部

我已经做了xamarin形式的跨平台应用程序,它有一个标签页与无限滚动的ListView 。 每当最后一个项目出现时,listView都会以10个项目的增量填充。

的正常行为

通常,当我们轻点选项卡页面的最上面一栏的第一次(如果我们没有在那一刻查看选项卡)(包含标签页的标题栏),该应用程序将切换到查看该页面。这很好。

当我们点击第二次顶栏(攻的当前浏览标签页面的最上面一栏时),没有任何反应(不像Twitter的,U可以点击滚动到顶部)

我的问题

我希望能够让listView在顶部栏被点击时(例如twitter在其android应用程序中的做法)滚动回顶部(到列表中的第一个项目),同时仍然保持所有已经加载了我的listView中的项目。

关于如何使顶部栏响应水龙头滚动listView返回顶部的任何想法?

的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方法来滚动到顶部。

你应该尝试这样滚动起来

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

我希望这可以帮助您

+0

谢谢,这有些帮助,我主要关心的是如何让顶栏执行该代码时,单击它。我不知道哪个事件或哪里实现你的代码行,(我对Xamarin Forms还是很新的)。试图搜索整个互联网,但没有运气与这种特殊情况。 –

+0

如果您使用的是代码,您需要将该代码片段插入到您的事件处理程序中。如果你使用MVVM,我会建议使用命令来绑定它。您可以创建工具栏按钮,以便当用户单击“向上滚动”按钮时,该列表视图滚动位置将被触发。我希望它能帮助你 –