WPF在120 DPI中失败,但96 DPI则失败

时间:2010-11-18 03:59:05

标签: wpf windows-xp dpi wpf-4.0

这很奇怪。我有一个WPF应用程序,当DPI设置为96时在XP中工作得很好,但它失败并设置为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 个答案:

答案 0 :(得分:2)

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

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

这应该会对这个问题有所了解。

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

在没有更详细的日志记录的情况下,我发生的显而易见的事情就是这个(尽管这是一个很长的镜头):你在这两个系统上都安装了任何不寻常的字体吗?

答案 1 :(得分:0)

谢谢你的帮助。内部异常,更有帮助,因为它将其限制为Bitmap文件错误。

我最终通过去除项目的副本来解决这个问题,直到它发挥作用。问题是我面对的主演。当应用程序加载时,它会加载一个主窗口。我很早就删除了这个窗口的图标,没有成功。直到后来我才回过头来并删除了它加载的窗口中的图标引用(谢天谢地),我疯了。也许它缓存了Windows资源中已删除图标的副本?

无论如何,我使用我们的图标编辑器(Axialis IconWorkshop)来确保每种可能的图标格式都存在;没有成功。

我最终只是让窗口无图标,并尝试在加载时加载图标,如果失败,我只是运行无图标。这并不完美,但在图标导致问题的有限情况下,我不希望它因此而崩溃。

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

我只是希望调试器能更精确地指出这一点。

答案 2 :(得分:0)

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