2010-06-25 7 views
38

Secondo la documentazione MSDN per la WindowStartupLocation Property:Come posso ingrandire una finestra WPF sullo schermo con il cursore del mouse?

Impostazione CenterScreen provoca una finestra per essere collocato nel centro dello schermo che contiene il cursore del mouse.

Sebbene il documento MSDN per la CenterScreen Field si definisce un po 'meno chiaramente:

La posizione di avvio di una finestra è il centro dello schermo sul quale si apre.

Un semplice test mostra questo funziona come dovrebbe:

MainWindow.xaml

<Window x:Class="CenterScreenTest.MainWindow" 
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"> 

    <Button Click="button_Click">Open Window</Button> 
</Window> 

MainWindow.xaml.cs

using System.Windows; 

namespace CenterScreenTest 
{ 
    public partial class MainWindow 
    { 
     public MainWindow() 
     { 
      InitializeComponent(); 
     } 

     void button_Click(object sender, RoutedEventArgs e) 
     { 
      Window window = new Window(); 
      window.WindowStartupLocation = WindowStartupLocation.CenterScreen; 
      window.Show(); 
     } 
    } 
} 

Se si prova questo su un doppio sistema di monitoraggio, è possibile vedere che la nuova finestra sarà centrata sullo schermo in cui si trova il cursore del mouse quando si fa clic sul pulsante. Questo è esattamente il modo in cui funziona .

Tuttavia, se si tenta di impostare la finestra di massimizzare prima di mostrare che, la nuova finestra si massimizzare solo sul display da cui è stato lanciato l'applicazione. Modificare il gestore di eventi Button_Click al seguente per vedere quello che voglio dire:

void button_Click(object sender, RoutedEventArgs e) 
{ 
    Window window = new Window(); 
    window.WindowStartupLocation = WindowStartupLocation.CenterScreen; 
    window.WindowState = WindowState.Maximized; 
    window.Show(); 
} 

Ora la finestra ci permetterà di ottimizzare solo sullo schermo dal quale viene avviata l'applicazione, non importa dove il cursore del mouse è quando si fa clic sul pulsante . Se si imposta lo stato della finestra per massimizzata dopo si mostra, CenterScreen funziona correttamente. Questo è equivalente all'utente che ingrandisce la finestra. Per esempio:

void button_Click(object sender, RoutedEventArgs e) 
{ 
    Window window = new Window(); 
    window.WindowStartupLocation = WindowStartupLocation.CenterScreen; 
    window.Show(); 
    window.WindowState = WindowState.Maximized; 
} 

Il problema qui, naturalmente, è che massimizzando la finestra dopo che mostra ci vuole molto più tempo e in un app come la mia, la finestra ha bisogno di pop in luogo immediatamente.

Qualcuno sa di una soluzione?

risposta

36

ho chiesto la stessa domanda sulla WPF Forum MSDN e ottenuto una risposta con this awesome workaround:

void button_Click(object sender, RoutedEventArgs e) 
{ 
    Window window = new Window(); 
    window.WindowStartupLocation = WindowStartupLocation.CenterScreen; 
    window.SourceInitialized += (s, a) => window.WindowState = WindowState.Maximized; 
    window.Show(); 
} 

Ho anche presentato una bug report su questo problema a Microsoft che stanno attualmente rivedendo.

5

Assicurarsi che SizeToContent è impostato su SizeToContent.Manual, altrimenti non funzionerà.

+0

In realtà è necessario fare ** entrambi ** quelle cose. Si prega di vedere la mia risposta per essere sicuro. +1 comunque. –

69

È possibile impostare in XAML

<Window Height="300" Width="300" WindowState="Maximized"> 
</Window> 

È necessario impostare SizeToContent-Manuale. Vedi altre risposte per i dettagli.

3

A partire dalla finestra, il massimo può essere ottenuto aggiungendo il markup XAML.

<Window Height="300" Width="300" 
    WindowState="Maximized" 
    SizeToContent="Manual"> 
</Window> 

La proprietà WindowState è subordinato al SizeToContent, il che significa che è necessario impostare quest'ultimo manuale (se lo si desidera la massimizzazione reale). È anche possibile impostare SizeToContent a Altezza o Larghezza (se si desidera massimizzare la finestra in una dimensione, mentre si obbedisce alla dimensione calcolata in base alle dimensioni dei controlli nell'altra).

<Window Height="300" Width="300" 
    WindowState="Maximized" 
    SizeToContent="Width"> 
</Window> 

Quanto sopra farà sì che la finestra si estenda dall'alto verso il basso ma non necessariamente da sinistra a destra. È equivalente alla combinazione di tasti Win + Shift + Su.