2009-09-08 27 views
6

Sé que WPF tiene un valor "CenterScreen" para centrar una ventana en el escritorio. Sin embargo, en el monitor doble, eso no es muy agradable.Wpf: centrado en el escritorio principal

¿Cómo centrar el monitor primario? ¿Debo pasar por la canción y la danza de detectar el escritorio principal, obtener su geometría, etc. o hay una forma mejor?

+0

+1, buena pregunta. ¡También teníamos que trabajar con wpf a través de Citrix y luchar contra los problemas de centrado y maximización de wpf y Citrixes también! :) – Russell

Respuesta

5

Las pantallas múltiples son un problema y no tienen una forma incorporada, bien grapada para manejarlas, pero con algunos cálculos matemáticos y parámetros del sistema se puede hacer.

Si coloca su ventana en la posición (0,0) que sería la esquina superior izquierda de su pantalla principal. Así que con el fin de hacer que su ventana aparece en el centro de ese uso de la pantalla:

this.Left = (SystemParameters.PrimaryScreenWidth/2) - (this.ActualWidth/2); 
this.Top = (SystemParameters.PrimaryScreenHeight/2) - (this.ActualHeight/2); 

La idea básica es bastante simple por lo que no hay necesidad de explicar.

Tenga en cuenta que este código es para C#, pero estoy seguro de que VB tiene algo similar.

También tenga en cuenta que debe usar la propiedad ActualWidth \ ActualHeight y no la propiedad Width \ Height, ya que podría contener un valor NaN.

Buena suerte.

+0

Gracias. Supongo que la respuesta es que tenemos que hacerlo a la vieja usanza, que es lo que esperaba. :) –

0

Tuvimos el mismo problema. Desafortunadamente, después de mucha discusión con los TA y el cliente, se decidió tener un mejor valor (en términos de dinero y tiempo) para maximizarlo en el monitor principal.

0

Esta es mi solución puramente WPF para centrar una ventana en el monitor principal con un borde de espacio vacío alrededor (porque no lo quiero maximizar). Mi configuración es un monitor cuadrado a la izquierda y una pantalla ancha a mi derecha. Esto se probó con cada monitor configurado como monitor principal en Windows.

Antes de llegar a esa solución, hay tres propiedades útiles en System.Windows.SystemParameters que dan varias alturas. Los números dados son para mi pantalla panorámica de 1920x1080.

  • PrimaryScreenHeight - 1080. La altura de resolución real establecida en Windows.
  • WorkArea.Height - 1040. La altura real de resolución menos la barra de inicio
  • FullPrimaryScreenHeight - 1018. La resolución real menos la barra de inicio y menos la cabecera de la ventana.

Esta es mi solución y utilizo WorkArea.Height:

protected T SetWindowLocation<T>(T window) where T : Window 
    { 
     //This function will set a window to appear in the center of the user's primary monitor. 
     //Size will be set dynamically based on resoulution but will not shrink below a certain size nor grow above a certain size 

     //Desired size constraints. Makes sure window isn't too small if the users monitor doesn't meet the minimum, but also not too big on large monitors 
     //Min: 1024w x 768h 
     //Max: 1400w x 900h 

     const int absoluteMinWidth = 1024; 
     const int absoluteMinHeight = 768; 
     const int absoluteMaxWidth = 1400; 
     const int absoluteMaxHeight = 900; 

     var maxHeightForMonitor = System.Windows.SystemParameters.WorkArea.Height - 100; 
     var maxWidthForMonitor = System.Windows.SystemParameters.WorkArea.Width - 100; 

     var height = Math.Min(Math.Max(maxHeightForMonitor, absoluteMinHeight), absoluteMaxHeight); 
     var width = Math.Min(Math.Max(maxWidthForMonitor, absoluteMinWidth), absoluteMaxWidth); 

     window.Height = height; 
     window.Width = width; 
     window.Left = (System.Windows.SystemParameters.FullPrimaryScreenWidth - width)/2; 
     window.Top = (System.Windows.SystemParameters.FullPrimaryScreenHeight - height)/2; 
     window.WindowStartupLocation = WindowStartupLocation.Manual; 

     return window; 
    } 
Cuestiones relacionadas