2009-02-04 12 views

Respuesta

14

WPF no incluye el práctico System.Windows.Forms. Pantalla clase, pero aún puede usar sus propiedades para realizar su tarea en su aplicación WinForms.

Supongamos que este significa la ventana de Windows Forms y _wpfWindow es una variable definida por referencia a la ventana de WPF en el ejemplo siguiente (esto sería en cualquier controlador de código configura para abrir la ventana de WPF, como algunos Button.Click manejador):

Screen screen = Screen.FromControl(this); 
_wpfWindow.StartupLocation = System.Windows.WindowStartupLocation.Manual; 
_wpfWindow.Top = screen.Bounds.Top; 
_wpfWindow.Left = screen.Bounds.Left; 
_wpfWindow.Show(); 

el código anterior instancia de la ventana de WPF en la esquina superior izquierda de la pantalla que contiene la ventana de Windows Forms. Le dejaré los cálculos si desea ubicarlos en otra ubicación como la mitad de la pantalla o en un estilo "en cascada" a continuación y a la derecha de la ventana de WinForms.

Otro método que consigue la ventana de WPF en el centro de la pantalla sería utilizar simplemente

_wpfWIndow.StartupLocation = System.Windows.WindowStartupLocation.CenterScreen 

Sin embargo, esto no es tan flexible, ya que utiliza la posición del ratón para averiguar qué pantalla para mostrar la Ventana WPF (y obviamente el mouse podría estar en una pantalla diferente como su aplicación WinForms si el usuario la mueve rápidamente, o si usa un botón predeterminado, o lo que sea).

Editar: Here's a link to an SDK document sobre el uso de InterOp para obtener su ventana WPF centrada en la ventana que no es de WPF. Hace básicamente lo que estaba describiendo en términos de calcular las matemáticas, pero correctamente le permite configurar la propiedad "Propietario" de la Ventana de WPF usando el HWND de la Ventana.

1

Debería poder usar System.Windows.Forms.Screen [1] y usar el método FromControl para obtener la información de la pantalla para el formulario. Puede usar esto para ubicar la ventana de WPF (arriba, izquierda) según la pantalla en la que intenta ubicarlo.

[1] También puede utilizar Win32 MonitorFromRect et al, si no desea cargar los archivos dll WinForms. Sin embargo, como ya tienes la API de winforms, no pagarás ningún golpe de memoria/perf.

6

Aquí está la manera más simple (utiliza WindowStartupLocation.CenterOwner).

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

dialogWindow.ShowDialog(); 

No hay necesidad de interoperabilidad o la creación de coordenadas de la ventana :)

3

Otra forma de hacerlo es:

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; 

este = Su ventana de WPF ...

Cuestiones relacionadas