2011-08-16 41 views
4

在Win32 API中,函數SetWindowPos提供了一種簡單的方法來一次移動和調整窗口大小。WPF:一次移動和調整窗口大小

但是,在WPF類Window中沒有像SetWindowPos這樣的方法。所以我必須編碼如下:

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

當然,它運作良好,但並不簡單。它看起來很髒。

我該如何移動一個窗口並一次調整大小?

是否有API?

+0

你仍然可以使用API 。 – Code0987

回答

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​​。但這取決於你。

+0

毫米。好。我將使用API​​。正如你所知道的那樣,連續左轉頂部寬度會導致髒的外觀。 – mjk6026

6

我知道你已經解決了你的問題,但我會發佈一個解決方案,我發現它可以幫助其他人。

基本上,您必須聲明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管理設備無關的像素,讓你從浸需要甚至轉換器真正的像素爲您的sc穎。這是通過這些線路進行:

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

對此很好的回答,但我有點驚呆了,WPF不支持直接移動/調整窗口大小。哇。事情是,我沒有找到任何更好的「wpf-ish」方式來做到這一點。 – DarinH

+0

這應該被標記爲正確的答案,因爲它解決了**事件鏈接**的根本問題。 – arionik

+0

我正在學習WPF,並驚訝於它使一些次要任務有多困難。不得不引用API DLL來設置窗口位置是荒謬的。 –