【问题标题】:WIndows Forms Chart in WindowsFormsHost does not receive mouse wheel?WindowsFormsHost 中的 WIndows Forms Chart 收不到鼠标滚轮?
【发布时间】:2011-09-14 09:30:22
【问题描述】:

我在 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 的所有点击和鼠标滚轮,但没有来自表单的滚轮。我也尝试了 formsHost 的轮侦听器,但没有成功。

有什么想法吗?乔恩斯基特?

【问题讨论】:

  • Any ideas? Jon Skeet?这应该升级到“meme”状态!!!

标签: wpf forms charts mousewheel windowsformshost


【解决方案1】:

这是 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

【讨论】:

  • 感谢您的解释,但这对我解决问题没有多大帮助。我想我需要手动路由事件,但我不知道如何。我还尝试在 WPF 中捕获鼠标滚轮以将我自己的命令发送到表单,但我也无法在 WPF 中捕获滚轮...您能否提供代码 sn-ps 或如何实际克服该问题的想法?
  • @MartinBookaWeser 我已经为您提供了回答您问题的起点。一步一步的过程已经在那里。我已经按照步骤尝试了解决方案,它有效。请阅读文档。您尝试过这些步骤吗?
猜你喜欢
  • 2012-12-24
  • 1970-01-01
  • 1970-01-01
  • 2013-04-20
  • 1970-01-01
  • 2014-10-01
  • 2012-06-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多