2009-09-23 14 views
17

Desidero ottenere lo stesso effetto di Windows Media Player o dei lettori Flash basati su browser che occupano l'INTERO (anche se la barra delle applicazioni è visibile) quando ottimizzato.Finestra WPF con stile = Nessuna barra delle applicazioni di copertura ingrandita dopo l'inizializzazione dell'app

Questo funziona bene se il WindowState è impostato su Maximized e la WindowStyle è impostato su None in XAML per cui l'applicazione viene avviata in quello stato. Il problema è che voglio avviare l'app in una finestra confinata e quando l'utente sceglie, massimizza come specificato sopra. Nel gestore StateChanged controllo lo stato Maximized e in tal caso imposto lo WindowStyle su None. Questo ha l'effetto di massimizzare la finestra ma NON copre la barra delle applicazioni. Il seguente codice farà questo lavoro come voglio, ma la sua un hack e mi piacerebbe ripulirlo:

if (WindowState == WindowState.Maximized) 
{ 
    m_videoWindow.Maximize(); 

    WindowStyle = WindowStyle.None; 

    //the following makes this work but I would like to clean it up 
    Hide(); 
    Show(); 
} 

EDITThis (a partire dal 2006, quando ancora in CTP) menziona il problema e qualcuno da MS afferma che sperano di migliorare il supporto a schermo intero nella prossima versione, sono stati apportati questi miglioramenti?

+0

Questo problema è ancora vivo e vegeto con tutte le ultime versioni di WPF/.NET 4.0 ... - Suppongo che Microsoft volesse che questo bug fosse retrocompatibile ... la correzione hide/show funziona benissimo anche se ... Sto facendo il mio in modo un po 'diverso, chiamando Hide, impostando le proprietà, quindi chiamando Show. – BrainSlugs83

+0

Beh, dannazione. Ho notato che alcuni dei miei controlli non vengono ridimensionati correttamente, non ho idea del perché (né con il mio ordine, né con il tuo ordine ...); La soluzione rapida era Massimizzare, chiamare DoEvents(), impostare WindowStyle su None, quindi chiamare Hide & Show. - DoEvents è ovviamente System.Windows.Forms.Application.DoEvents() (Sì, lo so che è folle, e probabilmente la peggiore pratica, ma funziona ...) – BrainSlugs83

risposta

13

Questo articolo spiega tutto: Maximizing window (with WindowStyle=None) considering Taskbar.

Anche vale la pena di verificare: Custom Window Chrome in WPF.

Edit: Ora di nuovo, è la shell Biblioteca integrazione WPF che permette completo restyle della finestra di Chrome, senza il mal di testa di reimplementare spostamento, ridimensionamento, ecc

Edit 2015: Shell Integrazione biblioteca è ora integrato in WPF e MS ritirato il codice

+0

Grazie Eduardo. L'avevo letto ma speravo che esistesse una soluzione che non richiedesse Win32. Sono sicuro che ci dev'essere qualcosa, come funziona l'hack che menziono sopra ... –

+0

Immagino che non ci sia, perché il comportamento è di progettazione, quindi puoi avere una finestra che occupa tutto il desktop, come BabySmash. –

+1

Non è strano però che quando si carica inizialmente la finestra con WindowStyle = None e WindowState = Maximized la barra delle applicazioni è oscurata ma quando si ingrandisce la finestra dopo averla caricata questo non è il caso? –

1

Non so se questo è ok per te, ma puoi ridimensionare la finestra per avere le stesse dimensioni dell'area di lavoro (cioè, nella maggior parte dei casi, tutto lo schermo tranne la barra delle applicazioni) e individuarlo a 0,0 (angolo in alto a sinistra):

Width = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Width; 
Height = System.Windows.Forms.Screen.PrimaryScreen.WorkingArea.Height; 
Left = 0; 
Top = 0; 

La definizione esatta per la proprietà WorkingArea (da MSDN) è:

Ottiene l'area di lavoro del display. L'area di lavoro è l'area desktop del display, escluse le barre delle applicazioni, le finestre ancorate e le barre degli strumenti ancorate.

Speranza che aiuta

+0

Cosa succede se la barra delle applicazioni è in cima? O hai più monitor? –

+0

In tal caso, ciò non funzionerà come previsto. – Fix

+0

Sì, ho avuto la stessa idea, ma ho avuto la stessa obiezione. Peccato non è semplice interrogare su quale monitor è attiva l'applicazione, e ottenere l'RECT esatto per quel monitor ... probabilmente c'è qualche chiamata interopatica per farlo, ma avvitare quello ... – BrainSlugs83

2

Per farlo funzionare correttamente nella mia applicazione WPF/.NET 4.0 che io chiamo questa funzione ogni volta che entrare o uscire dalla modalità a schermo intero:

private static void RefreshWindowVisibility(Window window) 
     { 
      if (window.OriginalWindowState == WindowState.Maximized) 
      { 
       window.Hide(); 
       window.Show(); 
       window.BringIntoView(); 
      } 
     } 

C'è un guizzo associato a questo metodo, ma sembra che lo stesso sfarfallio esista quando si passa alla modalità a schermo intero su Chrome. Internet Explorer sembra avere un approccio diverso.

2

Ho scoperto che è possibile ottimizzare a schermo intero (che copre la barra delle applicazioni) impostando le proprietà durante la creazione della finestra (in xaml), ma non è stato possibile passare avanti e indietro dopo la creazione. Dopo alcuni esperimenti, ho trovato l'ordine vengono impostate le proprietà sembra importare:

public bool IsFullscreen 
{ 
    get 
    { 
     return WindowState == System.Windows.WindowState.Maximized 
      && ResizeMode == System.Windows.ResizeMode.NoResize 
      && WindowStyle== System.Windows.WindowStyle.None; 
    } 
    set 
    { 
     if (value) 
     { 
      ResizeMode = System.Windows.ResizeMode.NoResize; 
      WindowStyle = System.Windows.WindowStyle.None; 
      WindowState = System.Windows.WindowState.Maximized; 
     } 
     else 
     { 
      ResizeMode = System.Windows.ResizeMode.CanResize; 
      WindowStyle = System.Windows.WindowStyle.SingleBorderWindow; 
      WindowState = System.Windows.WindowState.Normal;    
     } 
    } 
} 

Nota che WindowState arriva ultima nel setter.

Problemi correlati