Как вы решаете проблемы с интерфейсом WPF?

Я работаю над приложением WPF, которое иногда показывает странные проблемы и кажется зависает в пользовательском интерфейсе. Это противоречиво, это происходит на разных страницах, но это случается достаточно часто, что является большой проблемой. Я должен отметить, что это не настоящее зависание, как описано ниже.

Моей первой мыслью было, что анимация некоторых кнопок была проблемой, поскольку они используются на большинстве страниц, но после их удаления все еще происходят зависания, хотя, по-видимому, немного реже. Я попытался взломать отладчик, когда происходит зависание; однако, здесь никогда не будет кода для просмотра. Мой код не работает. Я также заметил, что "зависание" не завершено. У меня есть код, который позволяет мне перетаскивать форму (у нее нет границы или заголовка), которая продолжает работать. У меня также есть выигранная кнопка закрытия, которая работает, когда я нажимаю на нее. Кажется, что нажатие на кнопки действительно работает во время выполнения моего кода, но пользовательский интерфейс просто никогда не обновляется, чтобы показать новую страницу.

Я ищу любые советы, инструменты или методы, чтобы отследить эту странную проблему, поэтому, если у вас есть какие-либо мысли, я буду очень признателен.

РЕДАКТИРОВАТЬ: Это просто произошло снова, поэтому на этот раз, когда я попытался взломать отладчик, я решил "показать разборку". Это приводит меня к 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 байт
WindowsBase.dll!System.Windows.Threading.Dispatcher.GetMessage(ref System.Windows.Interop.MSG msg, System.IntPtr hwnd, int minMessage, int maxMessage) + 0x48 байт WindowsBase.dll!System.Windows.Threading.Dispatcher.PushFrameImpl(System.Windows.Threading.DispatcherFrame frame = {System.Windows.Threading.DispatcherFrame}) + 0x8b байт WindowsBase.dll! System.Windows.Threading.Dispatcher.PushFrame (System.Windows.Threading.DispatcherFrame frame) + 0x49 bytes
WindowsBase.dll! System.Windows.Threading.Dispatcher.Run () + 0x4c байт
PresentationFramework.dll!System.Windows.Application.RunDispatcher(игнорирование объекта) + 0x1e байт
PresentationFramework.dll!System.Windows.Application.RunInternal(окно System.Windows.Window) + 0x6f байт PresentationFramework.dll!System.Windows.Application.Run(окно System.Windows.Window) + 0x26 байт PresentationFramework.dll! Система.Windows.Application.Run() + 0x19 байт WinterGreen.exe!WinterGreen.App.Main() + 0x5e байт C# [Относительно управляемого перехода]
[Управляемый к Родному Переходу]
mscorlib.dll! System.AppDomain.nExecuteAssembly (сборка System.Reflection.Assembly, строка [] args) + 0x19 байт mscorlib.dll!System.Runtime.Hosting.ManifestRunner.Run(bool checkAptModel) + 0x6e байт mscorlib.dll!.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() + 0x84 байт mscorlib.dll!System.Runtime.Hosting.ApplicationActivator.CreateInstance(System.ActivationContext ActivationContext, строка [] активация CustomData) + 0x65 байт. System.unstime ApplicationActivator.CreateInstance (System.ActivationContext активации Context) + 0xa байт mscorlib.dll!System.Activator.CreateInstance(System.ActivationContext активации Context) + 0x3e байт
Microsoft.VisualStudio.HostingProcess.Utilities.dll!Microsoft.VisualStudio.HostingProcess.HostProc.RunUsersAssemblyDebugInZone() + 0x23 байта
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart_Context(состояние объекта) + 0x66 байт
mscorlib.dll!System.Threading.ExecutionContext.Run(обратный вызов System.Threading.ExecutionContext executeContext, System.Threading.ContextCallback, состояние объекта) + 0x6f байт
mscorlib.dll!System.Threading.ThreadHelper.ThreadStart() + 0x44 байта

5 ответов

Решение

Попробуйте удалить поведение вашего окна без полей и посмотрите, поможет ли это. Кроме того, вы используете BeginInvoke() или Invoke () для каких-либо длительных операций?

Еще одна вещь, на которую стоит обратить внимание: когда вы взламываете свой код, попробуйте посмотреть на потоки, отличные от вашего основного потока. Одним из них может быть блокирование потока пользовательского интерфейса.

Ваше приложение WPF может зависать из-за проблем с производительностью. Попробуйте использовать Perforator, чтобы увидеть, есть ли у вас какие-либо части, которые визуализируются программным обеспечением, или если ваше приложение использует слишком много видео-памяти.

Одним из отличных инструментов является Snoop. Действительно приятно посмотреть, какие объекты WPF отображаются в визуальном дереве в данный момент времени. Я не уверен, насколько это поможет, но, возможно, вы забиваете поток пользовательского интерфейса множеством дополнительных вещей, которые он должен сделать. Snoop может помочь вам отследить, что на экране, чтобы дать вам представление о том, что искать.

Я убрал безграничное поведение, как предложил Боб Кинг. На сегодняшний день, похоже, избавился от проблемы.

Теперь вопрос, почему и как я могу решить проблему? Продукт разработан так, чтобы не иметь границ с некоторыми закругленными углами и прозрачными деталями.

Ура,... кажется, что проблема не связана с окнами без границ (по крайней мере, в моем случае).

Когда вы установите AllowsTransparency к истине. Казалось бы, такой большой удар, что все это может повредить поток пользовательского интерфейса. Очень странное поведение. Может быть связано с этим билетом

Другие вопросы по тегам