在鼠标位置(鼠标左上角)显示WPF窗口的最佳方法是什么?

e5njpo68  于 2023-03-31  发布在  其他
关注(0)|答案(4)|浏览(149)

我发现,通过继承Windows窗体鼠标点并减去窗口的高度和宽度来设置左侧和顶部(因为我的窗口大小是固定的),这在一定程度上是有效的:

MyWindowObjectThatInheritsWindow window = new MyWindowObjectThatInheritsWindow();
System.Windows.Point mouseLocation = GetMousePositionWindowsForms();
window.Left = mouseLocation.X - 300;
window.Top = mouseLocation.Y - 240;
window.Show();

编辑:这里是获取鼠标位置的代码...

public System.Windows.Point GetMousePositionWindowsForms()
{
    System.Drawing.Point point = System.Windows.Forms.Control.MousePosition;
    return new System.Windows.Point(point.X, point.Y);
}

请注意,这是通过使窗口的右下角接触鼠标光标的左上角来实现的。但这会破坏不同的屏幕分辨率,或者可能是不同分辨率的多个显示器?我还没有完全缩小范围,但我刚刚在另一台PC上尝试了相同的代码,它似乎不会在鼠标光标的左上角生成窗口,而是在鼠标光标的左下角生成窗口。再过一段距离
我可能应该将我的窗口大小添加到内容,宽度和高度,所以我不能只使用ActualWidth和ActualHeight属性,因为它们不可用。也许问题在于如何正确调整大小?有什么方法可以做到这一点吗?我确信300和240是正确的,根据我的主PC,两个显示器运行1920 x1080分辨率,因为我已经计算了窗口中所有对象的宽度和高度,并且我已经明确地调整了大小。刚刚尝试明确地将高度和宽度设置为240/300,以确保窗口不再根据内容调整大小,当减去实际高度和宽度时,我仍然有这个问题!
有什么想法吗

tyg4sfes

tyg4sfes1#

最后,这一招奏效了:

protected override void OnContentRendered(EventArgs e)
        {
            base.OnContentRendered(e);
            MoveBottomRightEdgeOfWindowToMousePosition();
        }

        private void MoveBottomRightEdgeOfWindowToMousePosition()
        {
            var transform = PresentationSource.FromVisual(this).CompositionTarget.TransformFromDevice;
            var mouse = transform.Transform(GetMousePosition());
            Left = mouse.X - ActualWidth;
            Top = mouse.Y - ActualHeight;
        }

        public System.Windows.Point GetMousePosition()
        {
            System.Drawing.Point point = System.Windows.Forms.Control.MousePosition;
            return new System.Windows.Point(point.X, point.Y);
        }
agxfikkp

agxfikkp2#

你能不能不要用这样的东西?:

Point mousePositionInApp = Mouse.GetPosition(Application.Current.MainWindow);
Point mousePositionInScreenCoordinates = 
    Application.Current.MainWindow.PointToScreen(mousePositionInApp);

我还没能测试它,但我认为它应该工作。
更新〉〉〉
你不必在这些方法中使用Application.Current.MainWindow作为参数...如果你在处理程序中可以访问一个Button或另一个UIElement,它 * 应该 * 仍然可以工作:

Point mousePositionInApp = Mouse.GetPosition(openButton);
Point mousePositionInScreenCoordinates = openButton.PointToScreen(mousePositionInApp);

同样,我还没有能够测试这个,但如果它也失败了,那么你可以在How do I get the current mouse screen coordinates in WPF?帖子中找到另一个方法。

svujldwt

svujldwt3#

您也可以通过稍微修改初始示例并在显示窗口之前定位窗口来完成此操作。

MyWindowObjectThatInheritsWindow window = new MyWindowObjectThatInheritsWindow();

var helper = new WindowInteropHelper(window);
var hwndSource = HwndSource.FromHwnd(helper.EnsureHandle());
var transformFromDevice = hwndSource.CompositionTarget.TransformFromDevice;

System.Windows.Point wpfMouseLocation = transformFromDevice.Transform(GetMousePositionWindowsForms());
window.Left = wpfMouseLocation.X - 300;
window.Top = wpfMouseLocation.Y - 240;
window.Show();
8aqjt8rx

8aqjt8rx4#

你也可以这样做:

private void Button_Click(object sender, RoutedEventArgs e)
{
    ConfigWindow cw = new ConfigWindow();
    var transform = PresentationSource.FromVisual(this).CompositionTarget.TransformFromDevice;
    var mouse = transform.Transform(GetMousePosition());
    cw.WindowStartupLocation = WindowStartupLocation.Manual;
    cw.Left = mouse.X - cw.ActualWidth;
    cw.Top = mouse.Y - cw.ActualHeight;
    cw.Show();
}

public System.Windows.Point GetMousePosition()
{
    System.Drawing.Point point = System.Windows.Forms.Control.MousePosition;
    return new System.Windows.Point(point.X, point.Y);
}

相关问题