c# - F# GUI问题(将C#翻译成F#)

标签 c# f#

我正在将 C# 项目转换为 F#。虽然逻辑部分很简单,但我对 GUI 部分感到困惑:

public partial class GomokuGUI : Form {
    private void GomokuGUI_Load(object sender, EventArgs e)
    {
        this.Width = 500;
        this.Height = 550;
        ...
        this.Paint += new PaintEventHandler(GomokuGUI_Paint);
        Graphics gp = this.CreateGraphics();
        DrawChessbord(gp); 
    }

    private void GomokuGUI_Paint(object sender, PaintEventArgs e)
    {
        Graphics gp = e.Graphics;
        DrawChessbord(gp);
    }

    void DrawChessbord(Graphics gp)
    {
        float w, h;
        SolidBrush br = new SolidBrush(linecolor);
        Pen p = new Pen(br, frame);
        gp.DrawLine(p, 20, 45, this.Width - 25, 45);
  ...
    }

   private void Form1_Click(object sender, EventArgs e) {
          Graphics gp = this.CreateGraphics();
                DrawChess(gp);
     ...
}
}

问题:如何在 F# 中编写上述 C# 代码...谢谢

最佳答案

请注意,F# 没有任何 WinForms 设计器,因此如果您在表单中有一些控件,则需要手动创建它们(或者您可以在 C# 中设计表单,编译它并从 F# 中引用它) .你可以从这样的事情开始:

type GomokuGUI() as this =
  inherit Form(Width = 300, Height = 550)

  let DrawChessbord (gp:Graphics) =
    let br = new SolidBrush(linecolor)
    let p = new Pen(br, frame)
    gp.DrawLine(p, 20, 45, this.Width - 25, 45)
    // ...

  let paintGui (e:PaintEventArgs) =
    let gp = e.Graphics
    DrawChessbord(gp)

  do 
    this.Paint.Add(paintGui)
    this.Click.Add(fun _ ->
      let gp = this.CreateGraphics()
      DrawChess(gp) 
      (* ... *) )

它使用了一些有趣的东西:

  • 调用基类构造函数时,可以在构造函数中指定WidthHeight等参数。
  • 你需要在类声明中使用as this,这样你就可以在do代码(在构建期间运行)中引用该类
  • 您可以使用 Add 来注册事件处理程序,您可以给它一个命名函数(例如 patinGui)或者一个 lambda 函数,如果您只需要做一些简单的事情调用(例如处理 Click)

关于c# - F# GUI问题(将C#翻译成F#),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2296361/

相关文章:

f# - 将数据库记录建模为类型

c# - 为什么我的 Fluent NHibernate 子类映射会生成冗余列?

c# - 发现多个与 mvc5 api 应用程序中的请求匹配的操作

c# - LINQ to Objects - ICollection 属性到 CSV 的一般转换

c# - 在 Xamarin Forms UWP 中突出显示选定的选项卡

f# - 迪德尔的夏令时

c# - 我在确定是否存在 int N 时的缺陷在哪里 x1 + v1 * N = x2 + v2 * N

f# - 将字符串数组转换为字符串列表

wpf - 如何在 F# 中编写 WPF 用户控件?

f# - 为什么我 Seq.take 不能超过 5 个值?