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