0

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

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

4

3 回答 3

2

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

它很粗糙,但它会起作用。它也会对电池产生负面影响。你被警告了。

对于其他替代方案,请参阅在 Windows Phone 中重置空闲检测倒计时

于 2014-06-02T12:38:31.150 回答
1

您的案例听起来像是响应式扩展的不错选择

以下示例使用 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);
                    }
                }
        );
于 2014-06-02T15:07:05.413 回答
0

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

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 秒)的计时器,并在计时器第一次过去后将其处理掉。

希望这可以帮助

于 2014-06-02T13:15:07.743 回答