非常简单的F#形式锁定键盘输入

时间:2010-07-07 18:51:22

标签: .net f#

使用下面的超简单代码,只要在表单处于焦点时按键盘上的键,表单就会完全锁定。我在F#interactive里面运行它。关闭表单的唯一方法是单击F#interactive中的“重置会话”。我已经尝试将事件处理程序添加到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 for Windows + Visual Studio 2008(2010年4月发行版)。

谢谢!

3 个答案:

答案 0 :(得分:3)

我认为您需要致电

Application.Run(a)

但我现在没有时间尝试验证。

编辑:

有用的事情是:创建一个C#Windows窗体项目,并查看它启动的代码。它给你这个:

    [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()

答案 1 :(得分:2)

你肯定需要在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 = ()

(标记为社区维基,因为我没有真正回答这个问题。)

答案 2 :(得分:0)

这个与线程相关的错误多年来一直在F#中,当我们的可视化产品基于Windows Forms构建时,它对我们来说是一个巨大的PITA。您可以通过在F#交互式会话中多次返回来获得响应性。

我能给出的唯一建议是使用WPF,但是从F#interactive中可靠地工作仍然非常棘手。这可能是我们F#for Visualization库中唯一最有用的方面......