У меня есть требование отключать определенную функцию, когда пользователь начинает печатать, что очень просто. А когда пользователь перестает печатать, я хочу снова включить эту функцию.
Без реактивных расширений можно просто реализовать эту функцию с помощью 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");
}