2010-05-28 69 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