Syl*_*ain 6 wpf winforms-interop winforms
我们有一个WinForms应用程序,我们正在逐步转换为WPF.此时应用程序的主窗体是一个Form(WinForms),它包含一个用WPF构建的垂直侧边栏.侧栏托管在ElementHost控件中.
侧边栏由包含其他控件的ScrollViewer组成.问题是,当焦点位于WinForms aera中的某个位置并且我在ScrollViewer上使用鼠标滚轮时,它不会滚动.
这与WPF/WinForms集成有关,因为在100%WPF项目中,即使焦点在另一个控件上,ScrollViewer也会对鼠标滚轮作出反应.
解决这个问题的正确方法是什么?
考虑执行消息过滤器,当您收到 WM_MOUSEWHEEL 时,确定鼠标是否位于 WPF 控件上方。如果是这样,则将消息直接发送到您的元素窗口句柄。
像这样的东西:
System.Windows.Forms.Application.AddMessageFilter( new MouseWheelMessageFilter( YourElementInsideAnElementHost ) );
Run Code Online (Sandbox Code Playgroud)
当你超出范围时不要忘记调用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;
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2099 次 |
| 最近记录: |