我正在尝试构建一个包含一个子节点的简单面板,并将其捕捉到最近的网格大小。我很难通过覆盖MeasureOverride和ArrangeOverride来搞清楚如何做到这一点。
这就是我所追求的:我希望我的小组告诉它的主人(a)它想要尽可能大,然后(b)当它发现那个大小是什么时,它会调整自己的大小和它的大小子UIElement根据最近的较小的捕捉点。因此,如果我们捕捉到10,并且我可以在不大于192x184的区域,面板将告诉其父容器“我的实际大小将是190x180”。这样,任何与我的控制接壤的东西都能够与其边缘对齐,而不是潜在的空间。
当我把我的面板放在一个网格中时,我得到了0或PositiveInfinity(我忘记了)覆盖中的传入大小,但我需要知道的是“我的空间实际上有多大?”不是无限..
我认为部分问题是WPF认为PositiveInfinity的魔术值和0的大小。我需要一种方式来说,通过MeasureOverride“我可以像你允许我一样大”,然后在ArrangeOverride中实际调整大小为捕捉的大小。
或者我是以完全错误的方式来做这件事的?测量和排列看起来非常复杂,只需在Reflector标准面板的代码中稍微徘徊。
答案 0 :(得分:5)
在测量步骤中,如果WPF向您发送无穷大,您应该告诉它您想要多大。如果它发送0,那么你的布局实际上没有空间。在排列步骤中,您将被告知可用于布局的空间大小,这很可能与您在测量步骤中给出的大小不同。您无法在任一步骤中返回无穷大。以下代码应该完成您的目标(注意我假设一个UIElement Child属性):
protected overrride Size MeasureOverride(Size availableSize)
{
Child.Measure(availableSize);
return Child.DesiredSize;
}
protected override Size ArrangeOverride(Size finalSize)
{
int w = (((int)finalSize.Width) / SnapPrecision) * SnapPrecision;
int h = (((int)finalSize.Height) / SnapPrecision) * SnapPrecision;
Child.Arrange(new Rect(0, 0, w, h));
return new Size(w, h);
}