使用 Rx 在 Xamarin 中桥接事件

Bridging Events in Xamarin with Rx

目前,我只是使用普通的旧 delegates/events 观察者模式来处理按钮上的点击事件。所以,我想我会去 Rx。

我的第一次尝试是球。我想我会选择您在 WinForms 示例中看到的最简单的重载:

Observable.FromEventPattern<EventArgs>(__navToTestButton, 'click');

但是我得到一个例外,Android 按钮没有点击事件。这是史诗般的反射失败。我猜我可能缺少一个 dll(太好了,另一个使我的 apk 更大的 dll)。

无论如何,我想我会继续进行不同的重载。现在看起来像这样:

navToTest = Observable.FromEventPattern<EventArgs>(
    x => _navToTestButton.Click += _navToTestButton_Click,
    x => _navToTestButton.Click -= _navToTestButton_Click
).ObserveOn(SynchronizationContext.Current);

还是失败。没有例外。但是当我点击按钮时,只有蟋蟀和风滚草。我打算订阅吗?那会是什么样子,因为订阅似乎已经发生在那个超载中?

Xamarin 已经够棘手了,但 Rx 让它变得非常难。尤其是在没有太多人写博客的情况下(至少我的 Google 搜索没有找到什么有用的东西。我的代码基于我找到的一些点点滴滴。

谢谢

我在您的可观察对象上没有看到任何订阅:

反思:

Observable.FromEventPattern(aButton, "Click")
  .Subscribe((obj) => Log.Debug(TAG, $"Whosebug: {obj}"));

处理程序:

Observable.FromEventPattern(
    handler => aButton.Click += handler,
    handler => aButton.Click -= handler
)
.Subscribe(
  (obj) => Log.Debug(TAG, $"Whosebug: {obj}")
);

使双击可见:

var fromInterval = TimeSpan.FromMilliseconds(250);
var toInterval = TimeSpan.FromMilliseconds(500);

var buttonTapped = Observable.FromEventPattern(
    handler => aButton.Click += handler,
    handler => aButton.Click -= handler
);
var doubleTaps = buttonTapped
        .TimeInterval()
        .SkipWhile(t => t.Interval < toInterval)
        .FirstAsync(t => t.Interval < fromInterval)
        .Repeat();          
doubleTaps
        .Subscribe(
          (obj) => Log.Debug(TAG, $"Double Tap: {obj}")
     );