Estoy escribiendo un diálogo modal en WPF. ¿Cómo configuro una ventana WPF para que no tenga un botón de cierre? Todavía me gustaría WindowState
que tenga una barra de título normal.
He encontrado ResizeMode
, WindowState
y WindowStyle
, pero ninguna de esas propiedades permiten que me esconda el botón de cierre, sino mostrar la barra de título, como en los cuadros de diálogo modales.
Respuestas:
WPF no tiene una propiedad incorporada para ocultar el botón Cerrar de la barra de título, pero puede hacerlo con unas pocas líneas de P / Invoke.
Primero, agregue estas declaraciones a su clase de ventana:
Luego ponga este código en el
Loaded
evento de la ventana :Y ahí lo tienes: no más botón Cerrar. Tampoco tendrá un ícono de ventana en el lado izquierdo de la barra de título, lo que significa que no hay menú del sistema, incluso cuando hace clic con el botón derecho en la barra de título, todos van juntos.
Tenga en cuenta que Alt+ F4aún cerrará la ventana. Si no desea permitir que la ventana se cierre antes de que finalice el subproceso de fondo, también puede anular
OnClosing
y establecerCancel
en verdadero, como sugirió Gabe.fuente
SetWindowLongPtr
lugar.Acabo de tener un problema similar y la solución de Joe White me parece simple y limpia. Lo reutilicé y lo definí como una propiedad adjunta de Window
Luego, en XAML, simplemente lo configura así:
fuente
Establezca la
WindowStyle
propiedad en Ninguno, lo que ocultará el cuadro de control junto con la barra de título. No hay necesidad de llamadas internas.fuente
this.DragMove();
alMouseDown
evento de la ventanaEsto no eliminará el botón de cerrar, pero impedirá que alguien cierre la ventana.
Pon esto en tu código detrás del archivo:
fuente
Window
cuadro de diálogo modal interferirá con laWindow
configuración de suDialogResult
propiedad y puede dejarlo inutilizable. stackoverflow.com/questions/898708/cant-set-dialogresult-in-wpfPara deshabilitar el botón de cierre, debe agregar el siguiente código a su clase de Windows (el código fue tomado de aquí , editado y reformateado un poco):
Este código también desactiva el elemento de cierre en el menú Sistema y no permite cerrar el diálogo usando Alt + F4.
Probablemente desee cerrar la ventana mediante programación. Solo llamar
Close()
no funcionará. Haz algo como esto:fuente
Estaba probando la respuesta de Viachaslau porque me gusta la idea de no quitar el botón sino deshabilitarlo, pero por alguna razón no siempre funcionó: el botón de cierre todavía estaba habilitado pero no había ningún error.
Esto, por otro lado, siempre funcionó (se omitió la comprobación de errores):
fuente
Window
método de extensión en mi proyecto.La propiedad para establecer es =>
WindowStyle="None"
fuente
Solo agrego mi implementación de la respuesta de Joe White utilizando el comportamiento de interactividad (debe hacer referencia a System.Windows.Interactivity).
código:
uso:
fuente
Deje que el usuario "cierre" la ventana, pero realmente solo escóndela.
En el evento OnClosing de la ventana, oculte la ventana si ya está visible:
Cada vez que se ejecute el subproceso de fondo, vuelva a mostrar la ventana de la interfaz de usuario de fondo:
Al finalizar la ejecución del programa, asegúrese de que todas las ventanas estén / puedan cerrarse:
fuente
Entonces, más o menos aquí está tu problema. El botón de cierre en la esquina superior derecha de un marco de ventana no es parte de la ventana de WPF, pero pertenece a la parte del marco de ventana que controla su sistema operativo. Esto significa que tendrá que usar la interoperabilidad Win32 para hacerlo.
alternativamente, puede usar el noframe y proporcionar su propio "marco" o no tener ningún marco.
fuente
Lo siguiente es sobre deshabilitar los botones de cerrar y Maximizar / Minimizar, no realidad elimina los botones (¡pero elimina los elementos del menú!). Los botones en la barra de título se dibujan en un estado deshabilitado / atenuado. (No estoy listo para asumir toda la funcionalidad yo mismo ^^)
Esto es ligeramente diferente de la solución de Virgoss en que elimina los elementos del menú (y el separador final, si es necesario) en lugar de simplemente deshabilitarlos. Se diferencia de la solución Joe Whites, ya que no deshabilita todo el menú del sistema y, en mi caso, puedo mantener el botón y el icono Minimizar.
El código siguiente también admite la desactivación de los botones Maximizar / Minimizar ya que, a diferencia del botón Cerrar, eliminar las entradas del menú no hace que el sistema haga que los botones estén "desactivados", aunque eliminar las entradas del menú sí desactiva la funcionalidad de los botones.
Esto funciona para mi. YMMV.
Uso: Esto debe hacerse DESPUÉS de que se inicialice la fuente. Un buen lugar es usar el evento SourceInitialized de la ventana:
Para deshabilitar la funcionalidad Alt + F4, el método fácil es simplemente conectar el evento de Cancelación y usar establecer un indicador para cuando realmente desea cerrar la ventana.
fuente
Código XAML
Deberia trabajar
Editar : para su instante, este hilo muestra cómo se puede hacer eso, pero no creo que Window tenga una propiedad para obtener lo que desea sin perder la barra de título normal.
Editar 2 Este hilo muestra una forma de hacerlo, pero debe aplicar su propio estilo al menú del sistema y muestra una forma de cómo puede hacerlo.
fuente
Intente agregar un evento de cierre a la ventana. Agregue este código al controlador de eventos.
Esto evitará que la ventana se cierre. Esto tiene el mismo efecto que ocultar el botón de cierre.
fuente
Use esto, modificado desde https://stephenhaunts.com/2014/09/25/remove-the-close-button-from-a-wpf-window :
fuente
Esto no oculta el botón, pero evitará que el usuario avance al cerrar la ventana.
fuente
Ir a conjunto de propiedades de ventana
no conseguirás cerrar botones ...
fuente
WindowStyle = "None"
, mira tu sintaxis. Por otro lado, es un enfoque de escopeta que también elimina la barra de título, haciendo que el cuadro sea feo y carezca de título, cuando hay muchas formas mucho mejores de manejar esto (como lo demuestran las otras respuestas), y es una respuesta duplicada.Como se indica en otras respuestas, puede usar
WindowStyle="None"
para eliminar la barra de título por completo.Y, como se indica en los comentarios a esas otras respuestas, esto evita que la ventana se pueda arrastrar, por lo que es difícil moverla desde su posición inicial.
Sin embargo, puede superar esto agregando una sola línea de código al Constructor en el archivo Código detrás de la ventana:
O, si prefiere la sintaxis de Lambda:
Esto hace que toda la ventana se pueda arrastrar. Los controles interactivos presentes en la ventana, como los botones, seguirán funcionando normalmente y no actuarán como controles de arrastre para la ventana.
fuente
Después de mucho buscar la respuesta a esto, elaboré esta solución simple que compartiré aquí con la esperanza de que ayude a otros.
Me puse
WindowStyle=0x10000000
.Esto establece los valores
WS_VISIBLE (0x10000000)
yWS_OVERLAPPED (0x0)
para Estilo de ventana. "Superpuesto" es el valor necesario para mostrar la barra de título y el borde de la ventana. Mediante la eliminación de laWS_MINIMIZEBOX (0x20000)
,WS_MAXIMIZEBOX (0x10000)
, yWS_SYSMENU (0x80000)
los valores de mi valor de estilo, todos los botones de la barra de título se eliminaron, incluyendo el botón Cerrar.fuente
WindowStyle
hay una enumeración cuyos valores no coinciden con las constantes de la API de Windows; coaccionar el valor para laWindowStyle
enumeración no funcionará. Para estar seguro, he comprobado el código fuente .NET en ILSpy; el valor de enumeración se traduce a la API de Windows en la función privadaCreateWindowStyle
, y si la función encuentra unWindowStyle
valor desconocido , simplemente se aplicaWindowStyle.None
. (La única forma sería usar las propiedades internas_Style
y_StyleEx
usar la reflexión, lo cual recomiendo encarecidamente)Use
WindowStyle="SingleBorderWindow"
, esto ocultará el botón máximo y mínimo de la ventana de WPF.fuente
close
botónSi la necesidad es solo prohibir al usuario que cierre la ventana, esta es una solución simple.
Código XAML:
IsCloseButtonEnabled="False"
fuente