gpt4 book ai didi

wpf - 当托管在 WinForms 容器中时,WPF ScrollViewer 不会接收鼠标事件

转载 作者:行者123 更新时间:2023-12-03 15:53:38 25 4
gpt4 key购买 nike

我们有一个正在逐步转换为 WPF 的 WinForms 应用程序。此时应用程序的主窗体是一个窗体 (WinForms),它包含一个内置在 WPF 中的垂直侧边栏。侧边栏托管在 ElementHost 控件中。

侧边栏由包含其他控件的 ScrollViewer 组成。问题是,当焦点位于 WinForms aera 中的某个位置并且我在 ScrollViewer 上使用鼠标滚轮时,它不会滚动。

这与 WPF/WinForms 集成有关,因为在 100% WPF 项目中,即使焦点位于另一个控件上,ScrollViewer 也会对鼠标滚轮使用react。

解决此问题的正确方法是什么?

最佳答案

考虑做一个消息过滤器,当你收到 WM_MOUSEWHEEL 时,确定鼠标是否在你的 WPF 控件上。如果是,则将消息直接发送到您的 Element 窗口句柄。

像这样的东西:

System.Windows.Forms.Application.AddMessageFilter( new MouseWheelMessageFilter( YourElementInsideAnElementHost ) );

超出范围时不要忘记调用 RemoveMessageFilter
public class MouseWheelMessageFilter : IMessageFilter
{
private const int WM_MOUSEWHEEL = 0x020A;
private FrameworkElement _element;

[DllImport("user32.dll")]
public static extern int SendMessage(IntPtr hWnd, int Msg, IntPtr wParam, IntPtr lParam);

public MouseWheelMessageFilter(FrameworkElement element)
{
_element = element;
}

public bool PreFilterMessage(ref Message m)
{
if (m.Msg == WM_MOUSEWHEEL)
{
Rect rect = new Rect(0, 0, _element.ActualWidth, _element.ActualHeight);
Point pt = Mouse.GetPosition(_element);

if (rect.Contains(pt))
{
HwndSource hwndSource = (HwndSource)HwndSource.FromVisual(_element);
SendMessage(hwndSource.Handle, m.Msg, m.WParam, m.LParam);
return true;
}
}

return false;
}
}

关于wpf - 当托管在 WinForms 容器中时,WPF ScrollViewer 不会接收鼠标事件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5723290/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com