我的场景。我的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秒),并在第一次结束后清除计时器。
希望能有所帮助