Отображение окна с WPF, Winforms и Dual мониторами - PullRequest
12 голосов
/ 04 февраля 2009

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

Ответы [ 4 ]

14 голосов
/ 04 февраля 2009

WPF не включает удобный класс System.Windows.Forms. Класс Screen , но вы все равно можете использовать его свойства для выполнения своей задачи в приложении WinForms.

Предположим, что this означает окно 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 с помощью HWND окна.

6 голосов
/ 25 марта 2009

Вот самый простой способ (использует WindowStartupLocation.CenterOwner).

MyDialogWindow dialogWindow = new MyDialogWindow();
dialogWindow.Owner = this;
dialogWindow.WindowStartupLocation = WindowStartupLocation.CenterOwner;

dialogWindow.ShowDialog();

Нет необходимости для взаимодействия или установки оконных координат:)

3 голосов
/ 29 августа 2012

Еще один способ сделать это:

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 ...

1 голос
/ 04 февраля 2009

Вы должны быть в состоянии использовать System.Windows.Forms.Screen [1] и использовать метод FromControl для получения экранной информации для формы. Затем вы можете использовать это для позиционирования окна WPF (вверху, слева) на основе экрана, на котором вы пытаетесь его найти.

[1] Вы также можете использовать win32 MonitorFromRect и др., Если не загружаете библиотеки WinForms. Тем не менее, поскольку у вас уже есть API-интерфейс winforms, вы не собираетесь платить за память / перфоманс.

...