2011-04-20 81 views
1

我試圖在Column/RowDefinition for Grids中實現類似於SharedSizeGroup的東西。WPF:自定義面板中的共享大小?

簡化的情況:

<l:MyCustomPanel> 
    <l:MyCustomPanel> 
    <TextBlock l:MyCustomPanel.SharedWidth="t1" /> 
    </l:MyCustomPanel> 
    <l:MyCustomPanel> 
    <TextBlock l:MyCustomPanel.SharedWidth="t1" /> 
    </l:MyCustomPanel> 
</l:MyCustomPanel> 

根面板限定的範圍。具有相同SharedWidth的所有元素應具有相同的寬度。我已經實現了我的自定義度量和排列行爲,但Im努力讓它與SharedSize模型一起工作。我懷疑我不得不做兩次安排過程的通行證?首先找出默認尺寸(並收集最大寬度),然後再傳一遍以使用此最大寬度作爲排列結果中的參數。但是,我會如何做到這一點?我想我不能在每個ArrangeOverride中運行兩遍,因爲這會使每個元素都會對其整個降序元素樹進行兩次遍歷? Hmmmmm。有什麼建議麼?

UPDATE

此代碼說明了此問題更詳細:

public class CustomPanel : Panel 
{ 
    protected override Size MeasureOverride(Size availableSize) 
    { 
     Children[0].Measure(availableSize); 
     return Children[0].DesiredSize; 
    } 

    protected override Size ArrangeOverride(Size finalSize) 
    { 
     Children[0].Arrange(new Rect(new Point(), new Size(finalSize.Width/2, finalSize.Height))); 
     return finalSize; 
    } 
} 

<StackPanel> 
    <l:CustomPanel> 
    <TextBox /> 
    </l:CustomPanel> 
</StackPanel> 

當在文本框中輸入文本使其溢出,它擴展到空間不可用......

回答

2

幸運的是,整個樹的這兩個通道已經內置到佈局系統中。首先在MeasureOverride階段收集所有自然尺寸,然後在ArrangeOverride階段使用該信息選擇共享寬度值。

+0

啊,我明白了。但是因爲每個孩子傳遞給Measure的可用空間在Arrange中發生了變化(當收集到的最大值可用時),它看起來像元素仍然表現得好像它們具有它們初始給定的所有空間一樣,但被截斷。文本框例如擴展到排列之外,就好像它們有更多空間可以展開一樣。這怎麼能解決? – 2011-04-21 12:26:09

+0

在排列過程中,您既知道文本塊的所需寬度,又知道文本塊的計算共享寬度,該寬度應該更大。您負責:只需設置文本塊的最終長度以包含共享寬度並且文本塊將符合。 – 2011-04-21 15:42:55

+0

該文本框不符合我的代碼,但我可能做錯了什麼......我用一些代碼更新了這篇文章。 – 2011-04-22 12:34:26