У меня есть 2 монитора и приложение WinForm, которое запускает окно WPF. Я хочу получить экран, на котором включен WinForm, и показать окно WPF на том же экране. Как я могу это сделать?
Отображение окна с WPF, Winforms и Dual мониторами
Ответ 1
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, если пользователь его перемещает быстро, или вы используете кнопку по умолчанию или что-то еще).
Изменить: Здесь ссылка на документ SDK об использовании InterOp, чтобы получить окно WPF, ориентированное на окно, отличное от WPF. Это в основном то, что я описывал с точки зрения вычисления математики, но правильно позволяет вам установить свойство "Владелец" окна WPF Window с помощью Window HWND.
Ответ 2
Здесь самый простой способ (использует WindowStartupLocation.CenterOwner).
MyDialogWindow dialogWindow = new MyDialogWindow();
dialogWindow.Owner = this;
dialogWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner;
dialogWindow.ShowDialog();
Нет необходимости в взаимодействии или настройке оконных коордов:)
Ответ 3
Другой способ сделать это:
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;
this = ваше окно WPF...
Ответ 4
Вы можете использовать System.Windows.Forms.Screen [1] и использовать метод FromControl для получения информации о экране для формы. Затем вы можете использовать это для позиционирования окна WPF (сверху, слева) на основе экрана, на котором вы пытаетесь найти его.
[1] Вы также можете использовать win32 MonitorFromRect и др., если вы не загружаете DLL WinForms. Однако, поскольку у вас уже есть API winforms, вы не собираетесь платить за какой-либо захват памяти/перфоратора.