Как вы решаете проблемы с интерфейсом WPF? - PullRequest
10 голосов
/ 19 сентября 2008

Я работаю над приложением 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) + 0 015 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 байт C # [Родной для управляемого перехода]
[Управляемый к нативному переходу]
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, строка [] активацииCustomData) + 0x65 байт mscorlib.dll! System.Runtime.Hosting.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 ]

6 голосов
/ 19 сентября 2008

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

5 голосов
/ 19 сентября 2008

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

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

4 голосов
/ 22 сентября 2008

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

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

4 голосов
/ 19 сентября 2008

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

1 голос
/ 15 декабря 2009

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...