У меня есть 2 монитора и приложение WinForm, которое запускает окно WPF. Я хочу получить экран, на котором включен WinForm, и показать окно WPF на том же экране. Как я могу это сделать?Отображение окна с WPF, Winforms и Dual мониторов
ответ
WPF не содержит удобные System.Windows.Forms. Экран, но вы можете использовать его свойства для выполнения своей задачи в своем приложении WinForms.
Предположит, что это означает окно WinForms и _wpfWindow является определенным переменной ссылкой на WPF окна в приведенном ниже примере (это было бы в любом коде обработчика установить, чтобы открыть окно WPF, как некоторые Button.Click обработчик):
Screen screen = Screen.FromControl(this);
_wpfWindow.StartupLocation = System.Windows.WindowStartupLocation.Manual;
_wpfWindow.Top = screen.Bounds.Top;
_wpfWindow.Left = screen.Bounds.Left;
_wpfWindow.Show();
Приведенный выше код экземпляра окна WPF в верхнем левом углу экрана, содержащего ваш WinForms окно. Я оставлю вам математику, если вы хотите разместить ее в другом месте, например, в середине экрана или в «каскадном» стиле ниже и справа от окна WinForms.
Другой метод, который получает окно WPF в середине экрана будет просто использовать
_wpfWIndow.StartupLocation = System.Windows.WindowStartupLocation.CenterScreen
Однако это не совсем так гибким, поскольку он использует положение мыши, чтобы выяснить, какие экран для отображения окна WPF (и, очевидно, мышь может быть на другом экране в качестве вашего приложения WinForms, если пользователь быстро его перемещает, или вы используете кнопку по умолчанию или что-то еще).
Редактировать: Here's a link to an SDK document об использовании InterOp, чтобы получить окно WPF по центру окна, отличного от WPF. Это в основном то, что я описывал с точки зрения вычисления математики, но правильно позволяет вам установить свойство «Владелец» окна WPF Window с помощью HWND окна.
Вы должны использовать System.Windows.Forms.Screen [1] и использовать метод FromControl для получения информации о экране для формы. Затем вы можете использовать это для позиционирования окна WPF (сверху, слева) на основе экрана, на котором вы пытаетесь найти его.
[1] Вы также можете использовать win32 MonitorFromRect и др., Если вы не загружаете DLL WinForms. Однако, поскольку у вас уже есть API winforms, вы не собираетесь платить за какой-либо взлом памяти/перфоратора.
Вот простейший способ (использует WindowStartupLocation.CenterOwner).
MyDialogWindow dialogWindow = new MyDialogWindow();
dialogWindow.Owner = this;
dialogWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner;
dialogWindow.ShowDialog();
Нет необходимости Interop или установка окна COORDS :)
Другой способ сделать это:
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 ...