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