2013-02-09 138 views
-1

我正在寫一個自定義面板,我想知道如何告訴我的孩子,當他們需要重新測量他們的父母也應該重新計量。父母的措施給兒童大小

舉例來說,其中一個孩子改變了其寬度,父母也應該再次重新測量,導致他的父母也做了重新測量,然後是他父母的父母和他父母的父母,等等。 up VisualTree。我怎麼做?

這裏是面板的措施的代碼..但如何告訴父也重新測量

protected override Size MeasureOverride(Size availableSize) 
{ 
double x; 
double y; 
var children = this.InternalChildren; 
for (int i = 0; i < children.Count; i++) 
    { 
     UIElement child = children[i]; 
     child.Measure(new Size(double.PositiveInfinity, double.PositiveInfinity); 
     y += child.DesiredSize.Height; 
     x = Math.Max(x, child.DesiredSize.Width); 
     } 
return new Size(x, y); 
} 
+1

你不這樣做。它由WPF自動完成。只需嘗試一下。 – Clemens 2013-02-09 20:58:28

+0

以及它沒有自動執行..如果我告訴面板你有200×200的大小,然後我改變一個孩子的寬度爲300,面板不更新..這是我的問我這個問題 – cyberist 2013-02-09 21:28:49

+1

你需要提供更多關於您想要實現的內容以及爲什麼並顯示一些代碼的信息。如果我們被猜測,Stackoverflow的人無法提供幫助。 – 2013-02-09 21:35:20

回答

1

看看那個孩子安排在元素的左上角這個非常簡單的自定義面板:

public class MyPanel : Panel 
{ 
    protected override Size MeasureOverride(Size availableSize) 
    { 
     Trace.TraceInformation("MeasureOverride"); 

     var size = new Size(); 

     foreach (UIElement element in InternalChildren) 
     { 
      element.Measure(availableSize); 

      size.Width = Math.Max(size.Width, element.DesiredSize.Width); 
      size.Height = Math.Max(size.Height, element.DesiredSize.Height); 
     } 

     return size; 
    } 

    protected override Size ArrangeOverride(Size finalSize) 
    { 
     Trace.TraceInformation("ArrangeOverride"); 

     foreach (UIElement element in InternalChildren) 
     { 
      element.Arrange(new Rect(element.DesiredSize)); 
     } 

     return finalSize; 
    } 
} 

如果你使用它像一個按鈕孩子

<local:MyPanel> 
    <local:MyPanel> 
     <Button Width="100" Height="100" Click="Button_Click"/> 
    </local:MyPanel> 
</local:MyPanel> 

和如下圖所示該調整大小按鈕

private void Button_Click(object sender, RoutedEventArgs e) 
{ 
    ((FrameworkElement)sender).Width += 20; 
} 

你會發現,在每一個按鈕點擊父母和祖父母面板Button_Click事件處理程序將被測量和安排。跟蹤輸出看起來是這樣的:

CustomPanelTest.vshost.exe Information: 0 : MeasureOverride 
CustomPanelTest.vshost.exe Information: 0 : MeasureOverride 
CustomPanelTest.vshost.exe Information: 0 : ArrangeOverride 
CustomPanelTest.vshost.exe Information: 0 : ArrangeOverride 

因此沒有必要調用MeasureArrange手動在父面板。

+0

我傳遞給我的面板200x200,然後該值傳遞給孩子..但是當我調整一個孩子的面板不會更新和重新測量,所以我想它不適合我,因爲我正在使用修正大小值。我需要做些什麼才能使其工作 – cyberist 2013-02-10 05:00:02

+0

當您希望它在動態響應子元素大小更改時,您不應該修復面板的大小。 – Clemens 2013-02-10 08:55:46

+0

好吧,我補充說,我返回200x200作爲面板中measureoverride的大小,但一旦任何孩子的寬度大於200面板不再測量 – cyberist 2013-02-10 10:03:21