请注意,我对 WPF 和 Avalonia 并没有完全了解,所以请放过我一些 :(
一旦 Avalonia 应用程序中抛出未处理的异常,我想在退出程序之前向用户显示一些信息。这样我可以向用户显示一些链接来报告问题或执行类似的操作。
这里的根本问题是 Avalonia 中的消息框(特别是来自
MessageBox.Avalonia
的消息框)需要一个窗口来显示,程序需要以某种方式等待消息框关闭,并且程序需要重新抛出异常才能退出。
请注意,我不需要使用消息框,我只需打开一个文件即可在发生致命错误时显示,但我怀疑这是最好的解决方案...我仍然非常喜欢消息框.
我尝试寻找与WPF相关的解决方案,但它们都使用“不需要窗口”的
MessageBox.Show()
来显示并等待用户进行输入(就我和这个问题而言)。这在阿瓦隆尼亚不存在。
这些是我发现但存在问题的潜在解决方案:
全球Try-Catch
[STAThread]
public static void Main(string[] args) {
try
{
BuildAvaloniaApp().StartWithClassicDesktopLifetime(args);
}
catch (Exception ex)
{
ExceptionDispatchInfo.Capture(ex).Throw();
}
}
我放弃了这个解决方案,因为这需要在某个地方设置一个窗口。不过它有潜力。
AppDomain.CurrentDomain.UnhandledException
public partial class App : Application
{
public override void Initialize()
{
AppDomain.CurrentDomain.UnhandledException += (s, e) =>
{
// ???
}
}
// ...
}
这也会失败,因为它需要在某个地方占用一个窗口。即使我使用不需要窗口的
MessageBoxManager.GetMessageBoxStandard(...).Show()
,它也不会阻止继续引发异常并退出程序的代码。这意味着用户甚至看不到该窗口,因为程序在窗口显示后立即退出。
您是否尝试过使用该方法的异步版本
Show()
?使用 MessageBoxManager.GetMessageBoxStandard(...).Show()
的解决方案可能有机会。如果它不起作用,请尝试将 MessageBox 调用代码包装在如下任务中:
await Task.Run(() => MessageBoxManager.GetMessageBoxStandard(...).Show());