Элементы управления WindowsFormsHost - обработка исключений - PullRequest
3 голосов
/ 15 марта 2012

У меня есть окно WPF, для которого требуется несколько элементов управления WindowsFormHost. Я заметил, что если я смоделирую элемент управления таким образом, то исключения не всплывают на поверхность и обрабатываются без вывода сообщений, то есть видны только с помощью опции отладки SharpDevelop «Приостановить обработку обработанных исключений».

Как мне избежать этого поведения?

Я проверил это, выдав исключение в коде обработчика событий Loaded окна. Если я закомментирую один из элементов управления 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");
    }
}

1 Ответ

1 голос
/ 31 марта 2012

Это происходит из-за промежуточного стека взаимодействия Windows, который WindowsFormsHost создает для изменения технологии Windows Messages for Windows Forms.

Он основан на почти стандартном 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 использует много приватных штук ....

...