在WP8中更快地输入TextBox控件

3
在我的WP8应用程序中,我使用了一个搜索方法,当TexBox中的文本发生变化时进行搜索。现在我需要修改这个搜索方法。当用户在TextBox中快速输入时,搜索应该仅在用户完成输入后执行。也就是说,搜索方法不应该为每个文本更改执行一次。这是否可能?请帮帮我。
2个回答

3
可以的。基本上你需要一个计时器 - 或者更确切地说,每个按键都需要一个计时器。
最简单的方法可能是:
每次用户按下一个键,就启动一个计时器。计时器应该记住此时已经输入的文本。 当计时器触发时,只有当当前文本与“计时器启动时的文本”相同时,才执行搜索操作。 这种方法的一个潜在缺点是,如果用户输入了“foo”,计时器启动了,用户输入了“d”,然后删除了那个“d”,接着计时器触发,它将执行搜索,尽管已经有过输入和删除的操作。如果您认为这是不可取的,可以使用一个计数器来代替 - 只需使用一个表示已输入按键数量的int型变量。当计时器启动时记住这个值,并在计时器触发时检查该值是否与之前相同即可。
或者,如果搜索是异步且廉价的,可以在每次按键时立即进行搜索...但是当您收到结果后,如果用户已经输入了新的内容,则要么完全忽略搜索,要么在本地筛选出仍然有效的结果。
(也可以使用一个单一的计时器来解决这个问题,使得当用户输入任何一个按键时,计时器要么启动,要么延迟触发。个人认为这样更复杂,但这取决于您。)

即使搜索是异步和廉价的,他们也不应该在每次按键时运行它,只是为了扔掉结果。最终结果与定时器方法相同(即仅显示输入的最后文本的结果),但我们在移动设备上,因此应该有点意识到不必要的工作、网络流量等问题。 - Joey
@Joey:不,最终结果并不相同——在“始终执行”方法中,结果会更快地显示出来。从打字到结果的延迟是“搜索时间”,而不是“计时器+搜索时间”。平衡各种权衡是很重要的。例如,在WiFi上,您可能决定采用更快的方法,但在蜂窝网络上使用更节省带宽的方法。 - Jon Skeet

0
你可以考虑使用Reactive extension库,它是一种异步通信方式,并提供了许多关于异步活动的抽象。它是基于推送的机制,即每当数据可用时,感兴趣的订阅者将被通知。它支持取消问题请求等。有关示例,请参见101 Rx

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接