如何解决WPF UI问题?

时间:2020-03-06 14:27:10  来源:igfitidea点击:

我正在使用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(object ignore) + 0x1e bytes

      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 bytes 
      WinterGreen.exe!WinterGreen.App.Main() + 0x5e bytes C#
      [Native to Managed Transition]

      [Managed to Native Transition]

      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(object state) + 0x66 bytes

      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

解决方案

尝试删除窗口的无边界行为,看看是否有帮助。另外,我们是否在BeginInvoke()或者Invoke()进行任何长时间运行的操作?

另一件事要看:当我们闯入代码时,请尝试查看主线程以外的线程。其中之一可能正在阻止UI线程。

Snoop是一种出色的工具。非常适合查看给定时间在视觉树上显示的WPF对象。我不确定它有多大帮助,但是我们可能会在UI线程中做很多额外的事情。 Snoop可能可以跟踪屏幕上显示的内容,从而使我们了解要查找的内容。

WPF应用可能由于性能问题而挂起。尝试使用Perforator查看是否有软件渲染的任何部分,或者应用程序使用的视频显存过多。

我已经删除了鲍勃·金(Bob King)建议的无边界行为。迄今为止,这似乎已经解决了这个问题。

现在的问题是,为什么以及如何解决该问题?该产品设计为无边界,带有一些圆角和透明零件。

哈拉,...问题似乎与无边界的窗户无关(至少在我的情况下)。

将" AllowsTransparency"设置为true会对性能产生重大影响。看起来这么大的打击,整个事情都可以挂在UI线程上。非常奇怪的行为。可能与此票有关