2009-02-04 3 views

ответ

14

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 окна.

1

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

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

6

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

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

dialogWindow.ShowDialog(); 

Нет необходимости Interop или установка окна COORDS :)

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; 

это = ваше окно WPF ...

 Смежные вопросы

  • Нет связанных вопросов^_^