C# 是什么导致UWP应用程序间歇性崩溃并抛出Windows.UI.Xaml.dll!CfocusRectManager错误

C# 是什么导致UWP应用程序间歇性崩溃并抛出Windows.UI.Xaml.dll!CfocusRectManager错误,c#,visual-studio,uwp-xaml,C#,Visual Studio,Uwp Xaml,我们正在开发一个UWP应用程序,并注意到在VisualStudio中启动调试过程时出现间歇性崩溃 Exception Unhandled Unhandled exception at 0x00007fff8f9ac10c (Windows.UI.Xaml.dll) in [ourAppName].exe: 0xC0000005: Access violation reading location 0x0000000000000000 我们还看到,在将AppX包侧向加载到特定机器上(而不是其他机

我们正在开发一个UWP应用程序,并注意到在VisualStudio中启动调试过程时出现间歇性崩溃

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=????????????????
我们的应用程序是一个相当简单的两页益智游戏应用程序,其中第一页基本上是用于启动游戏板的主页

在应用程序崩溃之前,第一页会立即显示

我们已经尝试通过注释来隔离页面构造函数中的任何异步代码,但崩溃仍然发生


有没有想过是什么原因导致了车祸?

经过进一步的实验,我偶然发现了这个问题,并找到了一个超级简单的复制程序,它演示了车祸的原因,也验证了我们的工作

罪魁祸首是具有以下属性设置的按钮控件:

FocusVisualPrimaryBrush="{x:Null}"
要重现问题,请执行以下操作:

  • 创建类型为Blank App(通用Windows)的全新Windows通用项目
  • 向现有网格控件添加按钮

请注意,如果按F5开始调试,则可能看不到错误。 但是,如果您在启动时未按Ctrl-F5进行调试,则新应用程序将在启动几秒钟后崩溃

我们的应用程序使用Eye控件,因此选项卡顺序中第一个控件周围的可见焦点矩形会分散注意力,因此我在Properties窗口中将FocusVisualPrimary设置为No brush,这是按钮Xaml定义中{x:Null}值的来源

作为一项工作,我能够将这一行更改为:

<Button HorizontalAlignment="Center" Width="100" Height="100" FocusVisualPrimaryBrush="Transparent" />

焦点矩形不会分散注意力,应用程序停止崩溃


作为后续工作,我搜索了我的代码,查找FocusVisualPrimaryBrush被设置为Null的所有情况,并在应用程序中找到了一些可能由于复制/粘贴原始按钮而发生的其他实例。除了在启动时崩溃外,我还发现切换到FocusVisualPrimaryBrush设置为Null的控件也会导致应用程序突然崩溃。此后,我删除了所有出现的“{x:Null}”或将其替换为“Transparent”。

经过进一步的实验,我偶然发现了这个问题,并找到了一个超级简单的复制程序,它演示了崩溃的原因,也验证了我们的解决方法

罪魁祸首是具有以下属性设置的按钮控件:

FocusVisualPrimaryBrush="{x:Null}"
要重现问题,请执行以下操作:

  • 创建类型为Blank App(通用Windows)的全新Windows通用项目
  • 向现有网格控件添加按钮

请注意,如果按F5开始调试,则可能看不到错误。 但是,如果您在启动时未按Ctrl-F5进行调试,则新应用程序将在启动几秒钟后崩溃

我们的应用程序使用Eye控件,因此选项卡顺序中第一个控件周围的可见焦点矩形会分散注意力,因此我在Properties窗口中将FocusVisualPrimary设置为No brush,这是按钮Xaml定义中{x:Null}值的来源

作为一项工作,我能够将这一行更改为:

<Button HorizontalAlignment="Center" Width="100" Height="100" FocusVisualPrimaryBrush="Transparent" />

焦点矩形不会分散注意力,应用程序停止崩溃

作为后续工作,我搜索了我的代码,查找FocusVisualPrimaryBrush被设置为Null的所有情况,并在应用程序中找到了一些可能由于复制/粘贴原始按钮而发生的其他实例。除了在启动时崩溃外,我还发现切换到FocusVisualPrimaryBrush设置为Null的控件也会导致应用程序突然崩溃。此后,我将所有出现的“{x:Null}”删除或替换为“Transparent”