gpt4 book ai didi

WPF ShowDialog在窗口加载期间吞咽异常

转载 作者:行者123 更新时间:2023-12-04 01:03:14 24 4
gpt4 key购买 nike

使用 Window 类中的 ShowDialog 方法显示 WPF 窗口对话框,就像在主窗口上按下按钮时一样,就像这样。

        private void button1_Click(object sender, RoutedEventArgs e)
{
try
{
var window = new Window1();
window.ShowDialog();
}
catch (ApplicationException ex)
{
MessageBox.Show("I am not shown.");
}
}

该窗口在 xaml 中订阅了一个 Loaded 事件,如下所示:
<Window x:Class="Stackoverflow.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="Window1" Loaded="Window_Loaded">
<Grid />
</Window>

Window_Loaded 事件中引发异常
    private void Window_Loaded(object sender, RoutedEventArgs e)
{
throw new ApplicationException();
}

但是,异常不会被 ShowDialog 调用周围的 catch 捕获,调用也不会返回。异常被吞下,窗口仍然显示。

为什么会发生这种情况,我将如何处理 WPF 窗口的 Window_Loaded 事件中的异常?我是否必须在事件处理程序中捕获它并手动处理窗口?

在 WinForms 中您需要调用 Application.SetUnhandledExceptionMode(UnhandledExceptionMode.ThrowException)
为了让异常通过 ShowDialog 调用冒泡。是否需要在 WPF 上设置类似的开关?

最佳答案

我只在 x64 机器上看到过这个问题,代码是用 Any Cpu 编译的。
将您的程序更改为编译为 x84 可能会修复它,但根据我们的程序集,我自己在那里遇到了问题。
我唯一的代码建议如下,即使这样也不能保证能接受。
捕获异常,并将其重新抛出到后台工作人员中。

private void Window_Loaded(object sender, RoutedEventArgs e)
{
try
{
/// your code here...
throw new ApplicationException();
/// your code here...
}
catch (Exception ex)
{
if (IntPtr.Size == 8) // 64bit machines are unable to properly throw the errors during a Page_Loaded event.
{
BackgroundWorker loaderExceptionWorker = new BackgroundWorker();
loaderExceptionWorker.DoWork += ((exceptionWorkerSender, runWorkerCompletedEventArgs) => { runWorkerCompletedEventArgs.Result = runWorkerCompletedEventArgs.Argument; });
loaderExceptionWorker.RunWorkerCompleted += ((exceptionWorkerSender, runWorkerCompletedEventArgs) => { throw (Exception)runWorkerCompletedEventArgs.Result; });
loaderExceptionWorker.RunWorkerAsync(ex);
}
else
throw;
}
}

关于WPF ShowDialog在窗口加载期间吞咽异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4807122/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com