如何在Windows Phone 8中使用LongListSelector实现pull-to-refresh?

时间:2012-12-13 01:53:02

标签: windows-phone-8 longlistselector

我正在使用Microsoft.Phone.Controls程序集中附带的现成的LongListSelector编写一个新的WP8应用程序。任何人都可以提供一个实现pull-to-refresh的代码示例,最初受到Tweetie for iPhone的欢迎,现在在iOS和Android上很常见吗?现有示例使用非标准控件,我想在WP8中继续使用LongListSelector。

修改

我在StackOverflow上找到了一个很好的答案,描述了Twitter示例以及如何更详细地执行此操作:

Continuous Pagination with LongListSelector

6 个答案:

答案 0 :(得分:6)

你没有。

Pull-to-refresh不是标准的Windows Phone交互,因此您不应该实现它。

没有本机/第一方Windows Phone应用程序使用此功能,几乎没有第三方应用程序可以使用此功能。这是有原因的。

要刷新页面内容(或在您的情况下为LongListSelector),您应该使用刷新 ApplicationBacIconButton,就像在Mail应用中一样。这是管理刷新的标准和首选方式。

Windows Phone Android,也不是iOS。在为其设计应用程序时请记住这一点。

它不是动物园,有规则。

答案 1 :(得分:6)

实际上,我刚刚发现一个项目于2012年11月30日上传到Windows Phone开发中心,该项目使用Twitter搜索和Windows Phone 8 LongListSelector实现“无限滚动”。

http://code.msdn.microsoft.com/wpapps/TwitterSearch-Windows-b7fc4e5e

下载此项目

答案 2 :(得分:2)

如果你真的必须这样做(见Miguel Rochefort的回答),可以在http://blogs.msdn.com/b/jasongin/archive/2011/04/13/pull-down-to-refresh-a-wp7-listbox-or-scrollviewer.aspx找到详细信息

基本上,ScrollViewer具有隐藏/未记录状态,允许检测列表顶部或底部的“压缩”,您可以使用它来触发加载。

答案 3 :(得分:2)

这并非完全无足轻重,但一种方法是使用GestureService

        this.gestureListener = GestureService.GetGestureListener(containerPage);
        this.gestureListener.DragStarted += gestureListener_DragStarted;
        this.gestureListener.DragCompleted += gestureListener_DragCompleted;
        this.gestureListener.DragDelta += gestureListener_DragDelta;

然而,它有一些错误。例如,DragCompleted并不总是被引发,所以你需要使用ManipulationCompleted事件仔细检查它,这似乎更可靠。

        containerPage.ManipulationStarted += delegate { this.manipulationInProgress = true; };
        containerPage.ManipulationCompleted += delegate
        { 
            this.manipulationInProgress = false;
            PerformDragComplete(); 
        };

另一个问题是DragDelta偶尔会报告错误的坐标。所以你需要这样的修复:

    Point refPosition = e.GetPosition(null);
    if (refPosition.X == 0 && refPosition.Y == 0)
    {
        Tracer.WriteLine("Skipping buggy event");
        return;
    }

最后,您可以找到列表是否一直位于顶部:

public double VerticalOffset
{
    get
    {
        ViewportControl viewportControl = this.FindChildByName("ViewportControl") as ViewportControl;
        if (viewportControl != null)
        {
            Tracer.WriteLine("ViewPort.Bounds.Top=" + viewportControl.Bounds.Top +  " ViewPort.Top=" + viewportControl.Viewport.Top.ToString() + " State=" + this.ManipulationState);
            return viewportControl.Bounds.Top - viewportControl.Viewport.Top;
        }
        return double.NaN;
    }
}

答案 4 :(得分:-1)

您可以查看样品 https://github.com/Kinnara/WPToolkit 它有一个很好的实现,称为longllistselector控件的ListView扩展,它将真正帮助你。

并记住使用longlistselector总是尝试至少加载20个项目。 =)

答案 5 :(得分:-2)

由于WP8 LLS不使用滚动查看器,我猜你必须检查UI树以保持视口控件,看看你可以用ViewportControl.Viewport属性做什么......

哦...... twitter应用程序正在使用pull来刷新交互。我喜欢WP平台的UI指南,但是一旦掌握了规则就会被破坏;)

这篇文章here可以为您提供有关如何获取视口控件和检索滚动偏移的提示。当列表弹跳时,此滚动偏移量必须是特定值