2011-04-20 66 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