【问题标题】:Application closes automatically应用程序自动关闭
【发布时间】:2015-08-11 18:10:09
【问题描述】:

此代码不显示窗口,它只是自动关闭。为什么会这样?

class Program
{
    [STAThread]
    static void Main(string[] args)
    {
        var window = new MainWindow();
        window.ShowDialog();
    }
}

我知道你可以通过添加一个新的Application.Run(window) 来修复它,但我想知道它为什么会有这种行为以及为什么你必须在窗口实例上调用 Run 方法。

编辑:

扩展上一个问题,我注意到这段代码可以工作:

  1. 创建一个新的 WPF 应用程序。
  2. 转到 App.xaml 并删除 StartupUri
  3. 修改覆盖方法 OnStartup 的 App.xaml.cs

    public partial class App : Application
    {
        protected override void OnStartup(StartupEventArgs e)
        {
            base.OnStartup(e);
    
            var window = new MainWindow();
            window.Show();
        }
    }
    

这样,窗口保持打开状态。引擎盖下发生了什么?

【问题讨论】:

  • 这不是 WPF/XAML,而是 Windows 窗体代码。原因:没有Application.Run就没有消息循环。
  • 它是 WPF。 PresentationFramework 的窗口。
  • 没有。纯 WPF 应用程序中没有 Main 方法。您可能有一个包含 WPF 窗口的表单应用程序,但您显示的代码(Main 方法)在 WPF 中不存在。

标签: c# .net wpf


【解决方案1】:

Microsoft Windows 程序是基于事件的。它们作用于操作系统发布到应用程序主线程的消息。应用程序通过在称为“事件循环”的代码段中重复调用 GetMessage(或 PeekMessage)函数从消息队列中接收这些消息。

当调用 Run 时,Application 将一个新的 Dispatcher 实例附加到 UI 线程。接下来,调用 Dispatcher 对象的 Run 方法,该方法启动一个消息循环来处理 windows 消息。最后,Dispatcher 对象调用 Application 对象的 OnStartup 方法来引发 Startup 事件。

如果没有消息循环,应用程序将无法支持 UI。

【讨论】:

  • 感谢@Glen!但我也注意到,我在 Application.OnStartup 方法中只放了一个 window.Show(覆盖它),窗口就留在那里。在那种情况下会发生什么?应用程序是否知道何时显示调用 Show/ShowDialog 的新窗口?它似乎附加到刚刚创建的窗口。
  • 据我所知,如果你不调用Application.Run,​​那么永远不会调用OnStartup方法。发生这种情况时,Main 方法中是否有任何内容?
  • 谢谢格伦!我已经编辑了添加代码的原始问题。你可以自己检查一下。我刚刚从头开始对解决方案进行了双重测试。
  • 啊,我明白你现在在做什么了。您添加的代码来自 WPF 应用程序,而第一个代码块来自控制台/winforms/other。 WPF 应用程序将为您调用 Application.Run。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-07
  • 2010-11-13
  • 1970-01-01
  • 1970-01-01
  • 2019-03-11
  • 1970-01-01
  • 2018-01-02
相关资源
最近更新 更多