Wpf 使用LayoutRounding和栅格星形大小调整导致无限布局循环

Wpf 使用LayoutRounding和栅格星形大小调整导致无限布局循环,wpf,layout,infinite-loop,Wpf,Layout,Infinite Loop,我有一个奇怪的问题与WPF布局,我现在已经跟踪到以下情况。该窗口有一个带有两列的网格,两列的大小均为星形,以便将宽度分成两个半部分。此外,该窗口还设置了UseLayoutRounding=True,以防止WPF停止思考时通常进行的愚蠢的像素间渲染。左列包含一个子类面板,我可以通过代码访问其MeasureOverride和ArrangeOverride方法。追溯它的调用和参数,我发现这两个方法都被无限地交替调用,其度量值大小类似于532;400和533的排列尺寸;400这比以前多了一个像素。当然,

我有一个奇怪的问题与WPF布局,我现在已经跟踪到以下情况。该窗口有一个带有两列的网格,两列的大小均为星形,以便将宽度分成两个半部分。此外,该窗口还设置了UseLayoutRounding=True,以防止WPF停止思考时通常进行的愚蠢的像素间渲染。左列包含一个子类面板,我可以通过代码访问其MeasureOverride和ArrangeOverride方法。追溯它的调用和参数,我发现这两个方法都被无限地交替调用,其度量值大小类似于532;400和533的排列尺寸;400这比以前多了一个像素。当然,这会触发各种各样的失效,最后,整个布局过程会重新启动。这会导致整个应用程序中出现各种各样的渲染错误,仅一个CPU内核就完全加载了这些错误

此问题仅在窗口宽度中每4个像素发生一次。我可以通过我的应用程序设置文件来控制窗口大小,这样我就可以很容易地查看和复制它。三种宽度是好的,第四种是坏的。因此,有25%的机会击中错误

我已经在其他地方注意到了这种情况,在网格中也有SharedSizeGroup,但几秒钟后,它最终会解决一些问题。这一次,它坐在那里永远旋转

我当然可以确定这1个像素的差异,并用一个令人讨厌的方法打破这个循环,但我担心有东西被渲染掉了1个像素,看起来很难看。我宁愿让WPF在一开始就不要告诉我的控件大小值不一致,而是选择一个并继续使用它

说:

使用布局舍入和星形大小调整时,布局系统会在列或行测量中创建小的变化,以避免亚像素渲染。例如,如果栅格的总宽度为100,其中有3列大小为星形,则布局系统不会创建三列宽度相等的33.3列,而是创建两列宽度为33,一列宽度为34

这对我来说似乎有点不稳定


如何修复WPF的行为?

请编写示例:)您需要一个两列星形网格的示例,以及两种标准布局方法的调用参数跟踪?好吧,我来看看我能做些什么使它变得简洁。给我一个例子,你调整窗口的大小,网格冻结ui,因为它会进入无限循环。我很容易看到度量覆盖和排列覆盖中的不同大小,但无法导致无限布局循环。通过进一步分析跟踪日志,我发现UpdateScrollInfo(在大小更改时调用InvalidateMeasure)在两个函数中都被调用。在测量中忽略它,克服了这个问题,似乎没有其他问题。我应该现在结束这个问题吗?如果你愿意,你可以在讨论中讨论这个问题,但要发布代码