你如何解决WPF UI问题?

时间:2008-09-19 18:17:21

标签: wpf debugging user-interface xaml

我正在开发一个WPF应用程序,它有时会出现奇怪的问题,并且在UI中似乎挂起。它是不一致的,它发生在不同的页面中,但它经常发生,这是一个大问题。我应该提一下,这不是真正的挂起,如下所述。

我的第一个想法是,某些按钮的动画是问题,因为它们在大多数页面上使用,但在删除它们之后仍然会出现挂起,尽管看起来有点不常见。当挂起发生时我试图闯入调试器;但是从来没有任何代码可供查看。我的代码没有运行。我也注意到“挂起”并不完整。我有代码可以让我拖动表单(它没有边框或标题)继续工作。我也有我赢得的关闭按钮,当我点击它时功能。点击按钮似乎实际上在我的代码运行时起作用,但UI根本不会更新以显示新页面。

我正在寻找任何建议,工具或技巧来追踪这个奇怪的问题,所以如果你有任何想法,我会非常感激。

编辑:它刚刚发生了,所以这次当我试图闯入调试器时,我选择“显示反汇编”。它带我到MS.Win32.UnsafeNativeMethods.GetMessageW。堆栈跟踪如下:

[Managed to Native Transition]  
  

WindowsBase.dll!MS.Win32.UnsafeNativeMethods.GetMessageW(ref System.Windows.Interop.MSG msg,System.Runtime.InteropServices.HandleRef hWnd,int uMsgFilterMin,int uMsgFilterMax)+ 0x15 bytes
      WindowsBase.dll!System.Windows.Threading.Dispatcher.GetMessage(ref System.Windows.Interop.MSG msg,System.IntPtr hwnd,int minMessage,int maxMessage)+ 0x48 bytes       WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame frame = {System.Windows.Threading.DispatcherFrame})+ 0x8b bytes       WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrame(System.Windows.Threading.DispatcherFrame frame)+ 0x49 bytes
      WindowsBase.dll!System.Windows.Threading.Dispatcher.Run()+ 0x4c bytes
      PresentationFramework.dll!System.Windows.Application.RunDispatcher(对象忽略)+ 0x1e字节
      PresentationFramework.dll!System.Windows.Application.RunInternal(System.Windows.Window window)+ 0x6f bytes       PresentationFramework.dll!System.Windows.Application.Run(System.Windows.Window window)+ 0x26 bytes       PresentationFramework.dll!System.Windows.Application.Run()+ 0x19字节       WinterGreen.exe!WinterGreen.App.Main()+ 0x5e bytes C#       [原产于管理过渡]
      [管理到原生过渡]
      mscorlib.dll!System.AppDomain.nExecuteAssembly(System.Reflection.Assembly assembly,string [] args)+ 0x19 bytes       mscorlib.dll!System.Runtime.Hosting.ManifestRunner.Run(bool checkAptModel)+ 0x6e bytes       mscorlib.dll!System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly()+ 0x84 bytes       mscorlib.dll!System.Runtime.Hosting.ApplicationActivator.CreateInstance(System.ActivationContext activationContext,string [] activationCustomData)+ 0x65 bytes       mscorlib.dll!System.Runtime.Hosting.ApplicationActivator.CreateInstance(System.ActivationContext activationContext)+ 0xa bytes       mscorlib.dll!System.Activator.CreateInstance(System.ActivationContext activationContext)+ 0x3e bytes
      Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone()+ 0x23 bytes
      mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(对象状态)+ 0x66字节
      mscorlib.dll!System.Threading.ExecutionContext.Run(System.Threading.ExecutionContext executionContext,System.Threading.ContextCallback callback,object state)+ 0x6f bytes
      mscorlib.dll!System.Threading.ThreadHelper.ThreadStart()+ 0x44 bytes

5 个答案:

答案 0 :(得分:6)

由于性能问题,您的WPF应用可能会挂起。尝试使用Perforator查看您是否有任何软件渲染的部件,或者您的应用是否使用了太多的视频RAM。

答案 1 :(得分:5)

尝试删除窗口的无边界行为,看看是否有帮助。你也可以在任何长时间运行的程序中使用BeginInvoke()或Invoke()吗?

要看的另一件事:当你闯入代码时,尝试查看主线程以外的线程。其中一个可能阻止了UI线程。

答案 2 :(得分:4)

一个很棒的工具是Snoop。非常适合查看在给定时间在可视树上显示的WPF对象。我不确定它会有多大帮助,但是你可能会因为需要做很多额外的事情而干扰UI线程。 Snoop可以帮助您追踪屏幕上的内容,让您了解要查找的内容。

答案 3 :(得分:4)

我已经删除了Bob King建议的无边界行为。到目前为止,这似乎摆脱了这个问题。

现在的问题是,为什么以及如何解决这个问题?该产品设计为没有边框,有一些圆角和透明部分。

答案 4 :(得分:1)

Hurray,......似乎问题与无边框窗口无关(至少在我的情况下)。

AllowsTransparency设置为true时会有很大的性能影响。看起来很重要,整个事情可以挂起UI线程。非常奇怪的行为。可能与this ticket

有关