在 Windows 10 中检测到布局周期,但在 Windows 8.1 中未检测到
Posted
技术标签:
【中文标题】在 Windows 10 中检测到布局周期,但在 Windows 8.1 中未检测到【英文标题】:Layout Cycle Detected in Windows 10 but not in Windows 8.1 【发布时间】:2016-08-14 03:09:27 【问题描述】:我正在使用一个计时器,它每 10 秒更新一次布局,直到进度条没有完全填满。
在 Windows 8.1 中似乎没有问题,但在 Windows 10 中,会抛出 Layout Cycle Detected Exception。
【问题讨论】:
看看这个MSDN Link的备注部分,看看有没有什么想法 @MarkHall 我能够确定问题所在。我试图设置新的垂直和水平偏移。值似乎在自行改变,导致布局更新处于无限循环中。 【参考方案1】:原来的代码是
private void SetVerticalOffSet()
Popup ParentPopup = this.Parent as Popup;
if (ParentPopup == null)
return;
double ActualVerticalOffset = ParentPopup.VerticalOffset;
double ActualHorizontalOffset = ParentPopup.HorizontalOffset;
double NewVerticalOffset = (Window.Current.Bounds.Height - DecryptionDialog_MainGrid.ActualHeight) / 2;
double NewHorizontalOffset = (Window.Current.Bounds.Width - DecryptionDialog_MainGrid.ActualWidth) / 2;
if (ActualVerticalOffset != NewVerticalOffset || ActualHorizontalOffset != NewHorizontalOffset)
ParentPopup.VerticalOffset = NewVerticalOffset;
ParentPopup.HorizontalOffset = NewHorizontalOffset;
每次更新布局时都会调用它。
if 块导致无限循环,因为 ActualVerticalOffSet 和 ActualHorizontalOffSet 在 Windows 10 中不断变化。(在小数点的第 10 位)
if (ActualVerticalOffset != NewVerticalOffset || ActualHorizontalOffset != NewHorizontalOffset)
ParentPopup.VerticalOffset = NewVerticalOffset;
ParentPopup.HorizontalOffset = NewHorizontalOffset;
此修复的暂定解决方案是
if (Math.Round(ActualVerticalOffset) != Math.Round(NewVerticalOffset) || Math.Round(ActualHorizontalOffset) != Math.Round(NewHorizontalOffset))
ParentPopup.VerticalOffset = NewVerticalOffset;
ParentPopup.HorizontalOffset = NewHorizontalOffset;
直到微软到来
【讨论】:
以上是关于在 Windows 10 中检测到布局周期,但在 Windows 8.1 中未检测到的主要内容,如果未能解决你的问题,请参考以下文章