从支持WinForms互操作的特定位置获得控制

本文关键字:位置 控制 定位 支持 WinForms 互操作 | 更新日期: 2023-09-27 18:05:03

我有一个WPF窗口,其中也包含WinForms控件包装在WindowsFormsHost(除了其他WPF控件)。我想确定在某个位置显示的控件(WPF或WinForms)。

接收WPF控件的位置,我可以使用

VisualTreeHelper.HitTest(wpfWindow, position)

当WindowsFormsHost显示在此位置时,此操作不起作用。在这种情况下,HitTest()返回一个WPF控件,该控件位于WindowsFormsHost的后面。

有什么想法如何让工作也为互操作场景?

从支持WinForms互操作的特定位置获得控制

检查位置是否在窗体边界内。您可以通过在最高级WPF控件和窗体之间创建转换,然后使用坐标0,0来确定边界。结合宿主窗口的宽度和高度,现在就有了窗口的边界。使用转换将您的位置转换为最高级的WPF控件,现在您就有了一种检查位置是否在winform范围内的方法。

在确定鼠标是否在窗体内之后。参考这个问题

如果不在winform中,请使用VisualTreeHelper。

    public Rect HostRect
    {
        get
        {
            var transform = _Host.TransformToVisual(this);
            return new Rect(transform.Transform(new Point(0, 0)), new Point(_Host.ActualWidth, _Host.ActualHeight));
        }
    }