2009-12-22 14 views
15

Estoy tratando de modificar App.cs y cargar los archivos WPF XAML desde el código, pero no funciona como debería.¿Cómo cambiar el StartupUri de la aplicación WPF?

Independientemente de lo que intento establecer como StartupUri, no se inicia, el programa se cierra después de esto.

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     base.OnStartup(e); 

     LoginDialog dlg = new LoginDialog(); 
     if (dlg.ShowDialog() != true) 
      return; 

     switch (dlg.ChoiceApp) { 
      case ChoiceApp.CustomerEntry: 
       StartupUri = new Uri("/MyApp;component/Forms/CustomerEntry.xaml", 
        UriKind.Relative); 
       break; 
      case ChoiceApp.VendorEntry: 
       StartupUri = new Uri("/MyApp;component/Forms/VendorEntry.xaml", 
        UriKind.Relative); 
       break; 
     } 
    } 
} 

Ahora incluso me hicieron rastrear y descubrió que LoginDialog está funcionando correctamente y vuelve valores correctamente, pero el establecimiento de "StartupUri" no funciona.

Comprobé en ensamblaje inverso que el método DoStartup de la aplicación se llama después de OnStartup, por lo que técnicamente mi StartupUri debe cargar, pero no lo hace, en App.xaml startup uri no está definido en absoluto.

Nota: error confirmado

Noté que ShowDialog establece Application.MainWindow y cuando termina el diálogo, se establece de nuevo a cero, y debido a esto StartupUri configuración no funciona después de llamar diálogo modal en OnStartup o Evento de inicio.

No hay ningún error o excepción sobre el uri no válido o algo por el estilo.

Este método funciona sin que se llame DialogBox en el evento de inicio o OnStartup, creo que llamar a showdialog en este método hace que algo así como su ventana principal se configure como ventana expirada y se apaga después de esto.

Respuesta

5

Do todavía tienes un StartupUri especificado en el XAML? Si es así, quítelo y vea si eso ayuda. MSDN Source

Si no es así, es posible que tenga que abordar esto de otra manera: tenga su cuadro de diálogo como inicio, a partir de ese momento abra otra ventana en función del valor seleccionado.

+0

Hice exactamente lo que dijo, sin embargo, esto es una solución, pero desde el punto de vista del diseño de la aplicación, la configuración de StartupUri debería funcionar y se ve muy bien el código, que es fácil de documentar y explicar. Gracias por tu sugerencia. –

3

en lugar de anular el método OnStartup(), enganche en el evento en su lugar.

en el XAML

<Application x:Class="SOTestWPF.App" 
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
Startup="Application_Startup"> 
    <Application.Resources> 

    </Application.Resources> 
</Application> 

en el código detrás:

private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     var rnd = new Random(); 

     if (rnd.NextDouble() > 0.5) 
      StartupUri = new Uri("/SOTestWPF;component/Window1.xaml", UriKind.Relative); 
     else 
      StartupUri = new Uri("/SOTestWPF;component/Window2.xaml", UriKind.Relative); 

    } 

esto es sólo mi caso de prueba y he verificado que se lleva a cabo correctamente (al azar: D)

+0

Lo sentimos, no funciona, de hecho el es método aleatorio en qué otro mía es una caja de diálogo, parece ese cuadro de diálogo en el evento de inicio causa un problema. –

+0

Acabo de poner una llamada MessageBox.Show ("prueba") en mi ejemplo y todavía funcionó. Sospecho que hay algo mal con su LoginDialog que siempre devuelve falso, o algún otro error relacionado dentro de LoginDialog. –

+0

No, depuración y paso a paso, puedo ver que está funcionando correctamente. –

16

Akash, me encontré con este problema exactamente tratando de implementar un LoginDialog como el tuyo. El diálogo no tiene un error, sino que el comportamiento es por diseño.

No es un error. La aplicación predeterminada ShutdownMode de está OnLastWindowClosed, por lo que tan pronto como se cierre la primera ventana ¡su aplicación comenzará a cerrar ! Cambiar a OnExplicitShutdown y funcionará, pero tendrá que gestionar el cierre.

Ver esta pregunta anterior Stackoverflow: WPF ShowDialog returns null immediately on second call

+0

Wow, no sabía esto, gran respuesta hombre, voy a tratar de usar esto y ver si funciona. –

4

sólo trato en OnStartup():

StartupUri = new Uri("Forms/CustomerEntry.xaml", UriKind.Relative); 
Cuestiones relacionadas