3

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

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

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

但我有一个例外,Android 按钮没有点击事件。这是史诗般的反思失败。我猜也许我错过了一个 dll(太好了,另一个 dll 让我的 apk 更大)。

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

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

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

Xamarin 足够棘手,但 Rx 只是让它变得非常困难。尤其是在没有很多人写博客的情况下(至少我的谷歌搜索没有什么太有用的东西。我的代码基于我找到的一些零碎的东西。

谢谢

4

1 回答 1

3

我在你的 observable(s) 上没有看到任何订阅:

反射:

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

处理程序:

Observable.FromEventPattern(
    handler => aButton.Click += handler,
    handler => aButton.Click -= handler
)
.Subscribe(
  (obj) => Log.Debug(TAG, $"StackOverflow: {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}")
     );
于 2017-12-09T03:08:56.693 回答