F# Windows Application Template for WinForms

Recently I have been doing some work with FSharp.Charting and found there was no simple template for an F# WinForms application. So to remedy this situation I have posted one on the Visual Studio Gallery:

https://visualstudiogallery.msdn.microsoft.com/eba78049-a17e-4868-9ead-065da1421052

When the template is installed you get the following template added to your F# folder when creating a new F# project:

image

So what does this template do? The template creates a new project consisting of two F# files, MyForm.fs and Program.fs.

The MyForm.fs file provides the structure for a type derived from Form. It demonstrates the Form definition providing placeholders for adding forms to the control and hooking up both form and control events.

namespace FSharp.WinForms

open System
open System.Drawing
open System.Windows.Forms

type public MyForm() as form =
    inherit Form()

    // TODO define your controls
    let formLabel = new Label()
    
    // TODO initialize your controls
    let initControls =
        formLabel.Text <- "My form data"
        formLabel.DoubleClick.AddHandler(new EventHandler
            (fun sender e -> form.eventLabel_DoubleClick(sender, e)))   

    do
        form.SuspendLayout();
        initControls

        // TODO add controls to the form
        form.Controls.Add(formLabel)

        // TODO define form properties
        form.ClientSize <- new Size(600, 600)
        form.Text <- "F# Form"

        // TODO define any required for events
        form.Load.AddHandler(new System.EventHandler
            (fun sender e -> form.eventForm_Loading(sender, e)))

        // render the form
        form.ResumeLayout(false)
        form.PerformLayout()

    // TODO define your event handlers
    member form.eventForm_Loading(sender:obj, e:EventArgs) =
        ()

    member form.eventLabel_DoubleClick(sender:obj, e:EventArgs) =
        ()

As you can see TODO comments define where the code needs to be modified to build up your form application.

The Program.fs file, which can be left unchanged, loads the form on the appropriate STA thread:

namespace FSharp.WinForms

open System
open System.Drawing
open System.Windows.Forms

module Main =

    [<STAThread>]
    do
        Application.EnableVisualStyles()
        Application.SetCompatibleTextRenderingDefault(false)
        Application.Run(new MyForm() :> Form)

Hopefully you will find this template useful.

Written by Carl Nolan