【问题标题】:Very simple F# form locks up on keyboard input非常简单的 F# 表单锁定键盘输入
【发布时间】:2010-07-09 07:25:54
【问题描述】:

使用下面的超简单代码,只要我在表单处于焦点时按下键盘上的一个键,表单就会完全锁定。我在 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 for Windows + Visual Studio 2008(2010 年 4 月版)。

谢谢!

【问题讨论】:

    标签: .net f#


    【解决方案1】:

    我想你需要打电话给

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

    【讨论】:

    • 这不起作用:“在单个线程上启动第二个消息循环不是有效的操作。请改用 Form.ShowDialog。”但是, a.ShowDialog 似乎有效。谢谢!
    【解决方案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 = ()
    

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

    【讨论】:

    • 对,在 F# Interactive 中,它可以正常工作。但听起来 OP 正在做一个编译项目。
    • @Brian:他在问题中提到他在 F# 交互中运行这个......是的,它应该可以工作(而且我从未经历过他描述的行为)。
    【解决方案3】:

    这个与线程相关的错误在 F# 中已经存在多年,当我们的可视化产品基于 Windows 窗体构建时,它对我们来说是一个巨大的 PITA。在 F# 交互式会话中按几次 return 可能会恢复响应。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 2015-10-04
      • 1970-01-01
      • 2014-09-21
      • 1970-01-01
      • 2017-03-22
      相关资源
      最近更新 更多