【问题标题】:Need help understanding WPF MeasureOverride and ArrangeOverride infinity and 0 sizes需要帮助了解 WPF MeasureOverride 和 ArrangeOverride 无穷大和 0 大小
【发布时间】:2011-02-04 23:56:14
【问题描述】:

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

这就是我所追求的:我希望我的面板告诉它的所有者 (a) 它想要尽可能大,然后 (b) 当它发现那个大小是什么时,它会调整自己和它的大小根据最近的较小捕捉点的子 UIElement。因此,如果我们要捕捉到 10,并且我可以在不大于 192x184 的区域中,面板将告诉它的父容器“我的实际大小将是 190x180”。这样,任何与我的控件接壤的东西都可以与其边缘对齐,而不是潜在的空间。

当我将面板放入 Grid 中时,对于覆盖中的传入大小,我得到 0 或 PositiveInfinity(我忘记了),但我需要知道的是“我的空间实际上可以有多大?”不是无穷大..

我认为部分问题是 WPF 认为 PositiveInfinity 的魔法值和大小为 0。我需要一种方式来表达,通过 MeasureOverride “我可以像你允许的那样大”,并在 ArrangeOverride 中实际调整大小。

或者我是否以完全错误的方式处理这个问题?测量和排列看起来很复杂,只是在Reflector中标准面板的代码中徘徊了一点。

【问题讨论】:

    标签: wpf layout


    【解决方案1】:

    在测量步骤中,如果 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);
    }
    

    【讨论】:

      猜你喜欢
      • 2014-08-23
      • 1970-01-01
      • 1970-01-01
      • 2011-01-25
      • 2013-11-09
      • 2013-10-27
      • 1970-01-01
      • 2012-02-01
      • 2012-01-05
      相关资源
      最近更新 更多