【问题标题】:How to invoke into message loop after Application.Run()Application.Run() 之后如何调用消息循环
【发布时间】:2021-08-25 15:19:22
【问题描述】:

在没有对话框的情况下调用Application.Run() 后,如何调用tread/form 的消息循环?原因是我想准备(并稍后显示)一个可点击的对话框,即使主应用程序中显示了模式对话框。

static Form1 dialog;

private static void CreateDialog(object obj)
{
    dialog = new Form1();
    Application.Run();
}

static void Main(string[] args)
{
    var thread = new Thread(CreateDialog);
    thread.Start();

    Thread.Sleep(2000);    //only for demonstration

    dialog.Invoke((Action)dialog.Show);    //InvalidOperationException: need window handle first
}

【问题讨论】:

  • 不要创建多个 UI 线程。你只是在为失败做准备。维护单个 UI 线程和单个消息循环。
  • 模态对话框是邪恶的!不要使用它。
  • 除非您是 UX 专家,否则请遵守约定。模态对话框的要点在于它阻止了 UI 其他部分的事件。如果您不想要这种行为,则不需要模式对话框。也许您需要一个带有TopMost 属性集的非模态对话框。
  • @Loathing 感谢您的链接。这为我指出了一个解决方案,尽管我不得不承认它的代码比我预期的要多,并且仍然给我留下了一个问题,当您似乎无法在这种情况下调用代码时,Application.Run() 的目的是什么......

标签: c# winforms message-loop


【解决方案1】:

我在这里找到了解决方案:https://stackoverflow.com/a/4411493/1520078 我只需要访问表单的Handle 属性就可以从现在开始调用它。

private static void CreateDialog(object obj)
{
    dialog = new Form1();
    _ = dialog.Handle;
    Application.Run();
}

现在这不再抛出:

dialog.Invoke((Action)dialog.Show); 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-10-13
    • 1970-01-01
    • 2013-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多