WPF窗口在启动时崩溃,或者它启动但挂起并且不呈现内容

Jef*_*ght 7 wpf

我遇到了一些令人讨厌的问题,WPF应用程序崩溃在某些客户端计算机上,但在其他地方工作 - 每个开发人员的噩梦.

我在这里发布问题/解决方案,以帮助保持开发人员的理智.这些都不容易排除故障.

这两个问题都是经典的"它适用于我的机器但不适用于我们的机器"问题.

  1. WPF应用程序在启动时崩溃.没有错误,不明白为什么.
  2. WPF应用程序启动,窗口边框显示,但内容不绘制.它只是挂起(报告为"透明窗口")单击关闭会触发崩溃报告(机器是Windows XP).

Jef*_*ght 20

1)WPF应用程序在启动时崩溃.没有错误,不明白为什么.

首先实际查找错误的关键故障排除步骤是向app.xaml添加其他错误处理.

在App.xaml标头中,添加:

<Application DispatcherUnhandledException="App_DispatcherUnhandledException" />
Run Code Online (Sandbox Code Playgroud)

并在您的App.xaml.cs中添加如下内容:

    void App_DispatcherUnhandledException(object sender, DispatcherUnhandledExceptionEventArgs args)
    {
        log.Fatal("An unexpected application exception occurred", args.Exception);

        MessageBox.Show("An unexpected exception has occurred. Shutting down the application. Please check the log file for more details.");

        // Prevent default unhandled exception processing
        args.Handled = true;

        Environment.Exit(0);
    }
Run Code Online (Sandbox Code Playgroud)

添加这个额外的调试后,我发现了错误:

System.TypeInitializationException:'System.Windows.Media.FontFamily'的类型初始值设定项引发异常.---> System.ArgumentException:路径中的非法字符.

进一步的研究,谷歌搜索和咖啡,导致客户端机器在注册表中的字体条目中有一个尾随'◻'字符的解决方案

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Fonts

删除这个流氓角色解决了这个问题.

不知道这是如何进入注册表的

查看职业拯救博客文章"如何破解每个WPF应用程序".

2)WPF应用程序启动,窗口边框显示,但内容不绘制.它只是挂起(报告为"透明窗口")

这是另一个与字体相关的问题.我最初将它归结为Window.xaml中的fontSize ="16",而不是在客户端站点上的一台(并且只有一台)机器上运行,就好像WPF拒绝将它们的字体渲染为16(?).我删除了指定字体大小的代码并且它有效...但事实证明,它只适用于我的登录配置文件.在同一台机器上同事的登录配置文件仍然失败.我可以像我一样登录,成功运行,注销,他自己登录,运行它,并且它会因"透明的悬挂窗口"而失败.相同的机器,相同的权限.

作为最后的手段,我以他身份登录并注意到他有一个带有放大字体的自定义主题集.我将windows主题改回了经典主题......这解决了问题(?!?).此问题似乎也与字体相关,但我没有确定绝对的根本原因.将主题更改回标准主题是一种临时解决方法.