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

StackOverflow https://stackoverflow.com/questions/104224

Вопрос

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

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

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

Редактировать:Это просто повторилось снова, поэтому на этот раз, когда я попытался проникнуть в отладчик, я выбрал "показать дизассемблирование".Это приводит меня к MS.Win32.UnsafeNativeMethods.GetMessageW.Далее следует трассировка стека:

[Managed to Native Transition]  

WindowsBase.dll !MS.Win32.Небезопасные методы.GetMessageW(ссылка System.Windows.Взаимодействие.Сообщение MSG, System.Runtime.Службы взаимодействия.HandleRef hWnd, int uMsgFilterMin, int uMsgFilterMax) + 0x15 байт
WindowsBase.dll !Система.Windows.Обработка потоков.Диспетчер.Получение сообщения (см. System.Windows.Взаимодействие.Сообщение MSG, Система.IntPtr hwnd, int minMessage, int maxMessage) + 0x48 байт WindowsBase.dll!Система.Windows.Нарезание резьбы.Диспетчер.PushFrameImpl (Система.Windows.Обработка потоков.Фрейм DispatcherFrame = {Система.Windows.Нарезание резьбы.DispatcherFrame}) + 0x8b байт WindowsBase.dll!Система.Windows.Обработка потоков.Диспетчер.Нажимной фрейм (System.Windows.Нарезание резьбы.Фрейм DispatcherFrame) + 0x49 байт
WindowsBase.dll !Система.Windows.Обработка потоков.Dispatcher.Run() + 0x4c байт
PresentationFramework.dll !Система.Windows.Приложение.RunDispatcher (игнорирование объекта) + 0x1e байт
PresentationFramework.dll !Система.Windows.Приложение.Запуск внутри системы.Windows.Window окно) + 0x6f байт PresentationFramework.dll!Система.Windows.Приложение.Запустить(System.Windows.Window окно) + 0x26 байт PresentationFramework.dll!Система.Windows.Application.Run() + 0x19 байт WinterGreen.exe!WinterGreen.App.Main() + 0x5e байт C# [Встроен в управляемый переход]
[Удалось перейти на родной язык]
mscorlib.dll !System.AppDomain.nExecuteAssembly (System.Отражение.Сборка assembly, строка [] аргументов) + 0x19 байт mscorlib.dll!System.Runtime.Хостинг.ManifestRunner.Run(bool checkAptModel) + 0x6e байт mscorlib.dll!System.Runtime.Хостинг.ManifestRunner.ExecuteAsAssembly() + 0x84 байта mscorlib.dll!System.Runtime.Хостинг.ApplicationActivator.CreateInstance(Система.ActivationContext activationContext, строка [] activationCustomData) + 0x65 байт mscorlib.dll!System.Runtime.Хостинг.ApplicationActivator.CreateInstance(System.ActivationContext activationContext) + 0xa байт mscorlib.dll!System.Активатор.CreateInstance(System.ActivationContext активацияcontext) + 0x3e байт
Microsoft.VisualStudio.Процесс размещения.Utilities.dll!Microsoft.VisualStudio.Процесс размещения.HostProc.RunUsersAssemblyDebugInZone() + 0x23 байта
mscorlib.dll !Система.Обработка потоков.ThreadHelper.ThreadStart_Context (состояние объекта) + 0x66 байт
mscorlib.dll !Система.Обработка потоков.ExecutionContext.Run(Система.Обработка потоков.ExecutionContext ExecutionContext, Система.Обработка потоков.Обратный вызов ContextCallback, состояние объекта) + 0x6f байт
mscorlib.dll !Система.Обработка потоков.ThreadHelper.ThreadStart() + 0x44 байта

Это было полезно?

Решение

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

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

Другие советы

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

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

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

Теперь вопрос в том, почему и как я могу устранить эту проблему?Изделие спроектировано так, чтобы не иметь окантовки с некоторыми закругленными углами и прозрачных деталей.

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top