Подтвердить что ты не робот

Отображение окна с WPF, Winforms и Dual мониторами

У меня есть 2 монитора и приложение WinForm, которое запускает окно WPF. Я хочу получить экран, на котором включен WinForm, и показать окно WPF на том же экране. Как я могу это сделать?

4b9b3361

Ответ 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, вы не собираетесь платить за какой-либо захват памяти/перфоратора.