2009-09-08 6 views
6

Je sais que WPF a une valeur "CentreScreen" pour centrer une fenêtre sur le bureau. Cependant, sur un double moniteur, ce n'est pas très agréable.Wpf - centrage sur le bureau principal

Comment centrer sur le moniteur principal? Dois-je passer par la chanson et la danse de la détection du bureau principal, obtenir sa géométrie, etc, ou y a-t-il une meilleure façon?

+0

+1, bonne question. Nous avons également dû aller jusqu'à travailler avec wpf via Citrix et lutter contre les problèmes de centrage/maximisation et de Citrix de wpf aussi! :) – Russell

Répondre

5

Plusieurs écrans sont un peu un problème et il n'a pas de manière intégrée, bien récurée pour les manipuler, mais avec certains maths et SystemParameters vous pouvez le faire.

Si vous positionnez votre fenêtre à la position (0,0) qui serait le coin supérieur gauche de votre écran principal. Ainsi, afin de rendre votre fenêtre apparaît au centre de cette utilisation de l'écran:

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

L'idée de base est assez simple, donc pas besoin d'expliquer.

Notez que ce code est pour C#, mais je suis sûr que VB a quelque chose de similaire.

Notez également que vous devez utiliser la propriété ActualWidth \ ActualHeight et non la propriété Width \ Height car elle peut contenir une valeur NaN.

Bonne chance.

+0

Merci. Je suppose que la réponse est que nous devons le faire à l'ancienne, ce à quoi je m'attendais. :) –

0

Nous avons eu le même problème. Malheureusement, après beaucoup de discussions avec les AT et le client, il a été décidé d'avoir une meilleure valeur (en termes d'argent et de temps) pour le maximiser sur le moniteur principal.

0

Utilisez SystemParameters.WorkArea. Cela vous donne une partie du moniteur principal qui n'est pas repris par la barre des tâches, ce qui devrait vous donner un meilleur centrage.

0

Ceci est ma solution purement WPF pour centrer une fenêtre sur le moniteur principal avec une bordure d'espace vide autour de lui (parce que je ne veux pas maximisé). Mon installation est un moniteur carré sur ma gauche et un écran large sur ma droite. Cela a été testé avec chaque moniteur étant défini comme le moniteur principal dans Windows.

Avant d'arriver à cette solution, il y a trois propriétés utiles sur System.Windows.SystemParameters qui donnent différentes hauteurs. Les chiffres donnés sont pour mon écran large 1920x1080.

  • PrimaryScreenHeight - 1080. La hauteur réelle de résolution définie dans Windows.
  • WorkArea.Height - 1040. La hauteur de résolution réelle moins la barre de démarrage
  • FullPrimaryScreenHeight - 1018. La résolution réelle moins la barre de démarrage et moins l'en-tête de la fenêtre.

C'est ma solution et j'utiliser 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; 
    } 
Questions connexes