Как реализовать отложенное событие MouseEnter с расширениями Silverlight и Reactive? - PullRequest
1 голос
/ 12 октября 2011

Я пытаюсь реализовать обработчик отложенного события MouseEnter в моем интерфейсе Silverlight.Сделав это «классическим» способом, с DispatcherTimer и т. Д., Я сейчас пытаюсь сделать то же самое с помощью расширений Reactive.Это должно быть более кратким и простым для чтения, но почему-то я не могу достичь цели, а именно:

  • , когда мышь входит в какой-либо элемент управления пользовательского интерфейса, необходимо вызвать метод,
  • но это должно быть сделано только после определенного промежутка времени, т.е. 1000 мс, в течение которого мышь остается внутри элемента управления
  • , поэтому, если мышь покидает элемент управления до этого периода, ничего не должно происходитьвообще, событие должно быть «отменено»

Я просмотрел документацию RX, которая является довольно абстрактной, а примеры такого практического вида довольно несуществующими.Основываясь на некоторых примерах, найденных в Интернете, я придумал что-то вроде этого:

    Observable.Throttle(
      Observable.FromEventPattern(LanguageSelector, "MouseEnter"), TimeSpan.FromSeconds(2))
      .TakeUntil(Observable.FromEventPattern(LanguageSelector, "MouseLeave"))
      .ObserveOnDispatcher()
      .Subscribe(e =>
      {
          ShowPopup();
      });

Кажется, что он работает нормально, но только один раз.Когда мышь покидает элемент управления, она больше не работает, мое всплывающее окно больше не срабатывает.Есть лучшие идеи о том, как это сделать?

спасибо заранее!

1 Ответ

1 голос
/ 12 октября 2011

Причина, по которой ваше решение срабатывает только один раз, - TakeUntil.Как только MouseLeave происходит, ваша наблюдаемая утилизируется.SelectMany метод может быть использован для преодоления этого:

var mouseEnter = Observable.FromEventPattern(LanguageSelector, "MouseEnter");
var mouseLeave = Observable.FromEventPattern(LanguageSelector, "MouseLeave");

mouseEnter
    .SelectMany(mousePos => 
        Observable.Timer(TimeSpan.FromSeconds(2)).ObserveOnDispatcher()
        .TakeUntil(mouseLeave))
    .Subscribe(e => ShowPopup());
...