Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 标签大小始终为NaN?_C#_Wpf_Layout - Fatal编程技术网

C# 标签大小始终为NaN?

C# 标签大小始终为NaN?,c#,wpf,layout,C#,Wpf,Layout,我有一个面板,我想扩展和覆盖MeasureOverride,并安排有我的自定义布局。 基本上,面板将包含一些标签。由于标签包含一些文本内容,因此它应该具有特定的大小。但是,当我使用label.ActualHeight或actualwidth时,desiredSize。。。在MeasureOverride或ArrangeOverride中,所有结果均为NaN。有什么方法可以获得所需的标签大小,以便文本内容合适吗?每个孩子的DesiredSize仅在您测量后设置。在MeasureOverride中,

我有一个面板,我想扩展和覆盖MeasureOverride,并安排有我的自定义布局。
基本上,面板将包含一些标签。由于标签包含一些文本内容,因此它应该具有特定的大小。但是,当我使用label.ActualHeight或actualwidth时,desiredSize。。。在MeasureOverride或ArrangeOverride中,所有结果均为NaN。有什么方法可以获得所需的标签大小,以便文本内容合适吗?

每个孩子的
DesiredSize
仅在您测量后设置。在
MeasureOverride
中,必须为面板的每个子级调用
child.Measure()
ArrangeOverride
中的
child.Arrange()
也是如此


根据您的评论进行编辑:只需传递标签可能具有的最大尺寸(可用尺寸),或者根据需要传递受限制的尺寸。如果对齐与拉伸不同,则测量后的标签将使用其最小尺寸作为所需尺寸。

是否将base.MeasureOverride(abailableSize)和base.ArrangeOverride(finalSize)称为base

是创建自定义面板的示例

MeasureOverride的自定义实现可能如下所示(从文章中):

ArrangeOverride的自定义实现可能如下所示(从文章中):

如果要强制面板渲染(调用MeasureOverride函数),请使用该函数


您也可以在msdn上查看。

您能发布到目前为止的信息吗?嗨,DevMan,谢谢您的回答。我没有使用基本方法。我的理想尺寸是NaN,是因为面板包含在网格中,我将其尺寸设置为自动??(但是,我也设置了MinHeight和MinWidth属性)Hi Julien。谢谢你的帮助。据我所知,MeasureOverride方法是让子元素告诉父元素它需要多少空间。但是,如果在测量之前我不能得到它想要的大小,我怎么知道面板需要多少宽度和高度来容纳它的文本内容呢?换句话说,如果不是标签的期望大小,我应该在每个度量调用中返回什么?
protected override Size MeasureOverride(Size availableSize)
{
    Size sizeSoFar = new Size(0, 0);
    double maxWidth = 0.0;

    foreach (UIElement child in Children)
    {
        child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity));

        if (sizeSoFar.Width + child.DesiredSize.Width > availableSize.Width)
        {
            sizeSoFar.Height += child.DesiredSize.Height;
            sizeSoFar.Width = 0;
        }
        else
        {
            sizeSoFar.Width += child.DesiredSize.Width;
            maxWidth = Math.Max(sizeSoFar.Width, maxWidth);
        }
    }

    return new Size(maxWidth, sizeSoFar.Height);
}
protected override Size ArrangeOverride(Size finalSize)
{
    Size sizeSoFar = new Size(0, 0);

    foreach (UIElement child in Children)
    {
        child.Arrange(new Rect(sizeSoFar.Width, sizeSoFar.Height, 
                               child.DesiredSize.Width, child.DesiredSize.Height));

        if (sizeSoFar.Width + child.DesiredSize.Width >= finalSize.Width)
        {
            sizeSoFar.Height += child.DesiredSize.Height;
            sizeSoFar.Width = 0;
        }
        else
        {
            sizeSoFar.Width += child.DesiredSize.Width;
        }
    }

    return finalSize;
}