代码之家  ›  专栏  ›  技术社区  ›  scobi

需要帮助了解WPF MeasureOverride和ArrangeOverride infinity和0 size吗

  •  5
  • scobi  · 技术社区  · 14 年前

    我试图构建一个包含一个子元素的简单面板,并将其捕捉到最近的网格大小。我很难弄清楚如何通过覆盖MeasureOverride和ArrangeOverride来做到这一点。

    我的目标是:我希望我的面板告诉它的所有者(a)它希望尽可能大,然后(b)当它发现这个大小时,它会根据最近的较小捕捉点调整自身和子UIElement的大小。因此,如果我们捕捉到10,并且我所在的区域不超过192x184,面板将告诉它的父容器“我的实际大小将是190x180”。这样,任何与我的控件相邻的对象都可以与其边缘对齐,而不是潜在的空间。

    我认为问题的一部分是WPF所考虑的正有限性和0代表大小的神奇值。我需要一种方法来说,通过MeasureOverride“我可以像你允许的那样大”,并在ArrangeOverride中实际调整到快照大小。

    还是我完全错了方向?测量和排列看起来非常复杂,只是在反射器标准面板的代码中徘徊了一下。

    1 回复  |  直到 14 年前
        1
  •  5
  •   Lars Truijens    14 年前

    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);
    }