在WP8应用程序中,当用户在几秒钟内什么都不做(有点用户空闲模式)



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

在WP8中实现最好的、不消耗资源的方式是什么?也许,这个平台为我们提供了一个有用的服务?

我认为这样的应用程序会被它的用户所厌恶。但如果你必须这样做,那么你只需要在每次你认为是应用中的"活动"发生时重置计时器。据推测,这将是某种形式的用户交互,如页面导航或交互/点击/编辑内容。

这是粗糙的,但它会工作。它也会对电池产生负面影响。我已经警告过你了。

其他替代方法请参见重置Windows Phone中的空闲检测倒计时

您的案例听起来像是响应式扩展的一个很好的候选

下面的例子使用一个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);
                    }
                }
        );

这是您的场景中的一个解决方案。注意,这只是传递我的解决方案的伪代码

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.
    }
}
在上面的伪代码

中,查询只在需要时执行。假设use在第一次执行时选中了4个物品。它将不会执行资源查询,因为前面的结果仍然未处理。一旦接收到结果,代码将查看用户是否更改了他的选择,如果选择更改,则再次执行查询。

第二部分

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

您需要在页面加载时实现计时器,无论您想要的时间是什么(1或2秒),并在第一次结束后清除计时器。

希望能有所帮助

最新更新