我有一个WPF窗口,其中需要几个WindowsFormHost控件。我注意到,如果我像这样对控件建模,那么异常不会浮出水面,而是静默地处理,即只有使用SharpDevelop的调试选项“Pause on handled Exception”时才可见。
我怎样才能避免这种行为?
我已经通过在窗口的已加载事件处理程序代码中抛出异常来测试这一点。如果我注释掉其中一个WindowsFormsHost控件,异常处理将照常进行,代码会中断,但如果像下面的代码中所示,窗口将显示为好像捕获了异常一样。
<?xml version="1.0" encoding="utf-8"?>
<Window
x:Class="TEST.Window1" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TEST"
Height="300"
Width="300">
<Grid>
<Grid.RowDefinitions>
<RowDefinition
Height="150" />
<RowDefinition
Height="150" />
</Grid.RowDefinitions>
<WindowsFormsHost Grid.Row="0" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" />
<WindowsFormsHost Grid.Row="1" VerticalAlignment="Stretch" HorizontalAlignment="Stretch" />
</Grid>
</Window>
/// <summary>
/// Interaction logic for Window1.xaml
/// </summary>
public partial class Window1 : Window
{
public Window1()
{
InitializeComponent();
this.Loaded += new RoutedEventHandler(Window1_Loaded);
}
void Window1_Loaded(object sender, RoutedEventArgs e)
{
throw new ApplicationException("TEST");
}
}发布于 2012-04-01 01:56:10
这是由于WindowsFormsHost为处理windows Forms技术的Windows消息而创建的中间窗口互操作堆栈。
它基于一个几乎标准的NativeWindow类,不幸的是,这个类在默认情况下只接受异常。您可以使用Reflector或任何其他IL检查工具来查看它。这个类的核心是这个方法:
private IntPtr Callback(IntPtr hWnd, int msg, IntPtr wparam, IntPtr lparam)
{
try
{
// process message
}
catch (Exception exception)
{
this.OnThreadException(exception);
}
...
}默认情况下,OnThreadException方法是...空的。从理论上讲,您可以创建一个从WindowsFormsHost派生的类,尤其是BuildWindowCore方法。我试过这样做,但它不起作用,因为WindowsFormsHost实现使用了很多私有stuf……
https://stackoverflow.com/questions/9725536
复制相似问题