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

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

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

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

EDIT: Это снова произошло, поэтому на этот раз, когда я попытался проникнуть в отладчик, я решил "показать разборку". Это приводит меня к 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) + 0x49 байт
    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! System.Windows.Application.Run() + 0x19 байт     WinterGreen.exe! WinterGreen.App.Main() + 0x5e байты С#     Переход к управляемому переходному процессу

    [Управляемый для коренного перехода]
    mscorlib.dll! System.AppDomain.nExecuteAssembly(сборка System.Reflection.Assembly, строка [] args) + 0x19 байт     mscorlib.dll! System.Runtime.Hosting.ManifestRunner.Run(bool checkAptModel) + 0x6e байт     mscorlib.dll! System.Runtime.Hosting.ManifestRunner.ExecuteAsAssembly() + 0x84 байт     mscorlib.dll! System.Runtime.Hosting.ApplicationActivator.CreateInstance(System.ActivationContext activationContext, string [] activationCustomData) + 0x65 байт     mscorlib.dll! System.Runtime.Hosting.ApplicationActivator.CreateInstance(System.ActivationContext activationContext) + 0xa байт     mscorlib.dll! System.Activator.CreateInstance(System.ActivationContext activationContext) + 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 callback, состояние объекта) + 0x6f байт
    mscorlib.dll! System.Threading.ThreadHelper.ThreadStart() + 0x44 байта

Ответ 1

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

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

Ответ 2

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

Ответ 3

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

Ответ 4

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

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

Ответ 5

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

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