我正在尝试构建一个使用RX和WPF的过滤器控件。所以我有一个文本框和一个列表框。在启动时,列表框有100个联系人姓名,用户可以输入一个姓名来过滤列表。
问题是我如何构建一个文本流(键输入),然后发布。这应该是时间敏感的,所以我猜只有在750毫秒之后,如果没有检测到按键输入,那么可能会执行过滤。
谢谢
发布于 2011-03-26 06:30:17
基本轮廓如下所示
<代码>G29
下面是一些伪代码-
var keysIO = Observable.FromEvent<KeyDownEventHandler, RoutedEventArgs>(
h => new KeyDownEventHandler(h),
h => btn.KeyDown += h,
h => btn.KeyDown -= h));
var searchResults = keysIO.Throttle(TimeSpan.FromSeconds(0.750),Scheduler.Dispatcher);
searchResults.Subscribe(sr => { lb.Clear(); lb.AddRange(sr); });@Andy,Throttle不会每隔750ms启动一次搜索,只有在用户停止输入750ms后才会启动搜索。在LinqPad中尝试一下。
Observable.Interval(TimeSpan.FromMilliseconds(10))
.Do(ii => "keystroke".Dump())
.Take(10)
.Throttle(TimeSpan.FromSeconds(0.750))
.Select(ttl => "search")发布于 2011-03-26 11:50:57
斯科特·温斯坦的建议是正确的。
此外,由于您希望影响Gui控件,因此必须确保在订阅之前对调度程序执行ObserveOn操作或使用某个地方的调度程序,才能返回到调度程序线程。
这对我很有效:
Observable.FromEvent<TextChangedEventArgs>(TextBox, "TextChanged")
.Throttle(TimeSpan.FromSeconds(0.75), Scheduler.Dispatcher)
.Select(obs => TextBox.Text)
.Subscribe(TextChangedTo);现在,在TextChangedTo(text)方法中,您将使用联系人姓名填充您的列表。
发布于 2013-04-15 18:25:00
在新版本的Rx上,Scheduler.Dispatcher消失了,FromEvent似乎不能很好地与WPF一起工作,所以,对于今天需要解决方案的人,这里有一个名为FilterText的文本框的有效解决方案:
Observable.FromEventPattern<TextChangedEventHandler, TextChangedEventArgs>(
h => this.FilterText.TextChanged += h,
h => this.FilterText.TextChanged -= h)
.Throttle(new TimeSpan(0, 0, 0, 0, 750))
.ObserveOnDispatcher()
.Subscribe(t => DoFiltering(this.FilterText.Text));https://stackoverflow.com/questions/5438639
复制相似问题