【发布时间】:2014-05-20 16:05:39
【问题描述】:
我有要求在用户开始输入时关闭某个功能,这很简单。当用户停止输入时,我想重新打开该功能。
如果没有响应式扩展,可以简单地使用timer 实现此功能,该功能将每次最后一次击键 时的计时器重置为1 second,并且当user stops typing and timer elapses 开启功能时重新开始。
我可以调用任何方法来达到与Reactive Extensions相同的效果吗?
Throttle 或Timeout 每隔1 second 就会不断调用订阅者/异常操作
更新
XAML
<RichTextBox MaxHeight="1000" VerticalScrollBarVisibility="Visible" x:Name="meh"/>
扩展类
public static IObservable<EventArgs> ObserveTextChanged(this RichTextBox rtb)
{
return Observable.FromEventPattern<TextChangedEventHandler, EventArgs>(
h => rtb.TextChanged += h,
h => rtb.TextChanged -= h)
.Select(ep => ep.EventArgs);
}
类,其中meh 是RichTextBox
public class MainWindow()
{
//Change this to be the keypress/propertychagned event. The type T doesn't matter we ignore it
var typing = meh.ObserveTextChanged().Take(4);
var silence = meh.ObserveTextChanged().IgnoreElements();
var source = typing.Concat(silence).Concat(typing);
var disableSpellcheck = source.Select(_ => false);
var enableSpellcheck = source.Select(_ => Observable.Timer(TimeSpan.FromSeconds(1)))
.Switch()
.Select(_ => true);
disableSpellcheck.Merge(enableSpellcheck)
.DistinctUntilChanged()
.Subscribe(SetFlag);
}
// Define other methods and classes here
public void SetFlag(bool flag)
{
Dispatcher.Invoke(new Action(() => SpellCheck.SetIsEnabled(meh, flag)));
Debug.Write("flag");
}
【问题讨论】:
标签: c# system.reactive reactive-programming