f#:windows编译程序中的窗体

时间:2011-06-07 20:16:05

标签: .net f#

要显示来自F#交互式控制台的数据,我可以执行以下操作:

open System.Windows.Forms
let  testgrid (x) =    
          let form = new Form(Visible = true)    
          let data = new DataGridView(Dock = DockStyle.Fill)    
          form.Controls.Add(data)    
          data.DataSource <- x

testgrid [|(1,1);(2,2)|]

但是如果把上面的内容放在编译的F#程序中并在程序中调用testgrid [|(1,1);(2,2)|] ,我只会得到一个没有数据的冻结窗口。需要做些什么来使这个testgrid适用于编译的F#程序? 编辑:与ildjarn的回答和一些搜索,以下代码是否正常?任何陷阱?

let testgrid x =
    let makeForm() = 
        use form = new Form()
        new DataGridView(Dock = DockStyle.Fill, DataSource = x) |> form.Controls.Add
        Application.Run form
    let thread = new System.Threading.Thread(makeForm)
    thread.SetApartmentState(Threading.ApartmentState.STA)
    thread.Start()

1 个答案:

答案 0 :(得分:3)

你需要一个消息泵; FSI已经有了一个,这就是为什么你的代码可以在FSI控制台上运行的原因,但是除非你制作一个程序,否则一个独立的程序就没有了:

open System
open System.Windows.Forms

let testgrid x =
    use form = new Form()
    new DataGridView(Dock = DockStyle.Fill, DataSource = x) |> form.Controls.Add
    Application.Run form

[<STAThread>]
do testgrid [|(1,1);(2,2)|]