2010-09-15 12 views
5

Chcę, aby aplikacja WPF była uruchamiana tylko w określonych warunkach. Próbowałem następujących bez powodzenia:Jak zapobiec ładowaniu aplikacji WPF?

public partial class App : Application 
{ 
    protected override void OnStartup(StartupEventArgs e) 
    { 
     if (ConditionIsMet) // pseudo-code 
     { 
      base.OnStartup(e); 
     } 
    } 
} 

ale aplikacja działa normalnie nawet gdy warunek nie jest spełniony

Odpowiedz

13

Spróbuj tego:

protected override void OnStartup(StartupEventArgs e) 
{ 
    base.OnStartup(e); 
    if (MyCondition) 
    { 
     ShowSomeDialog("Hey, I Can't start because..."); 
     this.Shutdown(); 
    } 
} 
+2

Aplikacja wciąż próbuje otworzyć StartupUri Spróbuj tego - http. : //stackoverflow.com/a/6602102/2342414 – benshabatnoam

3

Innym rozwiązaniem

Designer

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

Kod za

public partial class App : Application 
{ 
    private void Application_Startup(object sender, StartupEventArgs e) 
    { 
     if (ConditionIsMet) 
     { 
      var window = new MainWindow(); 
      window.Show(); 
     } 
     else 
     { 
      this.Shutdown(); 
     } 
    } 
} 
0

To może być to, że robię to, że naprawdę bardzo przykry sposób, ale stwierdziliśmy, że walcząc z wezwaniem pierwszeństwa/zamówienia na starcie zakładając coś jest daremny. Naprawdę chciałem, aby każdy wyjątek podniesiony podczas uruchamiania aplikacji NATYCHMIAST zgłosił się do najbardziej zewnętrznego programu obsługi wyjątku, ale nawet gdy jeden został podniesiony, mój obiekt lokalizatora MVVM automatycznie tworzył sam siebie, ponieważ jest zdefiniowany jako zasób na poziomie aplikacji.

Oznaczało to, że kurczak przybył przed jajkiem, ale po tym samym jajku już się zepsuło !!!

więc rozwiązaniem było:

1) Zdjąć MVVM Locator od App.xaml.

2) Tworzenie zdarzenia Application_Startup

dodać te linie od góry:

#region Handlers For Unhandled Exceptions 
     // anything else to do on startup can go here and will fire after the base startup event of the application 
     // First make sure anything after this is handled 
     // Creates an instance of the class holding delegate methods that will handle unhandled exceptions. 
     CustomExceptionHandler eh = new CustomExceptionHandler(); 

     AppDomain.CurrentDomain.UnhandledException += 
      new UnhandledExceptionEventHandler(eh.OnAppDomainException); 
     // this ensures that any unhandled exceptions bubble up to a messagebox at least 
     Dispatcher.CurrentDispatcher.UnhandledException += new DispatcherUnhandledExceptionEventHandler(eh.OnDispatcherUnhandledException); 

     #endregion Handlers For Unhandled Exceptions 

3) Tie Uruchomienie w przypadku Application_Startup w App.xaml np

Startup="Application_Startup" <<<< this name is arbitrary but conventional AFAICT 

4) W Applicaton_Startup utwórz ViewModelLocator tak:

  Resources.Add("Locator", new ViewModelLocator()); 
      //You can use FindResource and an exception will be thrown straightaway as I recall 
      if (!(TryFindResource("Locator") == null)) 

       throw new ResourceReferenceKeyNotFoundException("ViewModelLocator could not be created", "Locator"); 

5) Następnie, zaraz po zasób został znaleziony, otwórz MainWindow, ale tylko wtedy, gdy Locator został pomyślnie instancja

  Uri uri = new Uri("pack:Views/MainWindow.xaml", UriKind.RelativeOrAbsolute); 
      Application.Current.StartupUri = uri; 

Krok (4) spowoduje natychmiastowe zgłoszenie wyjątku, jeśli konstruktor w Lokalizatorze ulegnie awarii, KTÓRY DZIAŁA CAŁY CZAS DO MNIE, NIEZAPOMNIANY.

Następnie wyjątek od kroku 4 jest obsługiwane w następujący sposób (ten przykład używa RadMessageBox ale nie krępuj się naprawić:

public void OnDispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs e) 
    { 
     try 
     { 

       var result = this.ShowExceptionDialog(e.Exception); 

     } 
     catch 
     { 


      RadMessageBox.Show("Fatal Dispatcher Error - the application will now halt.", Properties.Resources.CaptionSysErrMsgDlg, 
       MessageBoxButton.OK, MessageBoxImage.Stop, true); 
     } 

     finally 
     { 

      e.Handled = true; 

      // TERMINATE WITH AN ERROR CODE -1! 
      //Environment.Exit(-1); 
     } 
    } 
Powiązane problemy