wpf - 需要帮助理解 WPF MeasureOverride 和 ArrangeOverride 无穷大和 0 尺寸

标签 wpf layout

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

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

当我将面板放在网格内时,覆盖中的传入大小为 0 或 PositiveInfinity(我忘记了),但我需要知道的是“我的空间实际上可以有多大?”不是无穷大。。

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

还是我以完全错误的方式解决这个问题?测量和排列看起来非常复杂,只是在 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);
}

关于wpf - 需要帮助理解 WPF MeasureOverride 和 ArrangeOverride 无穷大和 0 尺寸,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2588111/

相关文章:

php - HTML 布局技术(用于管理面板)

c# - WPF ListView : Attaching a double-click (on an item) event

c# - 将新段落追加到 RichTextBox

wpf窗口事件在窗口关闭后继续引发

Qt:当行悬停在 QFormLayout 中时如何收到通知?

twitter-bootstrap - 将 Bootstrap 模板集成到 cakephp

android - 在 Toolbar 和 LinearLayout 之间的左侧无法解释的间隙/填充

android - 如何在线性布局中右对齐

c# - WPF,MVVM : Creating new View and passing an argument to its ViewModel

c# - 如何在WPF应用程序上修复 “The calling thread cannot access this object because a different thread owns it.”