Диаграмма WIndows Forms в WindowsFormsHost не получает колесико мыши?

У меня есть Forms.DataVisualization.Charting.Chart в WindowsFormsHost. Я не могу заставить диаграмму получать события колесика мыши. Щелчки работают, если я попробую с Forms.TextBox, колесо мыши тоже будет работать. Колесо мыши также работает, если я использую диаграмму в «родном» приложении форм.

Итак, что создает проблему, так это комбинация диаграммы форм в formsHost.

Вот очень простое приложение для воспроизведения проблемы:

<Grid>
    <Grid.ColumnDefinitions>
        <ColumnDefinition Width="*"/>
        <ColumnDefinition Width="*"/>
    </Grid.ColumnDefinitions>

    <TextBlock Name="TextBlock1" Grid.Column="1" />
    <WindowsFormsHost Name="WindowsFormsHost1" Grid.Column="0"/>
</Grid>

и код позади:

public MainWindow()
    {
        InitializeComponent();

        var chart = new Chart() { BackColor = System.Drawing.Color.Aquamarine};
        WindowsFormsHost1.Child = chart;

        chart.MouseDown += (a, b) => TextBlock1.Text += "FORMS click\r\n";
        TextBlock1.MouseDown += (a, b) => TextBlock1.Text += "WPF click\r\n";

        chart.MouseWheel += (a, b) => TextBlock1.Text += "FORMS wheel\r\n";
        TextBlock1.MouseWheel += (a, b) => TextBlock1.Text += "WPF wheel\r\n";
    }

Я могу получать все щелчки и колесо мыши из WPF, но не из форм. Я также безуспешно пробовал прослушивать колесо формHost.

Любые идеи? Джон Скит?


person Martin Booka Weser    schedule 14.09.2011    source источник
comment
Any ideas? Jon Skeet? Это должно быть повышено до статуса мема !!!   -  person Vector Sigma    schedule 17.12.2019


Ответы (1)


Это распространенная проблема взаимодействия между Windows Forms (WinForms) и WPF. События WPF ведут себя по-разному, они используют перенаправленное событие вместо старой обработки событий Windows Forms.

Сам WinForms представляет собой карту обработки сообщений из мира Win32, поэтому вам придется кодировать ее вручную при встраивании элемента управления WindowsForms в WPF. Чтобы обрабатывать событие мыши, отличное от щелчка мыши (включая колесо мыши), вы должны заменить событие winforms.

Библиотека MSDN .NET 4 четко об этом упомянула:

Суррогатная цепочка сообщений Windows Forms

По умолчанию класс System.Windows.Forms.Application содержит основной цикл сообщений для приложений Windows Forms. Во время взаимодействия цикл сообщений Windows Forms не обрабатывает сообщения. Следовательно, эту логику необходимо воспроизвести. Обработчик события ComponentDispatcher.ThreadFilterMessage выполняет следующие шаги:

1. Фильтрует сообщение с помощью интерфейса IMessageFilter.

2. Вызывает метод Control.PreProcessMessage.

3.Переводит и отправляет сообщение, если это необходимо.

4. передает сообщение элементу управления размещением, если никакие другие элементы управления не обрабатывают сообщение.

Когда дескриптор окна уничтожается, элемент управления WindowsFormsHost исключает себя из регистрации.

Для получения дополнительной информации посетите: http://msdn.microsoft.com/en-us/library/ms742474.aspx

person Eriawan Kusumawardhono    schedule 14.09.2011
comment
Спасибо за ваше объяснение, но это не очень помогает мне в решении проблемы. Я предполагаю, что мне нужно маршрутизировать события вручную, но я не знаю как. Я также пытался захватить колесо мыши в WPF, чтобы отправить свои собственные команды в формы, но я также не могу захватить колесо в WPF ... можете ли вы предоставить фрагменты кода или идеи, как на самом деле преодолеть проблему? - person Martin Booka Weser; 15.09.2011
comment
@MartinBookaWeser Я дал вам начальный указатель, чтобы ответить на ваш вопрос. Пошаговая процедура уже есть. Я попробовал решение в соответствии с инструкциями, оно работает. Пожалуйста, прочтите документ. Вы пробовали шаги? - person Eriawan Kusumawardhono; 28.07.2020