WindowsFormsHost中的Windows Forms图表无法接收鼠标滚轮信号?

7

我在WindowsFormsHost中有一个Forms.DataVisualization.Charting.Chart。我无法使图表接收鼠标滚轮事件。点击操作可以正常工作。如果我尝试使用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中的所有点击和鼠标滚轮事件,但是在Windows Forms中只能接收点击事件,无法接收鼠标滚轮事件。我尝试过FormsHost的滚轮监听器,但没有成功。
有什么想法吗?Jon Skeet?

有任何想法吗?Jon Skeet?这应该升级为“模因”状态!!! - Vector Sigma
1个回答

1

这是Windows Forms(WinForms)和WPF之间常见的互操作性问题。 WPF事件的行为不同,它们使用路由事件而不是Windows Forms的旧事件处理。

WinForms本身是Win32世界中消息处理的映射,因此在WPF上嵌入WindowsForms控件时必须手动编码。为了处理除鼠标单击之外的鼠标事件(包括鼠标滚轮),您必须代理winforms事件。

.NET 4的MSDN库清楚地提到了这一点:

代理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


谢谢您的解释,但这并没有对我解决问题有太大帮助。我猜我需要手动路由事件,但我不知道如何做。我还尝试在WPF中捕获鼠标滚轮以发送自己的命令到表单,但我也无法在WPF中捕获滚轮...您能否提供代码片段或想法来实际解决问题? - Martin Booka Weser
@MartinBookaWeser,我已经给你提供了回答问题的起始指针。步骤已经列出。我已经按照步骤尝试了解决方案,它是有效的。请阅读文档。你尝试过这些步骤吗? - Eriawan Kusumawardhono

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接