c# - personalizados - messagebox visual basic
System.Windows.MessageBox no espera la entrada del usuario antes de irse. (7)
Alexey tiene razón, la pantalla de bienvenida cierra el cuadro de mensaje.
Una forma sencilla de evitar esto es usar la función nativa de MessageBox:
[DllImport("user32.dll", CharSet = CharSet.Unicode)]
public static extern int MessageBox(IntPtr hWnd, String text, String caption, uint type);
public static void Main()
{
...
MessageBox(new IntPtr(0), "Hello World!", "MyApp", 0);
... y no tiene sentido por qué. TT
En mi controlador de eventos Application_Startup
tengo un código que se parece un poco a esto:
private void Application_Startup(object sender, StartupEventArgs e)
{
string errorMessage;
if(CheckStartUpConditions(out errorMessage))
{
(new MainWindow()).Show();
}
else
{
MessageBox.Show(errorMessage, "Application Startup",
MessageBoxButton.OK, MessageBoxImage.Error);
Shutdown();
}
}
private bool CheckStartUpConditions(out string errorMessage)
{
errorMessage = string.Empty;
if(...)
errorMessage += "Please login to xxx. ";
if(...)
errorMessage += "Please install xxx.";
if(string.IsNullOrEmpty(errorMessage))
return true;
else
return false;
}
El cuadro de mensaje hace una breve aparición como un segundo antes de que aparezca "¡POOF!" No espera a que haga clic en "Aceptar" o en el botón "X". Estoy realmente perplejo en cuanto a por qué ocurre esto, por lo que cualquier ayuda sería muy apreciada .
He intentado comentar la llamada a Shutdown
solo por diversión y risas, y aún se comporta de la misma manera.
Además, la aplicación también tiene una SplashScreen
, así que no sé si eso está afectando esto.
EDITAR: he añadido más código si eso ayuda. El cuadro de mensaje muestra el mensaje de error correcto. Simplemente no se quedará el tiempo suficiente para que los usuarios lo lean. > :(
EDITAR PARTE 2: Está bien ... Creo que he encontrado al culpable. :( Cambié la acción de compilación en la imagen que estoy usando como mi presentación de SplashScreen a Ninguna y el cuadro de mensaje ahora se quedará y esperará la entrada del usuario. No entiendo por qué la Pantalla de bienvenida se está cargando con el MessageBox.>: (
Basado en la sugerencia de Alexey Ivanov, usé exitosamente una nueva ventana como padre
System.Windows.Forms.MessageBox.Show(new System.Windows.Forms.NativeWindow(), errorMessage, "Application Startup", MessageBoxButtons.OK, MessageBoxIcon.Exclamation);
Cree una ventana oculta transparente y utilícela como propietario de MessageBox:
private Window CreateHiddenWindow()
{
var window = new Window
{
AllowsTransparency = true,
Background = System.Windows.Media.Brushes.Transparent,
WindowStyle = WindowStyle.None,
Top = 0,
Left = 0,
Width = 1,
Height = 1,
ShowInTaskbar = false
};
window.Show();
return window;
}
Debe decirle a WPF que no se apague cuando la primera ventana lo haga. Mire esto: http://msdn.microsoft.com/en-us/library/system.windows.application.shutdownmode.aspx . Desea configurar su aplicación para que se cierre de forma explícita (en lugar de después de que se cierre la primera ventana):
<Application
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
StartupUri="MainWindow.xaml"
ShutdownMode="OnExplicitShutdown">
</Application>
Tu otra opción es configurar tu MainWindow como StartupUri (en lugar de tu pantalla de inicio) y luego cargar tu pantalla de inicio en el evento cargado de MainWindow. Luego, haría lo que fuera necesario para cargar o hacer mucho tiempo, debería ocultar su pantalla de inicio y volver a mostrar su ventana principal.
El cuadro de mensaje desaparece inmediatamente porque no tiene propietario. Si especifica la opción MessageBoxOptions.DefaultDesktopOnly
, el escritorio se asignará como propietario y el cuadro de mensaje funcionará correctamente en una aplicación sin ventana principal.
MessageBox.Show(
"Message",
"Title",
MessageBoxButton.YesNoCancel,
MessageBoxImage.Question,
MessageBoxResult.Cancel,
MessageBoxOptions.DefaultDesktopOnly);
Intente usar una sobrecarga que acepte el parámetro System.Windows.Window
y pase el valor Null
para hacer de su MessageBox una ventana de nivel superior de su aplicación, que es independiente de todas las demás ventanas que puedan existir. Supongo que su MessageBox es propiedad de la pantalla de bienvenida. Cuando se cierra la pantalla de bienvenida, el marco cierra el cuadro de mensaje. Así que hacer que su MessageBox sin propietario debería hacer el truco.
Puede mantener su pantalla de presentación y usar un MessageBox estándar de WPF si implementa la pantalla de presentación en un código en lugar de una acción de creación de imagen.
App.xaml.cs:
var splashScreen = new SplashScreen("path/to/splash_image.bmp");
splashScreen.Show(false); //make sure to use ''false'' here to prevent auto-closing
string errorMessage;
if(CheckStartUpConditions(out errorMessage))
{
(new MainWindow()).Show();
}
else
{
//standard WPF MessageBox may now be used here
MessageBox.Show(errorMessage, "Application Startup",
MessageBoxButton.OK, MessageBoxImage.Error);
Shutdown();
}
//explicitly close the splash screen now
splashScreen.Close(TimeSpan.FromSeconds(1));