3

いくつかの WindowsFormHost コントロールを必要とする WPF ウィンドウがあります。このようにコントロールをモデル化すると、例外が表面に浮かび上がらず、静かに処理されることに気付きました。

どうすればこの動作を回避できますか?

Window の Loaded Event Handler コードで例外をスローして、これをテストしました。WindowsFormsHost コントロールの 1 つをコメント アウトすると、例外処理は通常どおりになり、コードが壊れますが、下のコードのようにすると、例外がキャッチされたかのように Window が表示されます。

<?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");
    }
}
4

1 に答える 1

1

これは、WindowsFormsHost が Windows フォーム テクノロジの Windows メッセージを処理するために作成する中間の 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 実装が多くのプライベートなものを使用しているため、機能しません....

于 2012-03-31T17:56:10.230 に答える