2009-10-12 8 views
28

Como todos sabemos, si el icono de una ventana de wpf no está definido, se mostrará el icono predeterminado. Quiero mostrar una ventana sin ningún icono en la barra de título. Me doy cuenta de que podría usar una imagen en blanco, sin embargo, esto provocaría que el texto en la barra de título se desplace hacia la derecha.¿Es posible visualizar una ventana wpf sin un ícono en la barra de título?

¿Alguien sabe de una forma de eliminar completamente el ícono?

(He intentado buscar una pregunta similar, pero no pudo encontrar nada.)

Respuesta

26

simple, añadir este código a su ventana:

[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

Tuve que modificar un bit basado en el código en "Cómo ocultar el botón cerrar en la ventana wpf?", Pero esto funcionó. –

+35

Creo que tenemos diferentes definiciones de simple .. –

+13

Esto parece deshacerse del botón "cerrar" también, que no siempre se desea. –

10

No, esto no parece ser posible. Citando de la documentación de la (el énfasis es mío) Icon property:

una ventana de WPF siempre muestra un icono. Cuando uno no se proporciona mediante el establecimiento de Icon, WPF elige un icono para mostrar en base a las siguientes reglas:

  1. utilizar el icono de montaje, si se especifica.
  2. Si no se especifica el ícono de ensamblaje, use el icono predeterminado de Microsoft Windows.

Si utiliza el icono para especificar un icono de ventana personalizado, puede restablecer el icono predeterminado de la aplicación configurando Icon en null.

Así que, aparentemente, un ícono completamente transparente parece ser su mejor opción aquí. O tal vez hackear todo esto usando las funciones de API de Windows para establecer el estilo apropiado en la ventana. Pero este puede interferir con la gestión de ventanas de WPF.

-1

Mi primera sugerencia sería no lo hagas. En WinForms puede usar tipos de estilos de formborder para crear un cuadro de diálogo que no tiene ningún icono, pero solo porque es un estándar de Windows. Solo las formas con esos tipos de borde específicos no deben tener ícono; es lo que los usuarios esperan.

+1

formas de Windows también tiene una propiedad 'ShowIcon'. – Joey

+1

Desafortunadamente, parece que no hay una distinción real entre ventanas y diálogos en WPF. –

+3

Las [directrices de diseño para los cuadros de diálogo de error de Windows] (https://msdn.microsoft.com/en-gb/library/windows/desktop/dn742471.aspx#icons) indican lo contrario: "_Los cuadros de diálogo de mensaje de error modal no tienen título bar icons_ " –

17

Aunque no es exactamente una solución adecuada, podría intentar una de las siguientes cosas:

  1. Ajuste del WindowStyle-propiedad a ToolWindow hará que el icono desaparece, pero la barra de título (obviamente) será menor .

  2. Escriba un ControlTemplate para toda la Ventana. Dependiendo de si la ventana tiene que parecerse a una ventana "real", habría mucho esfuerzo en intentar recrear el estilo predeterminado en la plantilla.

+0

Creo que las partes WPF del paquete Expression pueden dibujar todo (incluidas las barras de título) para permitir tales cosas. Aún así, mirar y comportarse de forma nativa es algo muy bueno para el usuario, ¿eh? – Joey

+0

+1 ¡El WindowStyle "ToolWindow" es exactamente lo que estaba buscando! – ewall

9

Sé que esto es contestada, sin embargo Dan Rigsby's blog tiene un artículo que muestra cómo hacer esto sin ocultar el Minimizar/maximizar cajas.

me encontré con esto me fue frustrante, ya que estaba usando los artículos (y herehere pero seguía ocultando todos los botones cuando el SYSMENU estaba oculto, para ayudar creé esta ayuda, que, como se muestra por encima de la llamada en 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) hace la cosa! Ocultar el icono, pero dejando el botón de cerrar intacto. – HelloSam

+2

Lo siento, no hace nada. Tanto el icono como el botón de cerrar siguen ahí. Solo quiero que desaparezca el ícono, de acuerdo con las directrices de interfaz de usuario de Microsoft para las ventanas de diálogo. – ygoe

7

¡Puede utilizar una imagen png vacía y convertirla en icono y configurarla como icono para su ventana!

enter image description here

+1

Esta es la solución más simple y mejor. +1 – hamed

+0

Aunque la imagen aún ocupa espacio en el título de la ventana –

Cuestiones relacionadas