2009-12-22 15 views
15

Próbuję zmodyfikować App.cs i załadować pliki XAML WPF z kodu, ale nie działa tak jak powinien.Jak zmienić StartupUri aplikacji WPF?

Bez względu na to, co próbuję ustawić jako StartupUri, nie uruchamia się, program kończy się po tym.

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

Teraz nawet nie śladowe i okazało się, że LoginDialog działa poprawnie i wraca wartości poprawnie, ale ustawienie „StartupUri” nie działa.

Sprawdziłem w odwrotnej kolejności, że metoda AppStartup jest wywoływana po uruchomieniu OnStartup, więc technicznie mój StartupUri musi się załadować, ale to nie robi, w App.xaml URI uruchamiania nie jest w ogóle zdefiniowany.

Uwaga: Bug Potwierdzony

zauważyłem, że ShowDialog ustawia Application.MainWindow a gdy końce dialogowych, ustawia go na null, a ze względu na to ustawienie StartupUri nie działa po wywołaniu modalnego okna dialogowego w OnStartup lub Zdarzenie początkowe.

Nie ma błędu ani wyjątku dotyczącego nieprawidłowego identyfikatora użytkownika lub czegoś podobnego.

Ta metoda działa bez wywoływania DialogBox w zdarzeniu Startup lub OnStartup, myślę, że wywołanie showdialog w tej metodzie powoduje, że jego okno główne jest ustawione na wygasłe okno, a następnie zostaje wyłączone.

Odpowiedz

5

Do nadal masz StartupUri określone w XAML? Jeśli tak, usuń go i zobacz, czy to pomaga. MSDN Source

Jeśli nie, być może trzeba podejść do tego inaczej: mieć okno dialogowe jako startowe, a następnie od tego punktu otworzyć kolejne okno w oparciu o wybraną wartość.

+0

Zrobiłem dokładnie tak, jak powiedziałeś, jednak jest to pewne obejście, ale z punktu widzenia projektowania aplikacji, uruchomienie StartupUri powinno działać i wygląda trochę ładnie, co jest łatwe do udokumentowania i wyjaśnienia. Dzięki za Twoją sugestię. –

3

zamiast przesłonić metodę OnStartup(), należy podłączyć się do zdarzenia.

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

w kodzie za:

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

    } 

To jest tylko mój przypadek testowy i mam dowód, że to działa prawidłowo (losowo: D)

+0

Niestety, nie robi praca, to rzeczywiście twój jest metoda losowa gdzie indziej kopalnia jest DialogBox, wygląda to okno dialogowe w zdarzeniu startowym powoduje problem. –

+0

Właśnie wstawiłem wywołanie MessageBox.Show ("test") w moim przykładzie i nadal działało. Podejrzewam, że coś jest nie tak z Twoim LoginDialog, zawsze zwracającym wartość false, lub innym błędem odnoszącym się do LoginDialog. –

+0

Nie, debugowanie i krok po kroku widzę, że działa poprawnie. –

16

Akash, natknąłem się na ten problem, próbując wprowadzić LoginDialog, tak jak twój. Okno dialogowe nie ma błędu, ale raczej zachowanie jest zgodne z projektem.

Nie błąd. Domyślnym trybem ShutdownMode aplikacji jest OnLastWindowClosed, więc od razu po zamknięciu pierwszego okna Twoja aplikacja zacznie się zamykać w dół: ! Zmień na OnExplicitShutdown i będzie działać, ale będziesz musiał zarządzać zamknięciem.

Zobacz ten poprzedni StackOverflow pytanie: WPF ShowDialog returns null immediately on second call

+0

Wow, nie wiedziałem o tym, świetna odpowiedź, spróbuję tego użyć i sprawdzić, czy to działa. –

4

prostu spróbować w OnStartup():

StartupUri = new Uri("Forms/CustomerEntry.xaml", UriKind.Relative); 
Powiązane problemy