首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WPF MeasureOverride返回值

WPF MeasureOverride返回值
EN

Stack Overflow用户
提问于 2015-07-22 09:48:04
回答 2查看 718关注 0票数 0

我正在写MeasureOverride实现,有一点我有点卡住了。函数的返回值。这就是代码。

代码语言:javascript
复制
protected override Size MeasureOverride(Size availableSize)
{
Double cHeight = 0.0;
Double cWidth = 0.0;
Size size = new Size(0, 0);

foreach (UIElement child in InternalChildren)
{
    child.Measure(new Size(availableSize.Width, availableSize.Height));
    if (child.DesiredSize.Width > cWidth)
    {
        cWidth = child.DesiredSize.Width;   
    }
    cHeight += child.DesiredSize.Height;    
}

size.Width = double.IsPositiveInfinity(availableSize.Width) ? size.Width : cWidth;
size.Height = double.IsPositiveInfinity(availableSize.Height) ? size.Height : cHeight;

return size;
}

我的理解是,返回一个空的Size对象表示该元素将使用所有可用的空间。然而,在这种情况下,当可用空间为无穷大正时,它将返回零。它不应该是另一种方式。当无限空间可用时,是否只使用子元素所需的空间?否则约束自己使用任何可用的空间?

代码语言:javascript
复制
size.Width = double.IsPositiveInfinity(availableSize.Width) ? cWidth : availableSize.Width;
size.Height = double.IsPositiveInfinity(availableSize.Height) ? cHeight : availableSize.Height;
EN

回答 2

Stack Overflow用户

发布于 2015-07-23 02:38:09

这个问题很难回答。这取决于你想要实现什么。您可能知道,度量阶段仅确定所需的大小。然后,排列阶段会处理最终的值。

我可以想象一个具有上述代码中行为的面板。它可以避免父ScrollViewer预留太多空间,以防我们的面板的子面板需要非常多的空间(例如,因为它本身就是一个包含许多项的ItemsControl )。通过返回0,周围的ScrollViewer将不会保留此空间,并且在排列阶段,我们的面板可以根据需要占用空间,尽管我们返回了0。

这将是一个非常特殊的情况,但我今天正在和一位大学生讨论这个问题,当时他在ScrollViewer中有一个DataGrid和其他元素。

如果没有"Arrange“中的代码,这只是一种推测,但这是这种代码的一种可能用法。

票数 1
EN

Stack Overflow用户

发布于 2015-08-14 02:56:21

使用MeasureOverride,您可以返回控件想要的大小。如果MeasureOverride被赋予了无限的边界,那么您可以将其大小设置为容纳所有子对象或不包含所有子对象;这取决于您。另一方面,如果您返回的大小大于给定的大小,您的控件父级可能会接受这一点,并在以后切断您的控件。例如,如果您的控件位于网格中,并且网格宽度设置为500,则您的MeasureOverride函数将获得500的可用宽度。您可以返回600作为宽度,您将在ArangeOverride函数中获得600的宽度,但是父网格仍然只会给您的控件提供500的宽度,并且您的内容将被截断。

我用我自己为WinRT (Windows8.1Store App)编写的PriorityStackPanel控件尝试了一下,它就像我描述的那样工作。我认为WPF在这种情况下几乎是相同的。

在WinRT中,没有“空的”大小对象。size对象将为其设置一些值。NAN和PositiveInfinity都会导致异常,所以你真的应该返回你想要的控件大小。如何选择这个大小由你自己决定,但它不能是“你可以为我决定:像一个空的大小对象(在WinRT中)一样的值。即使你可以在WPF中返回它,我也不建议你这样做,因为它使代码不那么清晰。如果你需要更多的空间,只返回给你的可用的大小。如果你需要更多的空间,返回一个更大的大小,但如果你要求比它给你更多的空间,不要期望容器显示所有的内容。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31552543

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档