C# WPF自定义弹出窗口导致程序崩溃?

C# WPF自定义弹出窗口导致程序崩溃?,c#,wpf,.net-4.0,C#,Wpf,.net 4.0,我有一个位于任务栏中的程序(通过一个隐藏表单),它生成一个弹出窗口(一个定制的wpf窗口类),显示启动是否完全成功。此程序设置为启动时运行(实际产品将运行),当我启动计算机并启动程序时,程序将停止响应。我不确定这是因为它开始打开第二个窗口(实际的用户界面),还是因为计算机一次发生了太多事情。你知道是什么原因导致了这种情况吗?根据我的经验,WPF应用程序可能会因各种原因崩溃,这是你无法预料的,所以下面介绍如何解决WPF应用程序启动时出现的问题 首先确保您的应用程序具有正确的异常处理:在每个入口点上

我有一个位于任务栏中的程序(通过一个隐藏表单),它生成一个弹出窗口(一个定制的wpf窗口类),显示启动是否完全成功。此程序设置为启动时运行(实际产品将运行),当我启动计算机并启动程序时,程序将停止响应。我不确定这是因为它开始打开第二个窗口(实际的用户界面),还是因为计算机一次发生了太多事情。你知道是什么原因导致了这种情况吗?

根据我的经验,WPF应用程序可能会因各种原因崩溃,这是你无法预料的,所以下面介绍如何解决WPF应用程序启动时出现的问题

首先确保您的应用程序具有正确的异常处理:在每个入口点上尝试/捕获,在您的情况下-未处理的异常事件侦听器连接在应用程序的第一个可能位置:

 AppDomain.CurrentDomain.UnhandledException += (s,args)=>{
       MessageBox.Show("Unhandled Exception: "+args.ExceptionObject);
    };
然后确保应用程序在直接执行时正确运行

WPF应用程序的启动有点模糊,它们的Main()方法位于生成的部分类obj\App.g.cs中,该类的另一部分是空的App.xaml.cs 如果在反序列化BAML时遇到问题,您甚至不会看到MainWindow.xaml.cs代码执行。在这种情况下,您需要做的是将obj\App.g.cs的内容复制到一个新的类Program.cs中,使其成为应用程序的启动类,并将上面提到的错误处理程序作为Program.cs中复制的Main()方法的第一行:

[System.STAThreadAttribute()]
[System.Diagnostics.DebuggerNonUserCodeAttribute()]
[System.CodeDom.Compiler.GeneratedCodeAttribute("PresentationBuildTasks","4.0.0.0")]
public static void Main() {
    AppDomain.CurrentDomain.UnhandledException += (s,args)=>{
       MessageBox.Show("Unhandled Exception: "+args.ExceptionObject);
    };
    Storm.Designer.App app = new Storm.Designer.App();
    app.InitializeComponent();
    app.Run();
}

也许您的应用程序依赖于某些服务,这些服务是在wpf应用程序加载之后加载的??? 您可以使用任务计划程序启动wpf应用程序,在其中可以设置下一个可用参数: 在启动时, 将任务延迟x分钟, 如果应用程序崩溃,请重新启动,
等等。

添加一些异常处理,或检查事件日志,我相信这是因为你的代码在弹出窗口打开时失败了。你有没有试着看看你的程序中发生了什么?我试着添加登录名,让程序在运行时弹出一个错误框,但它只是冻结了,无法达到返回的状态。而且这些启动弹出窗口非常烦人,如果没有很好的理由,就不要这样做。(回答)-启动所有东西的应用程序只是一个标准的windows窗体(这样我们就可以用notify图标做某些事情)。(评论)-弹出窗口尽可能小,因为我们知道人们不想被打扰(Drop Box是臭名昭著的,我们正在努力确保我们绝对不会那么麻烦)。你也可以使用WPF应用程序中的NotifyIcon,你需要参考Windows.Forms和System.Drawing,然后在窗口构造函数中可以添加如下代码:NotifyIcon notify=new NotifyIcon(){balloottipicon=ToolTipIcon.Info,Icon=new Icon(@“Storm.ico”),Visible=true,};notify.MouseClick+=(s,arg)=>{if(WindowState==WindowState.Maximized)WindowState=WindowState.Minimized;else WindowState=WindowState.Maximized;};也许那时我应该考虑将该应用程序转换为纯wpf应用程序。