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);
}
}
Aplikacja wciąż próbuje otworzyć StartupUri Spróbuj tego - http. : //stackoverflow.com/a/6602102/2342414 – benshabatnoam