2 つのモニターと、WPF ウィンドウを起動する WinForm アプリがあります。WinFormがオンになっている画面を取得し、同じ画面にWPFウィンドウを表示したい。これどうやってするの?
4 に答える
WPF には便利な System.Windows.Forms が含まれていません。Screenクラスですが、そのプロパティを使用して、WinForms アプリケーションでタスクを実行できます。
これは、WinForms ウィンドウを意味し、_wpfWindowは、以下の例の WPF ウィンドウを参照する定義済み変数であると仮定します (これは、Button.Click ハンドラーのように、WPF ウィンドウを開くために設定したコード ハンドラーにあります)。
Screen screen = Screen.FromControl(this);
_wpfWindow.StartupLocation = System.Windows.WindowStartupLocation.Manual;
_wpfWindow.Top = screen.Bounds.Top;
_wpfWindow.Left = screen.Bounds.Left;
_wpfWindow.Show();
上記のコードは、WinForms ウィンドウを含む画面の左上隅にある WPF ウィンドウをインスタンス化します。画面の中央などの別の場所に配置したり、WinForms ウィンドウの右下に「カスケード」スタイルで配置したい場合は、数学をお任せします。
画面の中央にある WPF ウィンドウを取得する別の方法は、単に使用することです
_wpfWIndow.StartupLocation = System.Windows.WindowStartupLocation.CenterScreen
ただし、これはマウスの位置を使用して WPF ウィンドウを表示する画面を決定するため、それほど柔軟ではありません (また、ユーザーがマウスをすばやく動かした場合、マウスは WinForms アプリとは異なる画面上にある可能性があります。デフォルトのボタンなどを使用します)。
編集:これは、InterOp を使用して WPF ウィンドウを非 WPF ウィンドウの中央に配置することに関するSDK ドキュメントへのリンクです。基本的に、数学を理解するという点で説明したことを行いますが、ウィンドウの HWND を使用して WPF ウィンドウの「所有者」プロパティを正しく設定できます。
これが最も簡単な方法です (WindowStartupLocation.CenterOwner を使用します)。
MyDialogWindow dialogWindow = new MyDialogWindow();
dialogWindow.Owner = this;
dialogWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner;
dialogWindow.ShowDialog();
相互運用やウィンドウ座標の設定は必要ありません:)
それを行う別の方法は次のとおりです。
WindowInteropHelper helper = new WindowInteropHelper(this);
this.StartupLocation = System.Windows.WindowStartupLocation.Manual;
this.Left = System.Windows.Forms.Screen.FromHandle(helper.Handle).Bounds.Left;
this.Top = System.Windows.Forms.Screen.FromHandle(helper.Handle).Bounds.Top;
これ=あなたのWPFウィンドウ...
System.Windows.Forms.Screen [1] を使用し、FromControl メソッドを使用してフォームの画面情報を取得できるはずです。これを使用して、位置を特定しようとしている画面に基づいて WPF ウィンドウ (上、左) を配置できます。
[1] WinForms dll をロードしない場合は、win32 MonitorFromRect などを使用することもできます。ただし、既に winforms API を取得しているため、メモリ/パフォーマンス ヒットを支払う必要はありません。