【问题标题】:WPF app startup problemsWPF 应用程序启动问题
【发布时间】:2010-05-20 14:55:41
【问题描述】:

我的大脑现在正试图完全理解 Unity。所以我决定潜入并开始将它添加到一个分支中,看看它会把我带到哪里。令人惊讶的是(或者可能不是),我只是让我的应用程序正确加载。

似乎正确的方法是覆盖 App.cs 中的 OnStartup。我已从 App.xaml 中删除了我的 StartupUri,因此它不会创建我的 GUI XAML。我的 App.cs 现在看起来像这样:

public partial class App : Application
{
    private IUnityContainer container { get; set; }

    protected override void OnStartup(StartupEventArgs e)
    {
        container = new UnityContainer();
        GUI gui = new GUI();
        gui.Show();
    }

    protected override void OnExit(ExitEventArgs e)
    {
        container.Dispose();
        base.OnExit(e);
    }
}

问题是当我启动应用程序时没有任何反应!我在container 赋值处放了一个断点,它永远不会被命中。

我错过了什么? App.xaml 当前设置为 ApplicationDefinition,但我希望这可以工作,因为我正在查看的一些示例 Unity + WPF 代码 (from Codeplex) 做了完全相同的事情,只是它可以工作!

我还通过单步启动了该应用程序,它最终到达了 App.xaml 中的第一行。当我进入这一行时,应用程序刚刚开始“运行”,但我什么也没看到(而且我的断点没有被命中)。如果我在示例应用程序中执行完全相同的操作,则进入 App.xaml 会使我直接进入 OnStartup,这正是我所期望的。啊!

我还刚刚从头开始创建了一个新的 WPF 应用程序,删除了 StartupUri,覆盖了 OnStartup(),它也可以工作。 WTH?

仅将 Unity 构造放在我的 GUI 的 Window_Loaded 事件处理程序中是不是一件坏事?它真的需要在应用级别吗?

【问题讨论】:

    标签: wpf xaml startup


    【解决方案1】:

    仔细检查 App.xaml 中的 x:Class 是否与 App.xaml.cs 中的命名空间/类相同。很容易从另一个项目复制/粘贴而忘记修改它。

    如果由于任何原因您无法解决此问题,请删除 App.xaml 并添加执行 new App().Run()Main()。如果这也不起作用,那么这里真的很奇怪。

    【讨论】:

    • 命名空间和类是正确的——我是 Unity-fying 我当前的应用程序,所以我现在所做的只是改变它的启动方式。我可能会尝试像 Thomas 建议的那样将 App.xaml 更改为 Page,然后添加 Main。但我认为如果样本有效,这应该有效!快把我逼疯了。 :)
    • 这为我解决了问题。在 xaml 我有“应用程序”和 vb“应用程序”。将 xaml 更改为“应用程序”并且它工作...
    【解决方案2】:

    您的问题似乎与 Unity 完全无关...确保:

    • 启动对象设置为YourProject.App(在项目属性页面中)
    • App.xaml 的构建操作设置为“ApplicationDefinition”

    否则,我看不出它不应该工作的任何原因......


    更新:只是另一个想法...尝试将 StartupUri 设置回 App.xaml,并在 OnStartup 中调用基本实现:

    protected override void OnStartup(StartupEventArgs e)
    {
        container = new UnityContainer();
        base.OnStartup(e);
    }
    

    【讨论】:

    • 你是对的,这与 Unity 没有任何关系,只是我处于 Unity 心态(并且当时正在写一个不同的 Unity 问题)。我应该改变它。
    • App.xaml 当前设置为 ApplicationDefinition。奇怪的是,我正在查看来自 Codeplex 的 Unity 代码示例,它的设置方式完全相同,只是它可以工作!该源代码的作者删除了 StartupUri 并简单地覆盖了 OnStartup,他的应用程序可以按需要运行。啊!
    • 我很困惑,您是说 GUI.xaml,其中 GUI.xaml 是我希望在应用程序启动时显示的初始窗口吗?我无法将其设置为 App.xaml,因为我只会收到错误消息“无法在同一个 AppDomain 中创建多个 System.Windows.Application 实例”。无论如何,如果我使用 GUI.xaml,OnStartup 永远不会被调用。
    • 应该设置为“ApplicationDefinition”而不是“Page”
    【解决方案3】:

    就我而言,我遇到了 Julien Lebosquain 提到的“一些非常奇怪的东西”部分。

    我不断检查和重新检查名称、命名空间、事件处理程序等,没有发现任何错误,但我的 WPF MainWindow.xaml 仍然首先打开,绕过所需的启动方法。

    最终,我删除了 MainWindow.xaml ...但它仍然首先弹出。此时,我清理了解决方案,从磁盘中删除了二进制文件(在更改启动项目之后)并关闭并重新打开了解决方案。

    这“解决了”我的问题。

    【讨论】:

      【解决方案4】:

      我遇到了类似的问题——我的 App 构造函数和 OnStartup 没有被调用(断点没有被命中)。万一其他人遇到了这个线程,这里可能会出错。

      我有一个包含多个应用程序的解决方案,其中一个只是我用来管理一些 XML 文件的实用程序。用的不多,基本忘记了。最初,我的构建是针对“任何 CPU”的,但最近由于我正在使用一个库,我不得不将它们更改为“x86”。今天,我需要运行这个实用程序,但它崩溃了,并且在调试器中,App 类中没有任何内容被调用。检查命名空间(没问题)后,我决定清理项目(如上所述)。当我尝试运行该应用程序时,我收到了一个错误,即 VS 找不到 EXE。显然,VS 正在运行它在输出目录中发现的旧的“Any CPU”EXE,它正在崩溃,然后在我清理项目时被删除。我检查了构建 |配置管理器,果然,我没有为“x86”构建选择实用程序应用程序。一旦我添加它,一切都很好。希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-15
        • 2017-11-11
        相关资源
        最近更新 更多