使用 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}")
);
目前,我只是使用普通的旧 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}")
);