在 WPF 中重写 OnStartup

问题描述 投票:0回答:4

出于某种原因,我根本无法让它工作。我从各种来源了解到,我可以在 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”无论如何,这一事实与下面接受的答案相结合使我回到了正轨.

c# wpf startup
4个回答
24
投票

您是否也从 App xaml 中删除了 StartupUri?

如果你这样做了,你必须创建你想要显示的窗口:

base.OnStartUp(e);
var window = new Window1();
this.MainWindow = window;
window.Show(); 

15
投票

我认为您真正想做的是订阅

Startup
活动。您可以在 XAML 文件中执行此操作:

<Application ... Startup="Application_Startup">

0
投票

最初的问题是在大约 12 年前提出并回答的,但我对启动过程也同样缺乏了解,现有的回答并没有为我充分解释这一点。现在我理解得更好了,我想我应该添加我的解释。

在您的 App.xaml 文件中,您有 3 个用于影响启动顺序的选项(通常,您只想执行其中之一):

  1. 添加 'StartupUri="MainWindow.xaml' - 这指定 MainWindow 的 XAML 文件,它将自动实例化并显示,或者
  2. Add 'Startup="YourCustomStartupHandler"' - 这指定您在 App.xaml.cs 中定义的处理“Startup”事件的事件处理程序。

    注意:不要从这里调用base.OnStartup(),因为它将引发一个新的启动事件,该事件再次触发您的自定义启动处理程序 - >无限循环/StackOverflow!!!
  3. 不要向应用程序 XAML 添加任何内容,而是在应用程序代码中重写基本 Application 类的基本 OnStartup(e) 方法。

    当您的应用程序运行时,WPF 会自动调用 Application.OnStartup() 函数。如果您覆盖它,那么您的代码就会被执行。您的 OnStartup() 重写函数应在退出之前调用基本 OnStartup() 函数,因为基本方法会引发“启动”事件(您的代码或您正在使用的某些框架可能依赖于该事件)

如果您选择同时执行 #2(定义 Startup 事件处理程序)和 #3(覆盖基本 OnStartup() 方法),那么这两个例程都将被调用(假设您的覆盖函数在退出之前调用基本 OnStartup() 方法)

在方法 2 或 3 中,您需要在编写的函数中手动实例化 MainWindow 对象,并调用它的 .Show() 方法来显示它。


-1
投票

序列序列序列。真烦人。

正确的顺序(对于具有 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();

...
...
...
}

到目前为止,病人感觉好多了。

© www.soinside.com 2019 - 2024. All rights reserved.