2009-09-08 17 views
6

So che WPF ha un valore "CenterScreen" per centrare una finestra sul desktop. Tuttavia, sul doppio monitor, non è molto piacevole.Wpf - centratura sul desktop primario

Come si centra sul monitor principale? Devo passare attraverso la canzone e la danza per rilevare il desktop principale, ottenere la sua geometria, ecc. O c'è un modo migliore?

+0

+1, buona domanda. Dovevamo anche lavorare con wpf attraverso Citrix e combattere anche i problemi di centratura/massimizzazione e Citrixes di wpf! :) – Russell

risposta

5

Gli schermi multipli sono un po 'un problema e non hanno un modo integrato e ben strutturato per gestirli, ma con un po' di matematica e SystemParameters puoi farlo.

Se posizioni la finestra nella posizione (0,0) che sarebbe l'angolo in alto a sinistra della schermata principale. Quindi, al fine di rendere la vostra finestra appaiono al centro di tale uso dello schermo:

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

L'idea di base è abbastanza semplice quindi non c'è bisogno di spiegare.

Nota questo codice è per C#, ma sono sicuro che VB ha qualcosa di simile.

Si noti inoltre che è necessario utilizzare la proprietà ActualWidth \ ActualHeight e non la proprietà Width \ Height in quanto potrebbe contenere un valore NaN.

Buona fortuna.

+0

Grazie. Credo che la risposta sia che dobbiamo farlo alla vecchia maniera, che è quello che mi aspettavo. :) –

0

Abbiamo avuto lo stesso problema. Sfortunatamente, dopo molte discussioni con TA e il cliente, è stato deciso di avere un valore migliore (in termini di tempo e denaro) per massimizzarlo sul monitor principale.

0

Utilizzare SystemParameters.WorkArea. Questo ti dà una parte del monitor principale che non è occupato dalla barra delle applicazioni, che dovrebbe darti un centraggio migliore.

0

Questa è la mia soluzione puramente WPF per centrare una finestra sul monitor principale con un bordo di spazio vuoto attorno (perché non lo desidero ingrandito). Il mio setup è un monitor quadrato sulla mia sinistra e un widescreen alla mia destra. Questo è stato testato con ciascun monitor impostato come monitor principale in Windows.

Prima di arrivare a questa soluzione, ci sono tre proprietà utili su System.Windows.SystemParameters che danno varie altezze. I numeri dati sono per il mio widescreen 1920x1080.

  • PrimaryScreenHeight - 1080. L'altezza di risoluzione effettiva impostata in Windows.
  • WorkArea.Height - 1040. L'altezza reale risoluzione meno la barra di avvio
  • FullPrimaryScreenHeight - 1018. La risoluzione effettiva meno lo start e meno l'intestazione della finestra.

Questa è la mia soluzione e io uso 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; 
    }