我正在尝试编译源代码:Custom WPF Controls in F#
这条线怎么样:
let (handler, event) = Event.create<EventArgs>()
引发错误:
The value, constructor, namespace or type 'create' is not defined
MSDN's Control.Event Module (F#) page确实谈到了这样一个功能:
Event模块提供的附加功能是 这里说明。以下代码示例说明了基本用法 Event.create 创建一个事件和一个触发器方法,添加两个 事件处理程序以lambda表达式的形式,然后触发 执行两个lambda表达式的事件。
type MyType() = let myEvent = new Event<_>() member this.AddHandlers() = Event.add (fun string1 -> printfn "%s" string1) myEvent.Publish Event.add (fun string1 -> printfn "Given a value: %s" string1) myEvent.Publish member this.Trigger(message) = myEvent.Trigger(message) let myMyType = MyType() myMyType.AddHandlers() myMyType.Trigger("Event occurred.")
但是请注意,它仅在说明中提及,而不是在示例中。
此外,Control.Event Module (F#) page没有提及此类create
功能。
我想这可能是一个旧功能或其他东西,但我是F#的新手,所以我无法看到它应该替换为什么..
答案 0 :(得分:8)
Event.create
是一个相当古老的事件API,从F#2.0之前判断MSDN上的内容。它为您提供了触发器功能和已发布的事件 - 这两个事件现在都是Publish
类的Trigger
和Event
成员。
因此,如果您想在“现代”术语中实现create
,它可能看起来像这样:
module Event =
let create<'T> () =
let event = Event<'T>()
event.Trigger, event.Publish
我不建议您普遍使用它,但也许这足以使旧代码恢复生机(这里正确的方法是重构它以使用Publish
和Trigger
而不是{ {1}})。