首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RX AutoCompleteBox

RX AutoCompleteBox
EN

Stack Overflow用户
提问于 2011-03-26 06:06:56
回答 4查看 2.1K关注 0票数 4

我正在尝试构建一个使用RX和WPF的过滤器控件。所以我有一个文本框和一个列表框。在启动时,列表框有100个联系人姓名,用户可以输入一个姓名来过滤列表。

问题是我如何构建一个文本流(键输入),然后发布。这应该是时间敏感的,所以我猜只有在750毫秒之后,如果没有检测到按键输入,那么可能会执行过滤。

谢谢

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-03-26 06:30:17

基本轮廓如下所示

  1. textbox keydown事件转换为IO
  2. 节流击键,这样我们就不会在用户实际键入
  3. 时进行搜索
  4. 将搜索结果放到列表框中

<代码>G29

下面是一些伪代码-

代码语言:javascript
复制
 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中尝试一下。

代码语言:javascript
复制
   Observable.Interval(TimeSpan.FromMilliseconds(10))
   .Do(ii =>  "keystroke".Dump())
   .Take(10)
   .Throttle(TimeSpan.FromSeconds(0.750))
   .Select(ttl => "search")
票数 7
EN

Stack Overflow用户

发布于 2011-03-26 11:50:57

斯科特·温斯坦的建议是正确的。

此外,由于您希望影响Gui控件,因此必须确保在订阅之前对调度程序执行ObserveOn操作或使用某个地方的调度程序,才能返回到调度程序线程。

这对我很有效:

代码语言:javascript
复制
 Observable.FromEvent<TextChangedEventArgs>(TextBox, "TextChanged")
                .Throttle(TimeSpan.FromSeconds(0.75), Scheduler.Dispatcher)
                .Select(obs => TextBox.Text)
                .Subscribe(TextChangedTo);

现在,在TextChangedTo(text)方法中,您将使用联系人姓名填充您的列表。

票数 2
EN

Stack Overflow用户

发布于 2013-04-15 18:25:00

在新版本的Rx上,Scheduler.Dispatcher消失了,FromEvent似乎不能很好地与WPF一起工作,所以,对于今天需要解决方案的人,这里有一个名为FilterText的文本框的有效解决方案:

代码语言:javascript
复制
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));
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/5438639

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档