使用下面的超简单代码,只要在表单处于焦点时按键盘上的键,表单就会完全锁定。我在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月发行版)。
谢谢!
答案 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库中唯一最有用的方面......