Я реализую операцию типа щелчка и перетаскивания для панорамирования камеры в графическом приложении.
Я хотел бы отслеживать, панорамируем ли мы в другом потоке, это может быть проверяется другими операциями для целей фильтрации (например, мы не должны разрешать выбор резинки, если мы панорамируем).
Код выглядит примерно так:
MouseClicked
.Where(startClick => startClick.Action == MouseAction.LeftDown)
.SelectMany(_ =>
MouseMoved
.Select(endMove => (_.startClick, endMove))
.TakeUntil(MouseReleased))
.Subscribe(_ => PanCamera(_.startClick, _.endMove));
Мое решение состоит в том, чтобы добавить следующие две строки кода
MouseClicked
.Where(startClick => startClick.Action == MouseAction.LeftDown)
.Do(_ => _isPanning.OnNext(true)) // Add this
.SelectMany(_ =>
MouseMoved
.Select(endMove => (_.startClick, endMove))
.TakeUntil(MouseReleased)
.Finally(() => _isPanning.OnNext(false)) // Add this
)
.Subscribe(_ => PanCamera(_.startClick, _.endMove));
, где _isPanning
- это Subject
. Это прекрасно работает, но мне было интересно, если бы был лучший подход, без необходимости использовать Subject.