2010-05-28 46 views
2

我有一个面板,我想要扩展并覆盖MeassureOverride并安排我的自定义布局。 基本上,面板将包含一些标签。由于标签有一些文字内容,因此应该有特定的尺寸。但是,当我在MeassureOverride或ArrangeOverride中使用label.ActualHeight或实际宽度,desiredSize ...时,都会导致NaN。有没有什么办法可以获得所需的标签尺寸,以便文本内容适合?标签大小始终是NaN?

+0

你可以发布你到目前为止? – DevDemon 2010-05-28 12:19:40

回答

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

+0

嗨DevMan,谢谢你的回答。我没有使用基本方法。我的DesiredSize是NaN,是因为Panel包含在一个Grid中,我把它的Size设置为Auto? (但是,我也设置了MinHeight,MinWidth属性以及) – 2010-05-28 14:10:03

+0

嗨,我试过这个,它工作 – 2010-06-07 01:24:53

2

每个孩子的DesiredSize只有在您测量后才会设置。在您的MeasureOverride中,您必须拨打child.Measure()为您的每个小组的孩子。 ArrangeOverride中的child.Arrange()也是如此。

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

编辑回应您的评论:只是通过您的标签可能具有的最大尺寸(可用大小),或限制大小,如果你需要。如果对齐与拉伸不同,则曾经测量的标签将使用其最小尺寸作为DesiredSize

+0

嗨Julien。谢谢你的帮助。据我所知,MeasureOverride方法是让子元素告诉它父级需要多少空间。 但是,如果我在测量之前无法获得其DesiredSize,我怎么能知道面板需要适应其文本内容的高度? 换句话说,如果不是标签的DesiredSize,我应该在每个度量中返回什么? – 2010-05-28 14:14:22