Диаграмма форм Windows в WindowsFormsHost не получает колесо мыши? - PullRequest
5 голосов
/ 14 сентября 2011

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

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

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

<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, но нет колеса из форм.Я попробовал колесо слушателя форм также, но безуспешно.

Есть идеи?Джон Скит?

1 Ответ

2 голосов
/ 14 сентября 2011

Это общая проблема взаимодействия между 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

...