UseLayoutRounding和Grid星形大小导致无限的布局循环

时间:2014-02-12 22:16:29

标签: wpf layout infinite-loop

我对WPF布局有一个奇怪的问题,我现在已经跟踪到以下情况。窗口有一个带有两列的网格,两个都是星号,可以将宽度分成两半。此外,窗口设置了UseLayoutRounding = True,以防止WPF在停止思考时通常会执行的像素之间的愚蠢渲染。左列包含一个子类Panel,我可以访问其MeasureOverride和ArrangeOverride方法。追踪它的调用和参数,我看到两个方法被无限地,交替地调用,测量大小为532; 400,排列大小为533; 400。这比以前多了一个像素。当然,这会触发各种失效,最终重新启动整个布局过程。这会导致整个应用程序中出现各种渲染错误,而单独一个CPU核心就完全加载了它。

此问题仅在窗口宽度中每4个像素发生一次。我可以通过我的应用程序设置文件控制窗口大小,以便我可以轻松查看和重现它。三个宽度是好的,第四个是坏的。所以有25%的几率碰到这个错误。

我已经注意到其他地方已经出现过一次又一次的情况,也有网格中的SharedSizeGroups,但几秒钟后它最终会解决问题。这一次,它永远在那里旋转。

我可以肯定地确定这个1像素差异并用一个令人讨厌的黑客打破循环,但后来我担心某些东西被渲染出1像素关闭它看起来很难看。我宁愿让WPF首先不要告诉我控制不一致的大小值,而是决定一个并坚持下去。

MSDN说:

  

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

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

我该怎么做才能解决WPF的行为?

0 个答案:

没有答案