我有一个面板,我想扩展并覆盖MeassureOverride并安排我的自定义布局。 基本上,面板将包含一些标签。由于标签有一些文本内容,因此它应具有特定的大小。但是当我在MeassureOverride或ArrangeOverride中使用label.ActualHeight或actualwidth,desiredSize ...时,所有结果都是NaN。有什么方法可以获得所需的标签大小,以便文本内容适合吗?
答案 0 :(得分:3)
您是否在每个方法结束时调用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答案 1 :(得分:2)
每个孩子的DesiredSize
仅在您测量后才设定。在MeasureOverride
,您必须为每个小组的孩子致电child.Measure()
。 child.Arrange()
中的ArrangeOverride
也是如此。
请参阅http://msdn.microsoft.com/en-us/library/ms745058.aspx#LayoutSystem_Measure_Arrange
编辑以回复您的评论:只是传递您的标签可能具有的最大尺寸(可用尺寸),或者如果需要,可以使用受限制的尺寸。如果对齐与拉伸不同,则一旦测量过的标签将使用其最小尺寸DesiredSize
。