WPF:一次移动并调整窗口大小

时间:2011-08-16 09:15:04

标签: wpf window resize

在Win32 API中,函数SetWindowPos提供了一种简单的方法来一次移动和调整窗口大小。

但是,在WPF类Window中没有类似SetWindowPos的方法。所以我必须编写如下代码:

        this.Left += e.HorizontalChange;
        this.Top += e.VerticalChange;
        this.Width = newWidth;
        this.Height = newHeight;

当然,它运作良好,但并不简单。它看起来很脏。

如何移动窗口并立即调整大小?

是否有API?

2 个答案:

答案 0 :(得分:7)

我知道你已经解决了你的问题,但我会发布一个我发现的解决方案以防万一。

基本上,你必须声明SetWindowsPos是来自Win32的导入函数,这是签名

[DllImport("user32.dll", CharSet = CharSet.Auto)]
[return: MarshalAs(UnmanagedType.Bool)]
private static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, SetWindowPosFlags uFlags);

该函数需要窗口的hWnd,为了获得它,您可以在窗口初始化时添加处理程序(例如,您可以监听“SourceInitialized”事件)并将该值存储在私有成员中。班级:

hwndSource = PresentationSource.FromVisual((Visual)sender) as HwndSource;

WPF管理与设备无关的像素,因此您甚至需要为您的屏幕提供从倾角到真实像素的转换器。这是通过这些方式完成的:

var source = PresentationSource.FromVisual(this);
Matrix transformToDevice = source.CompositionTarget.TransformToDevice;
Point[] p = new Point[] { new Point(this.Left + e.HorizontalChange, this.Top), new Point(this.Width - e.HorizontalChange, this.Height) };
transformToDevice.Transform(p);

最后你可以调用SetWindowsPos:

SetWindowPos(this.hwndSource.Handle, IntPtr.Zero, Convert.ToInt32(p[0].X), Convert.ToInt32(p[0].Y), Convert.ToInt32(p[1].X), Convert.ToInt32(p[1].Y), SetWindowPosFlags.SWP_SHOWWINDOW);

来源:

答案 1 :(得分:1)

您可以将代码包装在辅助方法中。就像这样:

public static class WindowExtensions {
    public static void MoveAndResize( this Window value, double horizontalChange, double verticalChange, double width, double height ) {
        value.Left += horizontalChange;
        value.Top += verticalChange;
        value.Width = width;
        value.Height = height;
    }
}

所以你的调用代码如下所示:

this.MoveAndResize( 10, 10, 1024, 768 );

我已经离开了命名空间并使用了声明,在复制时请记住这一点。

修改

您也可以使用API​​。我个人坚持使用托管代码,除非我真的需要使用API​​。但这取决于你。