我有一个面板,我想要扩展并覆盖MeassureOverride并安排我的自定义布局。 基本上,面板将包含一些标签。由于标签有一些文字内容,因此应该有特定的尺寸。但是,当我在MeassureOverride或ArrangeOverride中使用label.ActualHeight或实际宽度,desiredSize ...时,都会导致NaN。有没有什么办法可以获得所需的标签尺寸,以便文本内容适合?标签大小始终是NaN?
回答
是否在每个方法的末尾调用base.MeasureOverride(abailableSize)和base.ArrangeOverride(finalSize)?
Here是创建自定义面板
的一个例子的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);
}
ArrangeOverride的自定义实现可能是这样的(从该帖子):
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;
}
如果你想强制面板渲染(调用MeasureOverride函数),使用InvalidateMeasure功能
您还可以在msdn上检出Custom Panel Elements。
嗨DevMan,谢谢你的回答。我没有使用基本方法。我的DesiredSize是NaN,是因为Panel包含在一个Grid中,我把它的Size设置为Auto? (但是,我也设置了MinHeight,MinWidth属性以及) – 2010-05-28 14:10:03
嗨,我试过这个,它工作 – 2010-06-07 01:24:53
每个孩子的DesiredSize
只有在您测量后才会设置。在您的MeasureOverride
中,您必须拨打child.Measure()
为您的每个小组的孩子。 ArrangeOverride
中的child.Arrange()
也是如此。
见http://msdn.microsoft.com/en-us/library/ms745058.aspx#LayoutSystem_Measure_Arrange
编辑回应您的评论:只是通过您的标签可能具有的最大尺寸(可用大小),或限制大小,如果你需要。如果对齐与拉伸不同,则曾经测量的标签将使用其最小尺寸作为DesiredSize
。
嗨Julien。谢谢你的帮助。据我所知,MeasureOverride方法是让子元素告诉它父级需要多少空间。 但是,如果我在测量之前无法获得其DesiredSize,我怎么能知道面板需要适应其文本内容的高度? 换句话说,如果不是标签的DesiredSize,我应该在每个度量中返回什么? – 2010-05-28 14:14:22
你可以发布你到目前为止? – DevDemon 2010-05-28 12:19:40