Что приводит к сбою приложения UWP и выбрасыванию Windows.UI.Xaml.dll!CfocusRectManager error
Мы разрабатываем приложение UWP и замечаем периодические сбои при запуске процесса отладки в Visual Studio.
Exception Unhandled
Unhandled exception at 0x00007fff8f9ac10c (Windows.UI.Xaml.dll) in
[ourAppName].exe: 0xC0000005: Access violation reading location
0x0000000000000000
Мы также видели, как при запуске после боковой загрузки пакета AppX на определенные машины, но не на другие, была выпущена сборка приложения. Когда отладчик был присоединен к процессу на этой машине, ошибка была:
(7ebc.7298): Access violation - code c0000005 (first chance)
First chance exceptions are reported before any exception handling.
This exception may be expected and handled.
Windows_UI_Xaml!CFocusRectManager::GetFocusOptionsForElement+0x158:
00007ff9`43d7c10c 488b01 mov rax,qword ptr [rcx]
ds:00000000`00000000=????????????????
Наше приложение представляет собой довольно простое двухстраничное приложение-головоломку, где первая страница - это домашняя страница, которая используется для запуска игрового поля.
Первая страница отображается на мгновение до того, как приложение вылетает.
Мы попытались изолировать любой наш асинхронный код в конструкторе страницы, закомментировав его, но сбой все еще происходит.
Есть мысли о том, что может быть причиной сбоев?
1 ответ
После дальнейших экспериментов я наткнулся на эту проблему и обнаружил супер простое повторение, которое демонстрирует причину сбоя, а также проверяет нашу работу.
Виновником является элемент управления кнопки со следующей настройкой свойства:
FocusVisualPrimaryBrush="{x:Null}"
Чтобы воспроизвести проблему:
- создать совершенно новый Windows Universal проект типа Blank App (Universal Windows)
- добавить кнопку в существующий элемент управления Grid
<Button HorizontalAlignment="Center" Width="100" Height="100" FocusVisualPrimaryBrush="{x:Null}" />
Обратите внимание, что если вы начнете отладку, нажав клавишу F5, вы можете не увидеть ошибку. Однако, если вы запускаете без отладки, нажимая Ctrl-F5, новое приложение вылетает через несколько секунд после запуска.
Наше приложение использует Eye Control, поэтому видимый прямоугольник фокуса вокруг первого элемента управления в порядке вкладок отвлекает внимание, поэтому я установил для FocusVisualPrimary в окне "Свойства" значение "Без кисти", которое было источником значения {x:Null} в Xaml. определение кнопки.
В качестве обходного пути я смог изменить эту строку на:
<Button HorizontalAlignment="Center" Width="100" Height="100" FocusVisualPrimaryBrush="Transparent" />
и прямоугольник фокусировки не отвлекал, и приложение перестало падать.
В качестве последующего действия я искал в своем коде все вхождения FocusVisualPrimaryBrush, для которых было установлено значение Null, и обнаружил несколько других его экземпляров в приложении, которые могли произойти из-за копирования / вставки оригинальной кнопки. Помимо сбоя при запуске, я также обнаружил, что вкладка для элемента управления, для которого FocusVisualPrimaryBrush установлено в значение Null, также вызовет внезапный сбой приложения. С тех пор я удалил или заменил все вхождения "{x:Null}" на "Прозрачный".