簡體   English   中英

非常簡單的F#形式會鎖定鍵盤輸入

[英]Very simple F# form locks up on keyboard input

使用下面的超簡單代碼,只要在窗體處於焦點位置時按鍵盤上的一個鍵,窗體就會完全鎖定。 我正在F#交互中運行此代碼。 關閉表單的唯一方法是在F#交互式中單擊“重置會話”。 我嘗試將事件處理程序添加到KeyPress,結果相同。 添加鼠標事件處理程序,菜單,組合框等沒有問題。

我一定做錯了,因為對於F#而言,在鍵盤上按一下按鍵顯然不應該是一個錯誤。 有任何想法嗎?

// Add reference to System.Windows.Forms to project
open System.Windows.Forms

let a = new Form()
a.Visible <- true

我在Windows XP上將F#2.0用於Windows + Visual Studio 2008(2010年4月發行)。

謝謝!

我認為您需要致電

Application.Run(a)

但我現在沒有時間嘗試驗證。

編輯:

一個有用的事情是:創建一個C#Windows Form項目,並查看它以什么代碼開始。 它給你這個:

    [STAThread]
    static void Main()
    {
        Application.EnableVisualStyles();
        Application.SetCompatibleTextRenderingDefault(false);
        Application.Run(new Form1());
    }

因此,您當然可以在F#中執行相同的操作:

open System.Windows.Forms 

let Main() =
    Application.EnableVisualStyles()
    Application.SetCompatibleTextRenderingDefault(false)
    Application.Run(new Form())

[<System.STAThread>]
do
    Main()

您絕對不需要在F#Interactive中調用Application.Run(a) ,因為它管理着自己的消息循環(實際上,您不能這樣做)。

創建表單並將Visible設置為true應該可以工作(並且在我的機器上也可以工作!)不幸的是,我不確定是什么原因導致了您報告的問題,但這絕對不是預期的行為(似乎有些原因)。錯誤)。

使用ShowDialog不是一個好主意,因為調用它時,它將阻止您在F#Interactive中輸入其他命令,直到對話框關閉為止。 這是非常不幸的-F#Interactive的典型用法是創建並顯示表單,然后通過輸入其他命令對其進行修改。 例如:

> let a = new Form();;
val a : Form = System.Windows.Forms.Form, Text: 

> a.Visible <- true;;  // Displays the form 
val it : unit = ()

> a.Text <- "Hello";;  // Changes title of the form
val it : unit = ()

(標記為社區Wiki,因為我沒有真正回答問題。)

這個與線程相關的錯誤已經存在於F#中很多年了,當我們的可視化產品基於Windows Forms構建時,這對我們來說是一個巨大的PITA。 您可以通過在F#交互式會話中按幾次回車鍵來恢復響應。

我唯一可以給出的建議是改用WPF,但要從F#交互式程序可靠地工作仍然很棘手。 這可能是我們的F#for Visualization庫中最有用的方面...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM