首页 > 解决方案 > 如何将此 c# 代码移植到 f# 以处理 SFML 事件

问题描述

我正在尝试在 F# 中创建一个 SFML 应用程序,并且由于没有相同的 f# 教程,我正在尝试从 c# 中学习。我根本不懂 c#,只懂 f# 的基础知识。

我在 C# 中遇到了这段代码,但我不确定等效的 F# 代码是什么。

   static void Main()
        {
            ...

            window.KeyPressed += new EventHandler<KeyEventArgs>(OnKeyPressed);

            ...

        }

        static void OnKeyPressed(object sender, KeyEventArgs e)
        {
            Window window = (Window)sender;
            if (e.Code == Keyboard.Key.Escape)
                window.Close();
        }

标签: c#f#sfml

解决方案


F# 将事件转换为IEvent<TDelegate, TArgs>公开AddHandler方法以及IObservable.Subscribe方法的事件。

您可以使用AddHandler添加委托,相当于+=在 C# 中。

window.KeyPress.AddHandler(fun sender evt -> printfn "Pressed %A" evt.Code)

如果要进行事件处理,最好将事件视为可观察的。

window.KeyPress |> Observable.op... |> Observable.subscribe(fun evt -> printfn "Pressed %A" evt.Code)

还有一个Event模块可以让您编写事件。您当前的示例可以重写为:

window.KeyPress 
|> Event.filter(fun evt -> evt.Code = Keyboard.Key.Escape) 
|> Event.add (fun _ -> window.Close())

推荐阅读