【问题标题】:How does one implement pull-to-refresh with a LongListSelector in Windows Phone 8?如何在 Windows Phone 8 中使用 LongListSelector 实现下拉刷新?
【发布时间】:2013-11-30 06:53:15
【问题描述】:

我正在使用 Microsoft.Phone.Controls 程序集中提供的现成 LongListSelector 编写一个新的 WP8 应用程序。谁能提供一个实现pull-to-refresh的代码示例,最初由Tweetie for iPhone流行,现在在iOS和Android上很常见?现有示例使用非标准控件,我想在 WP8 中继续使用 LongListSelector。

编辑

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

Continuous Pagination with LongListSelector

【问题讨论】:

标签: windows-phone-8 longlistselector


【解决方案1】:

你没有。

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

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

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

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

不是动物园,是有规矩的。

【讨论】:

  • 好的,谢谢您的信息。 FWIW,这种行为最初并不是 iOS 或 Android 原生的,它是一种有用的手势,被发现并成为标准。由于 WP8 实现了动态滚动,因此它们似乎可以模仿。如果我的用户抱怨,只是为了确认,我应该告诉他们这是 a) 不标准还是 b) 既不标准也不可能?
  • 告诉 twitter 和 facebook windows phone 应用开发者
  • 你知道 Facebook Windows Phone 应用开发者是谁吗:微软。
  • 这不是动物园,但 ScrollViewer 有下拉效果...很好奇...此外,有趣的是,微软制作的 Facebook 应用程序带有下拉刷新功能。 .
【解决方案2】:

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

在以下地址下载此项目:http://code.msdn.microsoft.com/wpapps/TwitterSearch-Windows-b7fc4e5e

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

    • 我确实注意到了该代码,但不幸的是,它在底部指出“抱歉,它不能与 LongListSelector 一起使用——该控件在不使用 ScrollViewer 的情况下进行自定义滚动。”所以,我认为我不能使用它。
    【解决方案4】:

    这并不完全是微不足道的,但一种方法是使用 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;
        }
    }
    

    【讨论】:

      【解决方案5】:

      您可以在 https://github.com/Kinnara/WPToolkit 它有一个出色的实现,称为 longllistselector 控件的 ListView 扩展,这将真正帮助您。

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

      【讨论】:

        【解决方案6】:

        由于 WP8 LLS 不使用滚动查看器,我想您将不得不检查 UI 树以获取视口控件并查看您可以使用 ViewportControl.Viewport 属性做什么...

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

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

        【讨论】:

          猜你喜欢
          • 2013-09-24
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-03-11
          • 1970-01-01
          • 2014-01-29
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多