【问题标题】:Doing something in WP8 app when user does nothing for some seconds (kinda user idle mode)当用户在几秒钟内什么都不做时在 WP8 应用程序中做某事(有点用户空闲模式)
【发布时间】:2014-07-22 13:26:07
【问题描述】:

我的场景。我的 WP8 Silverlight 应用程序的一个页面包含一个具有项目多选功能的 ListBox 控件。当用户点击一个项目以切换其选择状态时,我应该对当时选择的所有项目执行长时间操作(例如,运行查询以按当前选择的项目进行过滤)。用户可以非常快速地点击某些项目,无需每次点击后都运行查询(特别是考虑到查询可能需要 1-2 秒)。如果用户在 1 或 2 秒内什么也没说,我需要运行查询。

在 WP8 中实现的最佳方式是什么,而不是消耗资源?或许,平台为此提供了有用的服务?

【问题讨论】:

    标签: silverlight windows-phone-8 listbox idle-processing


    【解决方案1】:

    您的案例听起来很适合Reactive Extensions

    以下示例使用ListBox选择更改事件的观察者,然后等待1.5秒,直到报告观察:

    var itemsChanged = (from evt in Observable.FromEventPattern<SelectionChangedEventArgs>(MyList, "SelectionChanged")
                        select MyList.SelectedItems)
                       .Throttle(TimeSpan.FromSeconds(1.5));
    
    itemsChanged.ObserveOnDispatcher()
                .Subscribe(items =>
                    {
                        Debug.WriteLine("----------------");
                        foreach (var item in items)
                        {
                            Debug.WriteLine(item);
                        }
                    }
            );
    

    【讨论】:

      【解决方案2】:

      这是您方案中的一种解决方案。请注意,这只是传达我的解决方案的伪代码

      private bool isLoadingData = false;
      private bool newQueryQueued = false;
      
      ///code in your itemselectionchanged event handler
      if(isLoadingData)
      {
          newQueryQueued = true;
          //Do not execute your query.
      
      }
      else
      {
          //Execute your query and get the result.
          //after the query result is completed, execute the following code.
          isLoadingData = false;
          if(newQueryQueued)
          {
              isLoadingData = true;
              newQueryQueued = false;
              //Execute your query and get the result.
          }
      }
      

      在上面的伪代码中,查询仅在需要时执行。说如果使用在第一次执行期间点击了 4 个项目。它不会执行资源查询,因为之前的结果仍在等待中。一旦收到结果,代码将查看用户是否更改了他的选择,如果选择更改,则再次执行查询。

      第二部分

      如果用户在 1 或 2 秒内什么都没说,我需要运行查询。

      您需要在页面加载时实现您想要的任何时间(1 或 2 秒)的计时器,并在计时器第一次过去后将其处理掉。

      希望对你有帮助

      【讨论】:

        【解决方案3】:

        我希望应用程序的行为方式会受到用户的厌恶。但是,如果您必须,那么您只需在每次您认为应用程序中的“活动”发生时重置一个计时器。大概这将是某种形式的用户交互,例如页面导航或交互/点击/编辑内容。

        它很粗糙,但它会起作用。它也会对电池产生负面影响。您已收到警告。

        有关其他选择,请参阅Resetting Idle Detection Countdown in Windows Phone

        【讨论】:

        • 被谁警告过? MS 工作人员检查我们提交的应用程序?如果在平台没有为我们提供其他原生服务的情况下,这是完成我们需要的唯一方法,为什么使用计时器是个坏主意?
        • 看来,DispatcherTimer 很好地解决了我的任务!但是,我想应该将类似的东西合并到 WP OS 基础架构中,这样我们就可以在不创建额外计时器的情况下使用它(也许像 WinAPI 中的 WM_ENTERIDLE 之类的东西)。
        • @TecMan 我必须同意答案和警告(+1)。我不确定这对手机来说是否是好的用户体验(但我不是用户体验专家,所以我可能是错的)。当用户在完成选择后按下按钮时,您不能只执行一次查询(只是一个想法)?
        • @yasen,我的用户对我实现的功能非常满意。按下特殊的“运行查询”按钮会使界面复杂化,并导致用户在需要时进行更多点击。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-03-24
        • 2012-11-20
        • 1970-01-01
        • 1970-01-01
        • 2013-04-17
        相关资源
        最近更新 更多