2009-10-12 14 views
28

Come tutti sappiamo, se l'icona di una finestra WPF non è definito, allora viene visualizzata l'icona predefinita. Voglio visualizzare una finestra senza alcuna icona nella barra del titolo. Mi rendo conto che potrei usare un'immagine vuota, tuttavia ciò farebbe spostare il testo nella barra del titolo a destra.E 'possibile visualizzare una finestra WPF senza un'icona nella barra del titolo?

Qualcuno sa di un modo per rimuovere completamente l'icona?

(Ho provato a cercare per una domanda simile, ma non ho trovato nulla.)

risposta

26

semplice, aggiungere questo codice alla finestra:

[DllImport("user32.dll")] 
static extern uint GetWindowLong(IntPtr hWnd, int nIndex); 

[DllImport("user32.dll")] 
static extern int SetWindowLong(IntPtr hWnd, int nIndex, uint dwNewLong); 

private const int GWL_STYLE = -16; 

private const uint WS_SYSMENU = 0x80000; 

protected override void OnSourceInitialized(EventArgs e) 
{ 
    IntPtr hwnd = new System.Windows.Interop.WindowInteropHelper(this).Handle; 
    SetWindowLong(hwnd, GWL_STYLE, 
     GetWindowLong(hwnd, GWL_STYLE) & (0xFFFFFFFF^WS_SYSMENU)); 

    base.OnSourceInitialized(e); 
} 
+0

È stato necessario modificare un bit in base al codice in "Come nascondere il pulsante Chiudi nella finestra wpf?", Ma questo ha funzionato! –

+35

Penso che abbiamo diverse definizioni di semplice .. –

+13

Questo sembra di sbarazzarsi anche del pulsante "chiudi" che non è sempre desiderato. –

10

No, questo non sembra essere possibile. Citando dalla documentazione del Icon property (sottolineatura mia):

una finestra WPF visualizza sempre un'icona. Quando uno non è fornito impostando Icon, WPF sceglie un'icona per visualizzare in base alle seguenti regole:

  1. utilizzare l'icona di montaggio, se specificato.
  2. Se l'icona di montaggio non è specificato, utilizzare l'icona predefinita di Microsoft Windows.

Se si utilizza Icon per specificare un'icona finestra personalizzata, è possibile ripristinare l'icona dell'applicazione predefinita impostando Icon a null.

Quindi, apparentemente un'icona completamente trasparente sembra essere la soluzione migliore qui. O forse hackerare tutto questo usando le funzioni dell'API di Windows per impostare lo stile appropriato sulla finestra. Ma questo può interferire con la gestione delle finestre di WPF.

-1

Il mio primo suggerimento sarebbe non farlo. In WinForms puoi usare i tipi di formborderstyle per creare una finestra di dialogo senza icone, ma solo perché è uno standard di Windows. Solo i moduli con quei tipi di bordo specifici non dovrebbero avere un'icona; è ciò che gli utenti si aspettano.

+1

Windows Form ha anche una proprietà 'ShowIcon'. – Joey

+1

Sfortunatamente, non sembra esserci una vera distinzione tra finestre e finestre di dialogo in WPF. –

+3

Le [linee guida di progettazione per finestre di dialogo di errore di Windows] (https://msdn.microsoft.com/en-gb/library/windows/desktop/dn742471.aspx#icons) indicano diversamente: "_Le finestre di dialogo dei messaggi di errore di testo non hanno il titolo bar icons_ " –

17

Anche se non è esattamente una soluzione adeguata, si potrebbe provare una delle seguenti cose:

  1. Impostazione del WindowStyle-proprietà per ToolWindow renderà l'icona scompare, ma la barra del titolo (ovviamente) sarà più piccolo .

  2. Scrivi una ControlTemplate per l'intera finestra. A seconda che la finestra debba apparire come una finestra "reale", ci sarebbe molto da fare per provare a ricreare lo stile predefinito nel modello.

+0

Penso che le parti WPF della suite Expression possano disegnare tutto (comprese le barre del titolo) per consentire tali cose. Tuttavia, guardare e comportarsi in modo nativo è una cosa molto carina da avere per l'utente, imho. – Joey

+0

+1 Il WindowStyle "ToolWindow" è esattamente quello che stavo cercando! – ewall

9

So che questo si risponde, tuttavia Dan Rigsby's blog ha un articolo che mostra come fare questo senza nascondere il minimizzare/massimizzare scatole.

ho trovato questo mi è stato frustrante come stavo usando gli articoli (here e here ma tenuto nascosto tutti i pulsanti quando lo SYSMENU era nascosto, per aiutare Ho creato questo helper che, come sopra indicato chiamata in OnSourceInitialized.

public static class WpfWindowHelper { 

    [DllImport("user32.dll")] 
    public static extern int GetWindowLong(IntPtr hwnd, int index); 
    [DllImport("user32.dll")] 
    public static extern int SetWindowLong(IntPtr hwnd, int index, int newStyle); 
    [DllImport("user32.dll")] 
    public static extern bool SetWindowPos(IntPtr hwnd, IntPtr hwndInsertAfter, int x, int y, int width, int height, uint flags); 

    public const int GWL_EXSTYLE = -20; 
    public const int WS_EX_DLGMODALFRAME = 0x0001; 
    public const int SWP_NOSIZE = 0x0001; 
    public const int SWP_NOMOVE = 0x0002; 
    public const int SWP_NOZORDER = 0x0004; 
    public const int SWP_FRAMECHANGED = 0x0020; 
    public const int GWL_STYLE = -16; 
    public const int WS_MAXIMIZEBOX = 0x00010000; 
    public const int WS_MINIMIZEBOX = 0x00020000; 
    public const int WS_SYSMENU = 0x00080000; 

    public static void HideSysMenu(this Window w) { 
     IntPtr hwnd = new WindowInteropHelper(w).Handle; 
     int extendedStyle = GetWindowLong(hwnd, GWL_EXSTYLE); 
     SetWindowLong(hwnd, GWL_EXSTYLE, extendedStyle | WS_EX_DLGMODALFRAME); 
     SetWindowPos(hwnd, IntPtr.Zero, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | SWP_NOZORDER | SWP_FRAMECHANGED); 
    } 

    public static void HideMinimizeBox(this Window w) { 
     IntPtr hwnd = new WindowInteropHelper(w).Handle; 
     SetWindowLong(hwnd, GWL_STYLE, 
      GetWindowLong(hwnd, GWL_STYLE) & ~(WS_MINIMIZEBOX)); 
    } 

    public static void HideMaximizeBox(this Window w) { 
     IntPtr hwnd = new WindowInteropHelper(w).Handle; 
     SetWindowLong(hwnd, GWL_STYLE, 
      GetWindowLong(hwnd, GWL_STYLE) & ~(WS_MAXIMIZEBOX)); 
    } 

    public static void HideMinimizeAndMaximizeBoxes(this Window w) { 
     IntPtr hwnd = new WindowInteropHelper(w).Handle; 
     SetWindowLong(hwnd, GWL_STYLE, 
      GetWindowLong(hwnd, GWL_STYLE) & ~(WS_MAXIMIZEBOX | WS_MINIMIZEBOX)); 
    } 

} 
+0

HideSysMenu (WS_EX_DLGMODALFRAME) fa la cosa! Nascondi l'icona, lasciando intatto il pulsante Chiudi. – HelloSam

+2

Scusa, non fa nulla. Sia l'icona che il pulsante di chiusura sono ancora lì. Voglio solo che l'icona scompaia, secondo le linee guida dell'interfaccia utente di Microsoft per le finestre di dialogo. – ygoe

7

È possibile utilizzare un'immagine png vuota e convertirla in icona e impostarla come icona per la finestra !!!

enter image description here

+1

Questa è la soluzione più semplice e migliore. +1 – hamed

+0

L'immagine occupa comunque spazio nel titolo della finestra –