我正在尝试构建一个包含一个子节点的简单面板,并将其捕捉到最近的网格大小.我很难通过重写MeasureOverride和ArrangeOverride来搞清楚如何做到这一点.
这就是我所追求的:我希望我的小组告诉它的主人:(a)它想要尽可能大,然后(b)当它发现那个大小是什么时,它会根据它自己的大小及其子UIElement的大小到最近的较小的捕捉点.因此,如果我们捕捉到10,并且我可以在不大于192x184的区域,面板将告诉其父容器"我的实际大小将是190x180".这样,任何与我的控制接壤的东西都能够与其边缘对齐,而不是潜在的空间.
当我把我的面板放在一个网格中时,我得到了0或PositiveInfinity(我忘记了)覆盖中的传入大小,但我需要知道的是"我的空间实际上有多大?" 不是无限的..
我认为问题的一部分是WPF考虑PositiveInfinity的魔术值和0的大小.我需要一种方式来说,通过MeasureOverride"我可以像你允许我一样大",然后在ArrangeOverride中实际调整大小为snapped大小.
或者我是以完全错误的方式解决这个问题的?测量和排列看起来非常复杂,只需在Reflector标准面板的代码中稍微徘徊.
在测量步骤中,如果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);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
7380 次 |
| 最近记录: |