出于某种原因,我根本无法让它工作。我从各种来源了解到,我可以在 WPF 应用程序中重写 OnStartup,并且它会在创建应用程序时触发。然而,无论我做什么,都没有发生。这是代码。
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
我做错了什么?
编辑:
事实证明,我的问题是命名空间中的一个小拼写错误。 App.xaml.cs 将类定义为“RTDMyApp.App”,App.xaml 文件将其称为“RTD_MYApp.App”无论如何,这一事实与下面接受的答案相结合使我回到了正轨.
您是否也从 App xaml 中删除了 StartupUri?
如果你这样做了,你必须创建你想要显示的窗口:
base.OnStartUp(e);
var window = new Window1();
this.MainWindow = window;
window.Show();
我认为您真正想做的是订阅
Startup
活动。您可以在 XAML 文件中执行此操作:
<Application ... Startup="Application_Startup">
最初的问题是在大约 12 年前提出并回答的,但我对启动过程也同样缺乏了解,现有的回答并没有为我充分解释这一点。现在我理解得更好了,我想我应该添加我的解释。
在您的 App.xaml 文件中,您有 3 个用于影响启动顺序的选项(通常,您只想执行其中之一):
如果您选择同时执行 #2(定义 Startup 事件处理程序)和 #3(覆盖基本 OnStartup() 方法),那么这两个例程都将被调用(假设您的覆盖函数在退出之前调用基本 OnStartup() 方法)
在方法 2 或 3 中,您需要在编写的函数中手动实例化 MainWindow 对象,并调用它的 .Show() 方法来显示它。
序列序列序列。真烦人。
正确的顺序(对于具有 NO Main 方法 显式开发/声明的 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();
...
...
...
}
到目前为止,病人感觉好多了。