ventanas ventana una otra navegacion modal entre emergentes dentro abrir wpf xaml dialog titlebar application-icon

otra - ¿Es posible mostrar una ventana wpf sin un ícono en la barra de título?



ventana modal c# (6)

¡Puedes usar una imagen png vacía y convertirla en ícono y configurarla como ícono para tu ventana!

Como todos sabemos, si el icono de una ventana de wpf no está definido, se muestra 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.

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

(Intenté buscar una pregunta similar pero no pude encontrar nada).


Mi primera sugerencia sería no hacerlo . 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.


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

Una ventana de WPF siempre muestra un ícono. Cuando no se proporciona uno al configurar Icon, WPF elige un ícono para mostrar basado en las siguientes reglas:

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

Si usa Icon para especificar un icono de ventana personalizado, puede restablecer el ícono de la aplicación predeterminada configurando Icon en null .

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


Sé que esto se responde, sin embargo, el blog de Dan Rigsby tiene un artículo que muestra cómo hacerlo sin ocultar las cajas de minimizar / maximizar.

Descubrí que esto me estaba frustrando cuando estaba usando los artículos ( here y here pero seguía ocultando todos los botones cuando el sysmenu estaba oculto, para ayudar a crear este asistente que, como se muestra arriba, llama a 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)); } }


Si bien no es exactamente una solución adecuada, puede intentar una de las siguientes cosas:

  1. Configurar WindowStyle-Property en ToolWindow hará que el ícono desaparezca, pero la barra de título (obviamente) será más pequeña.

  2. Escribe una plantilla de control 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.


Simple, agregue 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); }