WPF模式对话框关闭意外结束应用程序

时间:2011-02-22 09:16:18

标签: wpf modal-dialog

我的应用程序出现问题,当从主程序窗口生成的模式对话框正常关闭时,意外结束。没有未处理的异常被抛出,并且在主应用程序窗口中没有触发ClosingClosed事件。

基本上我有一个主/ shell窗口,它使用ShellWindow.Show()在应用程序代码中启动。通过菜单,用户可以生成一个自定义打开的对话框,这是一个新窗口,然后使用ShowDialog显示(窗口所有者设置为shell窗口的那个)。

当对话框关闭时(在内部,通过调用_modalDialogWindow.Close()的命令)应用程序关闭,而我只希望模式对话框关闭。

调试代码表明ShellWindow是从内存中转储的,因为_modalDialogWindow.Close()之后的下一行代码是静态程序代码中的Application.Run()。

如果有人有任何想法,我愿意尝试任何事情。

2 个答案:

答案 0 :(得分:4)

看来,由于MVVM / Ioc方式,我正在设计应用程序窗口,因此关闭事件的传播范围超出了应有的范围。我不明白这个!

但是,将Application.ShutDownMode设置为Explicit会阻止应用程序过早关闭,现在我已经拥有了所需的行为。

顺便说一句,启用declyclone建议的所有异常并没有产生任何在窗口关闭时内部抛出的异常。

答案 1 :(得分:1)

在创建应用程序之前不要创建任何窗口,否则它们将无法正确注册。它们不会出现在Application.Current.Windows或Application.Current.MainWindow中。然后,当您创建对话框窗口时,您的应用程序将认为它既是MainWindow又是唯一的窗口。

不做的示例:

public partial class App : Application, ISingleInstanceApp
{
    MyWindow win = new MyWindow(); //BAD! this is called inside new App(), but before the actual App constructor.

    [STAThread]
    public static void Main()
    {
        if (SingleInstance<App>.InitializeAsFirstInstance(Unique))
        {
            var application = new App();

            application.InitializeComponent();
            application.Run();

            // Allow single instance code to perform cleanup operations
            SingleInstance<App>.Cleanup();
        }
    }

我也遇到了这个问题,你的回答帮助我找出原因。