代码之家  ›  专栏  ›  技术社区  ›  John Christman

WPF在xp中以120 dpi失败,但在96 dpi失败

  •  0
  • John Christman  · 技术社区  · 15 年前

    这很奇怪。我有一个WPF应用程序,当dpi设置为96时,它在xp中工作得很好,但是当dpi设置为120时失败了。我在两台具有相同结果的独立XP计算机上尝试了此操作。

    在加载异常处理程序之前,该错误在初始化时是正确的。

    你能给我一些关于如何调试这个的提示吗?这里是一个事件日志条目。

    
    Event Type: Error
    Event Source:   .NET Runtime
    Event Category: None
    Event ID:   1026
    Date:       11/17/2010
    Time:       7:37:15 PM
    User:       N/A
    Computer:   EXIDA-100A3799C
    Description:
    Application: exSILentia3.exe
    Framework Version: v4.0.30319
    Description: The process was terminated due to an unhandled exception.
    Exception Info: System.IO.FileFormatException
    Stack:
       at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
       at System.Windows.Threading.DispatcherOperation.InvokeImpl()
       at System.Windows.Threading.DispatcherOperation.InvokeInSecurityContext(System.Object)
       at System.Threading.ExecutionContext.runTryCode(System.Object)
       at System.Runtime.CompilerServices.RuntimeHelpers.ExecuteCodeWithGuaranteedCleanup(TryCode, CleanupCode, System.Object)
       at System.Threading.ExecutionContext.RunInternal(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
       at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object, Boolean)
       at System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext, System.Threading.ContextCallback, System.Object)
       at System.Windows.Threading.DispatcherOperation.Invoke()
       at System.Windows.Threading.Dispatcher.ProcessQueue()
       at System.Windows.Threading.Dispatcher.WndProcHook(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
       at MS.Win32.HwndWrapper.WndProc(IntPtr, Int32, IntPtr, IntPtr, Boolean ByRef)
       at MS.Win32.HwndSubclass.DispatcherCallbackOperation(System.Object)
       at System.Windows.Threading.ExceptionWrapper.InternalRealCall(System.Delegate, System.Object, Int32)
       at MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen(System.Object, System.Delegate, System.Object, Int32, System.Delegate)
       at System.Windows.Threading.Dispatcher.InvokeImpl(System.Windows.Threading.DispatcherPriority, System.TimeSpan, System.Delegate, System.Object, Int32)
       at MS.Win32.HwndSubclass.SubclassWndProc(IntPtr, Int32, IntPtr, IntPtr)
       at MS.Win32.UnsafeNativeMethods.DispatchMessage(System.Windows.Interop.MSG ByRef)
       at System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame)
       at System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame)
       at System.Windows.Threading.Dispatcher.Run()
       at System.Windows.Application.RunDispatcher(System.Object)
       at System.Windows.Application.RunInternal(System.Windows.Window)
       at System.Windows.Application.Run(System.Windows.Window)
       at exSILentia3.Application.Main()
    
    3 回复  |  直到 14 年前
        1
  •  2
  •   Ian Griffiths    15 年前

    您是否在其中一台计算机上安装了Visual Studio?如果是这样,我建议在调试器中运行,并在抛出异常时将其配置为中断。从“调试”菜单中,打开“异常”对话框,展开 公共语言运行时异常 项,然后展开System.IO部分以查找System.IO.FileFormatException项。确保选中了第一列(引发)。

    我建议这样做的原因是,您所显示的堆栈跟踪看起来像是用于重新引发的堆栈,而不是原始异常。正在从中引发异常 MS.Internal.Threading.ExceptionFilterHelper.TryCatchWhen 方法,它是检测未处理异常的WPF消息循环的位。所以,在日志中显示这不是一件有用的事情——您真正想知道的是,在WPF捕获异常之前,异常最初从何处抛出。如果您要求调试器在抛出异常时立即停止,那么您就能够做到这一点。

    这应该对这个问题有更多的了解。

    如果这不是一个选项,您可以尝试将处理程序附加到 Dispatcher.UnhandledException 事件,或 Application.DispatcherUnhandledException 事件并添加您自己的自定义日志代码。这可能为您提供有关异常最初从何处抛出的更多信息。

    在没有更详细的日志记录的情况下,我最明显的事情是(尽管这是一个长期的尝试):您在这两个系统上安装了任何不寻常的字体吗?

        2
  •  0
  •   John Christman    15 年前

    谢谢你的帮助。内部异常,是一个触摸更多的帮助,因为它限制了位图文件错误。

    我最终通过删除项目的副本直到它生效来解决这个问题。这个问题使我大吃一惊。当应用程序加载时,它会加载一个主窗口。我很早就删除了这个窗口的图标,但没有成功。直到后来我才圈回来,并删除了它加载窗口中图标的引用(谢天谢地),我疯了。也许它在Windows资源中缓存了一个已删除图标的副本?

    不管怎样,我使用图标编辑器(axialis iconworkshop)来确保存在所有可能的图标格式;但没有成功。

    最后,我离开了窗口,尝试在加载时加载图标,如果失败,我只运行iconless。这并不完美,但在图标导致问题的有限情况下,我不希望它就此崩溃。

    在旁注中,如果第一个图标失败,我还尝试加载一个旧的/低分辨率的图标版本,这在这种情况下确实有效。

    我只希望调试程序能在精确定位这一点上提供更多帮助。

        3
  •  0
  •   donovan    14 年前

    您可能需要查看图标的格式。我在具有高分辨率256图标的Vista之前的平台上遇到了WPF应用程序问题。我的设计团队提供了一个图标,它为旧平台无法加载的256个图标使用PNG格式。一旦那个特定的图标被改成位图格式,一切都很好。