如何将TableView滚动到顶部

时间:2018-04-12 01:06:12

标签: xamarin xamarin.forms

这似乎应该很简单,但TableView上没有ScrollTo方法,就像ListView一样。

如何将TableView滚动到顶部?

1 个答案:

答案 0 :(得分:2)

表单'TableView的设计不像滚动视图那样,即使它们是使用可滚动容器本地实现的。

虽然自定义渲染器是我首选的,因为效果开销而公开滚动功能,但使用PlatformEffect的快速MessagingCenter黑客将作为演示工作:

在Android上,表单'TableView使用Android.Widget.ListView作为其顶级容器,因此可以使用ListView.SmoothScrollToPosition

Android PlatformEffect(使用MessagingCenter)

public class ScrollTopEffect : PlatformEffect
{
    void ScrollToTop(TableView obj)
    {
        (Control as AListView).SmoothScrollToPosition(0);
    }

    protected override void OnAttached()
    {
        if (Element is TableView)
            MessagingCenter.Subscribe<TableView>(Element as TableView, "ScrollTop", ScrollToTop);
        else
            throw new Exception("ScrollTopEffect must be used on a TableView (Android.Widget.ListView)");
    }

    protected override void OnDetached()
    {
        MessagingCenter.Unsubscribe<TableView>(Element as TableView, "ScrollTop");
    }
}

Xamarin.Forms用法:

MessagingCenter.Send<TableView>(tableView, "ScrollTop");

注意:实例tableView var必须是您希望滚动到顶部的实例。

在iOS上,Forms使用UITableView作为TableView的顶级容器,因此您可以使用`UITableView.SetContentOffset``滚动到顶部。

iOS PlatformEffect(使用MessagingCenter)

public class ScrollTopEffect : PlatformEffect
{
    void ScrollToTop(TableView obj)
    {
        (Control as UITableView).SetContentOffset(CGPoint.Empty, true);
    }

    protected override void OnAttached()
    {
        if (Element is TableView)
            MessagingCenter.Subscribe<TableView>(Element as TableView, "ScrollTop", ScrollToTop);
        else
            throw new Exception("ScrollTopEffect must be used on a TableView (UIkit.UITableView)");
    }

    protected override void OnDetached()
    {
        MessagingCenter.Unsubscribe<TableView>(Element as TableView, "ScrollTop");
    }
}