2011-08-16 46 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

mm。 OK。私はAPIを使用します。ご存知のように、左上の幅の高さを連続的に変化させると、汚れた外観が発生します。 – mjk6026

6

私は既にあなたの問題を解決していることは知っていますが、他の人に役立つ場合に見つけた解決策を投稿します。

基本的に、あなたはそれを得るために、あなたは初期化時にハンドラを追加することができ、Win32のからインポート機能としてSetWindowsPosは、この関数は、あなたのウィンドウのhWndをを必要とする署名

[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); 

であることを宣言しなければなりませんあなたの窓の(たとえばあなたが「SourceInitialized」イベントをリッスンできる)と、クラスのprivateメンバにその値を格納します。

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

WPFは、デバイスに依存しないピクセルを管理するので、あなたはディップからにしても、コンバータを必要としますあなたのscの実際のピクセルreen。これは、これらの行で行われます。

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を参照するのはばかげています。 –

関連する問題