标签尺寸总是NaN?

时间:2010-05-28 11:21:27

标签: c# wpf layout

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

2 个答案:

答案 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