Gtk.MessageDialog: ¿Desea Salir?
Una de las cosas que ocupo mucho para el desarrollo
de aplicaciones gráficas en Windows
es el componente "MsgBox".
Lo uso para todo y a la menor
provocación, se que no es buena práctica, pero me
sirve para medio "debugear" variables o algún tipo de
resultado que quiero comprobar en tiempo de ejecución. Cabe
señalar que lo mejor es usar "Console.Write" para este tipo
de manejos.Sea como sea, lo primero que me interesa es ver como puedo invocar algo parecido al "MsgBox" pero en Gtk#. La solución no tardó en llegar, googleando un poco me encontré con "MessageDialog". Así que para darle buen uso se me ocurrió un ejemplo de una confirmación de salida de una aplicación desarrollada en MonoDevelop.
Pero antes necesitamos conocer mas sobre "MessageDialog".
Podemos encontrar la documentación oficial de "MessageDialog" en go-mono.com, sin embargo aún no se encuentra muy clara que digamos, así que a continuación explico con mas detalle.
Constructor:
MessageDialog ( Parent, DialogFlags [|
DialogFlags], MessageType, ButtonsType, Message )Lista de Parámetros:
Parent
Asigna quien es el padre del Diálogo
DialogFlags
.Modal Declara si es modal o no al "parent
.DestroyWithParent Si el "parent" se destruye con la ventana de dialogo
.NoSeparator No hay separador bajo los botones
MessageType
.Info Mensaje de Información
.Warning Mensaje de Advertencia
.Question Mensaje de Pregunta
.Error Mensaje de Error
ButtonsType
.None Ningún Botón
.Ok Botón de OK
.Close Botón de Cerrar
.Cancel Botón de Cancelar
.YesNo Botones Si y No
.OkCancel Botones Ok y Cancelar
Message
Mensaje de texto del diálogo
Ya que ha quedado un poco mas claro como se compone, es hora de entrar en materia con MonoDevelop. (Nota: Para este ejemplo, se esta ocupando la versión 0.11)
Primero vamos a crear una nueva solución por medio del menú "Archivo" y "Nuevo Proyecto", seleccionamos "Proyecto Gtk# 2.0" con el Nombre "ConfirmaSalir".
Una vez creado el proyecto, vamos a ir directamente a "MainWindow.cs", para este ejemplo no es necesario dibujar nada por medio de "Stetic" (Salvo que quieras centrar el formulario en la propiedad "Posición de la Ventana") así que vamos directamente al código fuente.
Primero que nada, es necesario declarar la ventana padre con algún nombre, en este caso la llamé "MyWin", por lo que agregamos la siguiente linea después de la declaración de la clase "MainWindow":
protected Gtk.Window MyWin;
Ok, una vez hecho lo anterior vamos a ver como es que se detecta cuando una ventana quiere cerrarse, para ello nos concentraremos en las siguientes lineas que se generan automáticamente:
protected void OnDeleteEvent (object sender, DeleteEventArgs a)
{
Application.Quit ();
a.RetVal = true;
}
"OnDeleteEvent" es cuando se detecta que la ventana esta por cerrarse, a lo que vamos a condicionar la llamada a "Application.Quit()" por medio de un "MessageDialog" de la siguiente forma:
protected void OnDeleteEvent (object sender, DeleteEventArgs a)
{
MessageDialog msgBox = new MessageDialog (
MyWin,
DialogFlags.Modal,
MessageType.Question,
ButtonsType.YesNo,
"¿Desea Salir?"
);
ResponseType miResultado = (ResponseType)msgBox.Run ();
msgBox.Destroy();
if (miResultado == ResponseType.Yes){
Application.Quit ();
a.RetVal = true;
}
else {
a.RetVal = true;
}
}
Lo que estamos haciendo es: Declarar la variable "msgBox" como un nuevo "MessageDialog", el cual es modal a "MyWin", es de tipo pregunta con dos botones a seleccionar; "Si" y "No", el cual nos pregunta "¿Desea Salir?".
Después declaramos la variable "miResultado" como un "ResponseType" que es el tipo de dato que nos va a devolver el diálogo, en este caso nos puede devolver 3 valores:
- ResponseType.Yes (Si pulsamos sobre "Si")
- ResponseType.No (Si pulsamos sobre "No")
- ResponseType.DeleteEvent (Si cerramos la ventana del diálogo)
Una vez que obtenemos una respuesta esta debe ser evaluada. Esto no puede ser más fácil que con un "If/Else", donde si la respuesta capturada es "ResponseType.Yes" entonces procede a cerrar la aplicación.
Todo el código fuente debería quedar de la siguiente forma:
using System; using Gtk; public class MainWindow: Gtk.Window { protected Gtk.Window MyWin; public MainWindow (): base ("") {
Stetic.Gui.Build (this, typeof(MainWindow)); } protected void OnDeleteEvent (object sender, DeleteEventArgs a) { MessageDialog msgBox = new MessageDialog ( MyWin, DialogFlags.Modal, MessageType.Question, ButtonsType.YesNo, "¿Desea Salir?" );
ResponseType miResultado = (ResponseType)msgBox.Run (); msgBox.Destroy();
if (miResultado == ResponseType.Yes){ Application.Quit (); a.RetVal = true; } else { a.RetVal = true; } } }
Y nuestra aplicación debería de verse de la siguiente forma:
Por el momento eso es todo. Saludos!!!
El proyecto y código relacionado de este artículo están disponibles en el siguiente archivo.
| Adjunto | Tamaño |
|---|---|
| ConfirmaSalir.tar.gz | 4.63 KB |
![]() |
No entendí muy bien la pregunta, pero si te refieres a información sobre el control de ventanas de diálogo modales, tengo un ejemplo en: Gtk.Dialog: Ventanas de Dialogo Modales |
![]() |
gracias por tus aportes saludos |



Creo que te hubieras ahorrado estas lineas de codigo
}
else {
a.RetVal = true;
}
puesto que no son necesarias sea cual sea la respuesta siempre va a ejecutar
a.RetVal = true;