【发布时间】:2014-03-20 14:28:21
【问题描述】:
在 WPF 中,我希望能够使用鼠标事件和响应式扩展来为 UIElement 创建一个可观察的对象,该 UIElement 的工作方式类似于 Click 事件。有很多使用它来创建拖放行为的示例,但我找不到任何只需单击一下的东西。
我预计它将涉及 MouseLeftButtonDown、MouseLeftButtonUp、MouseLeave 和 MouseEnter 上的 observables。但我不确定我需要使用 Merge、SelectMany、TakeUntil 或 TakeWhile 的哪种组合。在尝试将其全部包含在扩展中时,这是我目前所拥有的:
public static IDisposable GetClick(this UIElement item, Action clickAction)
{
var obs1 = Observable.FromEventPattern<MouseButtonEventHandler, MouseButtonEventArgs>(
h => (s, e) => h(s, e),
h => item.MouseLeftButtonDown += h,
h => item.MouseLeftButtonDown -= h);
var obs2 = Observable.FromEventPattern<MouseButtonEventHandler, MouseButtonEventArgs>(
h => (s, e) => h(s, e),
h => item.MouseLeftButtonUp += h,
h => item.MouseLeftButtonUp -= h);
var obs3 = Observable.FromEventPattern<MouseEventHandler, MouseEventArgs>(
h => (s, e) => h(s, e),
h => item.MouseLeave += h,
h => item.MouseLeave -= h);
var obs4 = Observable.FromEventPattern<MouseEventHandler, MouseEventArgs>(
h => (s, e) => h(s, e),
h => item.MouseEnter += h,
h => item.MouseEnter -= h);
var finalObs = ???
return finalObs.Subscribe(x => clickAction.Invoke());
}
【问题讨论】:
-
查看:rxwiki.wikidot.com/101samples#toc50 我认为
CombineLatest值得探索
标签: c# wpf system.reactive