2008-12-02 11 views
5

me encontré con un comportamiento bastante extraño ...Pregunta System.ExecutionEngineException durante la carga de la ventana de WPF, en el formulario de Windows

Aquí es cómo reproducir el problema:

  1. Crear un proyecto de aplicación de WPF.
  2. Elimina StartupUri del archivo App.xaml.
  3. Agregue un controlador de eventos de inicio a la aplicación con la firma "private void Application_Startup(object sender, StartupEventArgs e)"
  4. Ahora, agregue un formulario al proyecto (haga clic derecho y seleccione agregar nuevo elemento).
  5. en el método Application_Startup, cree el objeto de formulario, el documento presentado como Form1 f1 = new Form1(); f1.ShowDialog();
  6. Por Form1 real, añadir un botón para el diseñador, y agregar un controlador de eventos de clic al botón.
  7. Agregue una nueva ventana de WPF a su proyecto, Ventana1.
  8. En controlador de eventos de clic de botón del Form1 creado en el paso 6, agregue las líneas de código para crear la pantalla de la ventana de WPF: Window1 w1 = new Window1(); w1.Show();
  9. ejecutar el proyecto y haga clic en el botón de la WinForm para mostrar la ventana ... de obras de WPF bien hasta ahora.
    1. Cierre la ventana de WPF y haga clic en el botón de winform nuevamente. Esta vez deberías obtener la excepción.

Así que, esencialmente, lo que hago es crear una aplicación de WPF que muestra un WinForm. Entonces, el winform muestra una Ventana WPF.

La primera vez que se muestra la ventana de WPF, todo funciona bien. Si está cerrado, y luego vuelve a abrir, obtengo la excepción. También puedo abrir varias ventanas de WPF haciendo clic en el botón varias veces. Una vez que el último está cerrado, sin embargo, nunca más puedo abrir otro sin la excepción ...

También probé las sugerencias sugeridas en http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/442782b1-00a1-4e2e-9cc6-ae99b6699126/, pero esas no ayudan.

¿Por qué sucede esto?

Respuesta

10

El comportamiento predeterminado de desactivación de aplicaciones Wpf (especificado en la pestaña "Aplicación" en las propiedades del proyecto en VS o utilizando el atributo Modo de apagado en Application.Xaml) es "En la última ventana cerrada". Esto significa que cuando cierra la ventana de Wpf que crea, Wpf cierra el marco de aplicación para que cualquier creación de ventana posterior genere una excepción.

Puede evitar este problema configurando el modo de apagado en "En el cierre explícito" ("OnExplicitShutdown" en Xaml). A continuación, deberá llamar manualmente a Application.Current.Shutdown de forma explícita cuando desee que la aplicación finalice (por ejemplo, cuando el formulario de winforms esté cerrado).

+1

+1. En caso de que finalice el proceso (por ejemplo, la forma de ganar), ¿aún necesita llamar a Application.Current.Shutdown()? En caso afirmativo, ¿qué pasaría si no lo haces? –

+0

Mostraste el xaml, dado que agregué Windows WPF a mi aplicación WinForms, no tengo app.xaml así que en Program.cs lo agregué cuando creé una nueva instancia de System.Windows.Application. 'System.Windows.Application.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;' –

Cuestiones relacionadas