WindowsFormsHost中的WIndows Forms Chart不接收鼠标滚轮?

时间:2011-09-14 09:30:23

标签: wpf forms charts mousewheel windowsformshost

我在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接收所有点击和鼠标滚轮,但没有来自表单的轮子。我也试过了formHost的轮子监听器,没有成功。

有什么想法吗? Jon Skeet?

1 个答案:

答案 0 :(得分:2)

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

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

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

  

代理Windows窗体消息循环

     

默认情况下,System.Windows.Forms.Application类包含主要消息   Windows窗体应用程序的循环。在互操作期间,   Windows窗体消息循环不处理消息。因此,这   逻辑必须再现。处理程序   ComponentDispatcher.ThreadFilterMessage事件执行以下操作   步骤进行:

     

1.使用IMessageFilter界面过滤消息。

     

2.调用Control.PreProcessMessage方法。

     

3.如果需要,翻译和发送消息。

     

4.如果没有其他控件,则将消息发送到主机控件   处理消息。

当窗口句柄被销毁时,WindowsFormsHost控件将自行注册。

有关详细信息,请访问: http://msdn.microsoft.com/en-us/library/ms742474.aspx