【问题标题】:Label Size is always NaN?标签大小始终为 NaN?
【发布时间】:2011-02-25 02:09:08
【问题描述】:

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

【问题讨论】:

  • 你能发布你目前拥有的东西吗?

标签: c# wpf layout


【解决方案1】:

你是否在每个方法结束时调用 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 是不是因为面板包含在一个网格中,我将它的大小设置为自动? (但是,我也设置了 MinHeight、MinWidth 属性)
【解决方案2】:

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

http://msdn.microsoft.com/en-us/library/ms745058.aspx#LayoutSystem_Measure_Arrange

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

【讨论】:

  • 你好朱利安。谢谢你的帮助。据我了解,MeasureOverride 方法是让子元素告诉它父元素需要多少空间。但是,如果我无法在 Measure 之前获得它的 DesiredSize,我如何知道 Panel 需要多少宽度和高度来容纳其文本内容?换句话说,如果不是标签的 DesiredSize,我应该在每个度量调用中返回什么?
猜你喜欢
  • 1970-01-01
  • 2014-08-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-30
  • 1970-01-01
相关资源
最近更新 更多