2011-10-16 8 views
5

Próbuję użyć .NET 4 SplashScreen w aplikacji WPF opartej na Prism. Użyłem SpashScreen, ustawiając akcję budowania na obrazie na SplashScreen.Jak korzystać z .NET 4 SplashScreen w aplikacji opartej na pryzmie WPF?

Aplikacja używana do awaryjnego zawieszania się z System.Resources.MissingManifestResourceException. W końcu doszedłem do wniosku, że jeśli dodaję plik StartupUri = "MainWindow.xaml" do pliku App.Xaml, SplashScreen będzie działał poprawnie.

<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> 

Ale w aplikacji na pryzmat nie możemy mieć StartupUri. Wszystko odbywa się w Bootstrapper.

Co muszę zrobić ręcznie, aby program StartupUri działał w trybie SplashScreen?

Aktualizacja 1: Pełną wiadomość Wyjątkiem jest:

System.Resources.MissingManifestResourceException był nieobsługiwany

Message = Nie można odnaleźć żadnych zasobów odpowiednich dla określonej kultury lub kultury neutralnej. Upewnij się, że "Application.g.resources" zostało poprawnie osadzone lub połączone w zestawie "Aplikacja" podczas kompilacji lub że wszystkie wymagane zestawy satelitów są ładowalne i w pełni podpisane.

Aktualizacja 2: I zorientowali się, dodanie lub usunięcie StartupUri nie ma znaczenia. Liczy się to, że mam dodatkowe okno WPF (inne niż App.xaml) lub 2 fałszywe wpisy w znaczniku App.Resources.

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

Jeśli tego nie zrobi, to plik Application.g.resources nie jest tworzony w obj pliku, a tym samym nie są osadzone w pliku wykonywalnego. Dodałem dwa fałszywe wpisy zasobów, które zostały mi przedstawione przez to blog post.

Update 3:

Moje pytanie odpowiedział Bob Bao na MSDN forum here. Wygląda na to, że Kent próbował skierować mnie w tym samym kierunku.

Nie ustawiaj akcji budowania obrazu na SplashScreen. Zamiast:

Dodaj kod w metodzie App OnStartup jak:

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" to jeden obraz w projekcie, a jego "Budowa Action" jest "Zasób".

+2

Czy istnieje pytanie gdzieś tutaj? – DeCaf

+0

@DeCaf Mam zaktualizowane pytanie. –

Odpowiedz

1

Po prostu zdefiniuj własny punkt wejścia, który po pierwsze pokazuje ekran powitalny, a następnie ładuje pryzmat. We właściwościach projektu ustaw punkt wejścia na własny punkt wejścia.

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

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

Problem nie dotyczy definiowania punktu wejścia. WPF automatycznie tworzy statyczną Main(), która tworzy SplashScreen, a następnie uruchamia aplikację(), w której utworzę mój bootstrapper. Problem polega na tym, że jeśli nie określę StartupUri, z jakiegoś powodu obraz ekranu Spash, który jest osadzony jako zasób, nie jest dostępny dla instancji SplashScreen. Stąd moje pytanie: co powinienem zrobić ręcznie, jak zrobił to znacznik StartupUri? –

+0

Czy właściwość * Kompilacja * na właściwościach obrazu powitalnego jest ustawiona na "Zasób"? –

+0

Boogart No. Działanie kompilacji ustawione jest na ekran powitalny. –

Powiązane problemy