gpt4 book ai didi

wpf - 如何使用 Rx 和 F# 将 WPF Button.Click 事件转换为 Observable

转载 作者:行者123 更新时间:2023-12-03 21:26:41 25 4
gpt4 key购买 nike

我正在尝试复制一些创建 IObservable 的 C# 代码。来自 Button.Click事件。
我想将此代码移植到 F#。

这是编译没有错误的原始 C# 代码:

Observable.FromEvent<RoutedEventHandler, RoutedEventArgs>(
h => new RoutedEventHandler(h),
h => btn.Click += h,
h => btn.Click -= h))

这是我在 F# 中尝试执行相同操作的失败尝试:
Observable.FromEvent<RoutedEventHandler, RoutedEventArgs>(
Func<EventHandler<RoutedEventArgs>, RoutedEventHandler>(fun h -> RoutedEventHandler(h)),
Action<RoutedEventHandler>(fun h -> btn.Click.AddHandler h),
Action<RoutedEventHandler>(fun h -> btn.Click.RemoveHandler h))

除了语句的第二行,一切都很愉快。

F# 编译器提示 fun h -> RoutedEventHandler(h)因为
它不想除了 h作为 RoutedEventHandler 的参数构造函数。

另一方面,C# 编译器似乎没有问题接受 h => new RoutedEventHandler(h)
有趣的是,在两个代码示例(C# 和 F#)中 h 的类型是 EventHandler<RoutedEventArgs> .

我从 F# 编译器收到的错误消息是:

Error 2 This expression was expected to have type obj -> RoutedEventArgs -> unit but here has type EventHandler


RoutedEventHandler的签名我在 PresentationCore 中发现的是:
public delegate void RoutedEventHandler(object sender, RoutedEventArgs e);
正如你所看到的,它确实需要一个 objectRoutedEventArgs作为参数,所以 F# 编译器实际上是正确的。

C# 编译器是否在幕后做了一些魔术来使 F# 编译器没有这样做,或者我只是在这里遗漏了什么?

无论哪种方式,我如何才能在 F# 中完成这项工作?

最佳答案

我所知道的制作 IObservable<_> 的最简单方法出 WPF Button.Click 事件是投它:

open System
open System.Windows.Controls

let btn = new Button()
let obsClick = btn.Click :> IObservable<_>

正在检查 obsClick...
val obsClick : IObservable<Windows.RoutedEventArgs>

这是可能的,因为标准 .NET 事件的 F# 表示是类型(在本例中) IEvent<Windows.RoutedEventHandler,Windows.RoutedEventArgs> .从文档中可以看出, IEvent implements IObservable .换句话说,在 F# 中,每个事件都已经是 IObservable .

关于wpf - 如何使用 Rx 和 F# 将 WPF Button.Click 事件转换为 Observable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5131372/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com