2011-10-16 11 views
5

Estoy tratando de usar .NET 4 SplashScreen en una aplicación WPF basada en Prism. He utilizado SpashScreen configurando la acción de compilación en la imagen en SplashScreen.Cómo utilizar .NET 4 SplashScreen en una aplicación basada en Pris WPF?

La aplicación utilizada para seguir estrellándose con un System.Resources.MissingManifestResourceException. Finalmente me di cuenta de que si agrego un StartupUri = "MainWindow.xaml" en el archivo App.Xaml, el SplashScreen funciona bien.

<Application x:Class="Application" 
     xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" 
     xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" 
     StartupUri="MainWindow.xaml"> 
</Application> 

Pero en una aplicación de prisma, no podemos tener un StartupUri. Todo está hecho en el Bootstrapper.

Entonces, ¿qué tengo que hacer manualmente que StartupUri hizo para que SplashScreen funcione?

Actualización 1: El mensaje de excepción es completa:

System.Resources.MissingManifestResourceException fue controlada

Mensaje = No se pudo encontrar recursos adecuados para la cultura especificada o la referencia cultural neutra. Asegúrese de que "Application.g.resources" esté incrustado o vinculado correctamente en assembly "Application" en tiempo de compilación, o que todos los conjuntos de satélite necesarios sean cargables y estén completamente firmados.

Actualización 2: he dado cuenta de la adición o eliminación de la StartupUri no importa. Lo que importa es que tengo una ventana WPF adicional (que no sea App.xaml) o 2 entradas ficticias en la etiqueta App.Resources.

<Application.Resources> 
    <Style x:Key="Dummy"/> 
    <Style x:Key="Dummy1"/> 
</Application.Resources> 

Si no hago esto, el archivo Application.g.resources no se crea en el archivo obj y por lo tanto no se incrusta en el ejecutable. Añadiendo dos entradas de recursos ficticias me llamó la atención por este blog post.

Actualización 3:

Mi pregunta fue respondida por Bob Bao en el foro de MSDN here. También parece que Kent estaba tratando de señalarme en la misma dirección.

No establezca la acción de compilación de la imagen en SplashScreen. En su lugar:

Agregue el código en el método de aplicación OnStartup como:

protected override void OnStartup(StartupEventArgs e) 
{ 
    SplashScreen splashScreen = new SplashScreen("splashscreen.png"); 
    splashScreen.Show(true); 

    base.OnStartup(e); 
    Bootstrapper bootstrapper = new Bootstrapper(); 
    bootstrapper.Run(); 
} 

"splashscreen.png" es una imagen en el proyecto, y su "Acción de generación" es "Recurso".

+2

se trata aquí en alguna parte? – DeCaf

+0

@DeCaf He actualizado la pregunta. –

Respuesta

1

Simplemente defina su propio punto de entrada que muestre primero la pantalla de inicio y luego arranque Prism. En las propiedades de su proyecto, establezca el punto de entrada en su punto de entrada personalizado.

internal static class Entry 
{ 
    public static void Main(string[] args) 
    { 
     var splashScreen = ...; 
     splashScreen.Show(); 

     var bootstrapper = ...; 
     bootstrapper....; 
    } 
} 
+0

El problema no se trata de definir el punto de entrada. WPF crea automáticamente un Main() estático que crea una SplashScreen y luego inicia la aplicación() en la que creo mi bootstrapper. El problema es que si no especifico el StartupUri, por alguna razón, la imagen de la pantalla Spash que está incrustada como recurso no está disponible para la instancia de SplashScreen. De ahí mi pregunta: ¿Qué debería hacer manualmente que hizo la etiqueta StartupUri? –

+0

¿Está * Build Action * en las propiedades de la imagen splash establecida en 'Resource'? –

+0

Boogart No. La acción de compilación está configurada en Pantalla de inicio. –

Cuestiones relacionadas