WPF应用程序启动问题

7

我现在头脑混乱,试图完全理解Unity。所以我决定直接跳进去,在一个分支中开始添加它,看看会带我去哪里。令人惊讶的是(或许不是),我现在卡在了让我的Application正确加载上。

看起来这样做的正确方式是在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示例代码(来自Codeplex),它们做的事情完全相同,只是它们可以工作!
我还通过单步执行启动了应用程序,它最终会命中App.xaml的第一行。当我进入此行时,应用程序就开始“运行”,但我看不到任何东西(我的断点也没有命中)。如果我在示例应用程序中做完全相同的事情,则会将我放入OnStartup中,这就是我期望发生的事情。啊!
我还刚刚从头开始创建了一个新的WPF应用程序,删除了StartupUri,重写了OnStartup(),它也可以工作。到底怎么回事?
将Unity构造放入GUI的Window_Loaded事件处理程序中是否有问题?它是否真的需要在App级别上?
4个回答

6

请确保 App.xaml 中的 x:Class 与 App.xaml.cs 中的命名空间/类相同。很容易从另一个项目中复制/粘贴并忘记修改。

如果由于任何原因您无法解决此问题,请删除 App.xaml 并添加一个 Main(),其中执行 new App().Run()。如果这也不起作用,则有些事情真的很奇怪。


命名空间和类都是正确的——我正在将我的当前应用程序转换为Unity,所以现在我所做的就是改变它启动的方式。我可能会尝试像Thomas建议的那样将App.xaml更改为Page,然后添加Main。但如果示例可以工作,我认为这应该可以工作!让我有点疯狂。 :) - Dave
这对我有用。在xaml中,我使用了“Application”,而在vb中使用了“App”。将xaml更改为“App”后,它就可以工作了... - Kingpin

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问题)。我应该改变那个。 - Dave
App.xaml目前设置为ApplicationDefinition。奇怪的是,我正在查看来自Codeplex的Unity代码示例,它设置的方式完全相同,但它可以工作!该源代码的作者删除了StartupUri并简单地重写了OnStartup,他的应用程序按预期工作。唉! - Dave
我有点困惑,你是指GUI.xaml吗?GUI.xaml是我想要在应用程序启动时显示的初始窗口。我不能将其设置为App.xaml,因为我会收到“在同一AppDomain中无法创建多个System.Windows.Application实例”的错误。无论如何,如果我使用GUI.xaml,OnStartup永远不会被调用。 - Dave
它应该被设置为"ApplicationDefinition"而不是"Page"。 - Jeremy

1
在我的情况下,我遇到了Julien Lebosquain所提到的“非常奇怪的事情”部分。
我一直检查和重新检查名称、命名空间、事件处理程序等,但仍然无法发现任何问题,但我的WPF MainWindow.xaml仍然首先打开,绕过了所需的启动方法。
最终,我删除了MainWindow.xaml...但它仍然首先弹出。此时,我清理了解决方案,从磁盘中删除了二进制文件(在修改启动项目后),并关闭并重新打开了解决方案。
这“修复”了我的问题。

0

我遇到了类似的问题——我的应用程序构造函数和OnStartup没有被调用(断点没有被命中)。如果有人遇到这个线程,这里还有另一件可能出错的事情。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接