переопределение OnStartup в WPF
по какой-то причине я не могу заставить это работать вообще. Я прочитал из разных источников, что я могу переопределить OnStartup в приложении WPF, и он сработает по мере создания приложения. Однако, что бы я ни делал, ничего не происходит. Вот код.
public partial class App : Application
{
protected override void OnStartup(StartupEventArgs e)
{
// My code goes here, but nothing ever happens.
base.OnStartup(e);
}
}
очевидно, я что-то упускаю. К сожалению, страница MSDN также не дает много информации. http://msdn.microsoft.com/en-us/library/system.windows.application.onstartup.aspx
что я делаю не так?
изменить:
Оказывается, моей проблемой была небольшая опечатка в пространстве имен. Приложение.код XAML.cs имел класс, определенный как ' RTDMyApp.App " и приложение.XAML-файл называл его RTD_MYApp.App " в любом случае, этот факт в сочетании с принятым ответом ниже вернул меня на путь.
3 ответов
Я думаю, что вы действительно хотите сделать, это подписаться до Startup
событие. Это можно сделать в файле XAML:
<Application ... Startup="Application_Startup">
вы также удалили StartupUri из приложения xaml?
Если вам нужно было создать окно, которое вы хотите показать:
base.OnStartUp(e);
Window1 w = new Window1();
this.MainWindow = w;
w.Show();
последовательность последовательность последовательность. Как досадно.
правильная последовательность (для приложения WPF с нет основного метода явно разработан/ объявлен) является:
// XAML
... Startup="Application_Startup"
//code-behind
private void Application_Startup(object sender, StartupEventArgs e)
{
...
...
// do something. In fact, here I do a lot of stuff that reflects
// some serious recent application illnesss:
try
{
//http://connect.microsoft.com/VisualStudio/feedback/details/618027/uriformatexception-thrown-by-ms-internal-fontcache-util
System.Environment.SetEnvironmentVariable("windir", Environment.GetEnvironmentVariable("SystemRoot"));
// per http://msdn.microsoft.com/en-us/library/system.globalization.cultureinfo.ietflanguagetag(v=vs.110).aspx
var cultureName = CultureInfo.CurrentCulture.Name;
FrameworkElement.LanguageProperty.OverrideMetadata(
typeof(FrameworkElement),
new FrameworkPropertyMetadata(
XmlLanguage.GetLanguage(cultureName)));
// Setup unhandled exception handlers
#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
// Start the dispatcher
// for Galasoft threading and messaging
DispatcherHelper.Initialize();
}
catch (Exception ex)
{
ex.PreserveExceptionDetail();
throw ex;
}
}
а потом:
protected override void OnStartup(StartupEventArgs e)
{
App.Current.ShutdownMode = ShutdownMode.OnExplicitShutdown;
App.HasRaisedFatalException = false;
base.OnStartup(e);
try
{
//Force just one copy to run
this.ForceSingleInstance();
...
...
...
}
и пока пациент чувствует себя намного лучше.