最近、私はまだ頭を悩ませている問題に遭遇していました。アプリケーションで、ディスパッチャ例外ハンドラを登録しました。同じアプリケーションで、サードパーティコンポーネント(DevExpress Grid Control
)により、のイベントハンドラ内で例外が発生しますControl.LayoutUpdated
。ディスパッチャの例外ハンドラが1回トリガーされることを期待しています。しかし、代わりに、スタックオーバーフローが発生します。サードパーティのコンポーネントを使用せずにサンプルを作成したところ、すべてのWPFアプリケーションで発生することがわかりました。
using System;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Threading;
namespace MyApplication
{
/* App.xaml
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
x:Class="MyApplication.App"
Startup="OnStartup"
/>
*/
public partial class App
{
private void OnStartup(object sender, StartupEventArgs e)
{
DispatcherUnhandledException += OnDispatcherUnhandledException;
MainWindow = new MainWindow();
MainWindow.Show();
}
private static void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e)
{
MessageBox.Show(e.Exception.Message);
e.Handled = true;
}
}
public class MainWindow : Window
{
private readonly Control mControl;
public MainWindow()
{
var grid = new Grid();
var button = new Button();
button.Content = "Crash!";
button.HorizontalAlignment = HorizontalAlignment.Center;
button.VerticalAlignment = VerticalAlignment.Center;
button.Click += OnButtonClick;
mControl = new Control();
grid.Children.Add(mControl);
grid.Children.Add(button);
Content = grid;
}
private void OnButtonClick(object sender, RoutedEventArgs e)
{
mControl.LayoutUpdated += ThrowException;
mControl.UpdateLayout();
mControl.LayoutUpdated -= ThrowException;
}
private void ThrowException(object sender, EventArgs e)
{
throw new NotSupportedException();
}
}
}
この動作を防ぐ方法はありますか?これは、.NET Framework 3.0、3.5、4.0、および4.5で発生します。イベントハンドラーはサードパーティのコンポーネントにあるため、単にラップアラウンドすることはできませtry-catch
んLayoutUpdated
。スタックオーバーフローが発生するはずだとは思いません。