DebugSettings.LayoutCycleTracingLevel 属性
定义
重要
一些信息与预发行产品相关,相应产品在发行之前可能会进行重大修改。 对于此处提供的信息,Microsoft 不作任何明示或暗示的担保。
获取或设置一个值,该值指示布局周期跟踪是否写入本机调试器以及记录的详细信息级别。
public:
property LayoutCycleTracingLevel LayoutCycleTracingLevel { LayoutCycleTracingLevel get(); void set(LayoutCycleTracingLevel value); };
LayoutCycleTracingLevel LayoutCycleTracingLevel();
void LayoutCycleTracingLevel(LayoutCycleTracingLevel value);
public LayoutCycleTracingLevel LayoutCycleTracingLevel { get; set; }
var layoutCycleTracingLevel = debugSettings.layoutCycleTracingLevel;
debugSettings.layoutCycleTracingLevel = layoutCycleTracingLevel;
Public Property LayoutCycleTracingLevel As LayoutCycleTracingLevel
属性值
枚举的值,指示布局周期跟踪是否写入本机调试器以及记录的详细信息级别。 默认为 None
。
注解
当布局周期崩溃迫在眉睫时,此跟踪级别用于确定故障转储中保留了多少调试信息,以及是否将任何信息输出到本机调试器。
-
None
- 在故障转储的 存储异常 中保留最少的布局周期信息。 本机调试器没有输出。 -
Low
- 在故障转储的 存储异常 中保留最少的布局周期信息。 相同的信息也会输出到本机调试器。 -
High
- 提供了更详细的布局周期信息,包括所有Measure
和Arrange
调用及其availableSize
和finalSize
值。 输出保留在故障转储的 存储异常 中。 相同的信息也会输出到本机调试器。
还可以设置 DebugSettings.LayoutCycleDebugBreakLevel ,以触发附加的本机调试器在可能导致布局周期崩溃的有趣事件期间中断。
XAML 布局
XAML 布局是向元素提供大小和位置的过程。 例如,在垂直 StackPanel
布局中,为每个子级提供一个位置,以便它们水平对齐并按顺序垂直显示。
对 XAML 树中的所有元素进行布局是迭代的,其中布局过程可能会导致触发另一个布局传递的更改。 此过程预期会聚合,最终布局传递生成结果,而不会触发任何新的布局传递。 如果进程未能聚合 (每次布局传递都会触发另一个布局传递) ,则进程将终止,并且应用崩溃并出现布局周期异常。
布局周期错误
默认情况下,遇到布局周期故障的 XAML 应用会提供最少的信息来帮助你查找和解决问题:
- 将引发 Application.UnhandledException 事件,并通知崩溃是由于布局周期问题造成的。
- 某些信息保存在 已存储的异常中。
可以设置为 LayoutCycleTracingLevel
将布局周期跟踪信息发送到本机调试器输出,这比使用已存储的异常更易于访问,并增加布局周期日志记录的详细程度以提供更多信息。
下面是涉及 Slider 控件的布局周期崩溃的一些示例输出:
[LayoutCycleTracing] "SetValue(Width=866.400024)","LayoutCycleCountdown: 7","ClassName: Microsoft.UI.Xaml.Shapes.Rectangle","Name: HorizontalDecreaseRect","Instance: 0x000001C67FB0EE70","TypeIndex: 701"
[LayoutCycleTracing] "DesiredSize changed, old: 865.599976x0.000000 new: 866.400024x0.000000","LayoutCycleCountdown: 6","ClassName: Microsoft.UI.Xaml.Shapes.Rectangle","Name: HorizontalDecreaseRect","Instance: 0x000001C67FB0EE70","TypeIndex: 701"
[LayoutCycleTracing] "SetValue(Width=865.599976)","LayoutCycleCountdown: 4","ClassName: Microsoft.UI.Xaml.Shapes.Rectangle","Name: HorizontalDecreaseRect","Instance: 0x000001C67FB0EE70","TypeIndex: 701"
[LayoutCycleTracing] "DesiredSize changed, old: 866.400024x0.000000 new: 865.599976x0.000000","LayoutCycleCountdown: 3","ClassName: Microsoft.UI.Xaml.Shapes.Rectangle","Name: HorizontalDecreaseRect","Instance: 0x000001C67FB0EE70","TypeIndex: 701"
[LayoutCycleTracing] "SetValue(Width=866.400024)","LayoutCycleCountdown: 1","ClassName: Microsoft.UI.Xaml.Shapes.Rectangle","Name: HorizontalDecreaseRect","Instance: 0x000001C67FB0EE70","TypeIndex: 701"
[LayoutCycleTracing] "DesiredSize changed, old: 865.599976x0.000000 new: 866.400024x0.000000","LayoutCycleCountdown: 0","ClassName: Microsoft.UI.Xaml.Shapes.Rectangle","Name: HorizontalDecreaseRect","Instance: 0x000001C67FB0EE70","TypeIndex: 701"
此日志输出显示 Width
元素 (和生成的所需大小) HorizontalDecreaseRect
在 866.400024 和 865.599976 之间切换。 可以使用此信息进一步调查,包括使用 DebugSettings.LayoutCycleDebugBreakLevel 进入调试器以调查变量,以查找布局代码中的任何问题。
以下是跟踪输出中列出的一些常见属性:
- LayoutCycleCountdown: 指定当前布局传递计数。 布局传递计数从允许的最大传递开始,倒计时为 0。 如果布局过程在传递 0 结束时未收敛,则会发生布局周期异常。
-
ClassName: 与消息关联的子类的
FrameworkElement
类名。 -
名字:
FrameworkElement.Name
FrameworkElement
与消息关联的 的 (如果有)。 -
实例: 与消息关联的 的内部
FrameworkElement
表示形式的内存地址。 这对于筛选以跟踪单个实例的消息特别有用。 -
TypeIndex: 表示类类型的内部索引
FrameworkElement
。 这通常可以忽略。 - SetValue: 设置影响布局的属性时,会列出属性的名称,并列出某些值类型的新值。
-
DesiredSize: 当测量
FrameworkElement
的结果与之前测量时的大小不同时,将显示所需大小的变化。