WPF:自定义面板中的共享大小?

时间:2011-04-20 17:22:36

标签: wpf panel measure

我试图在Column / RowDefinition for Grids中实现类似于SharedSizeGroup的东西。

简化案例:

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

根面板正在定义范围。具有相同SharedWidth的所有元素应具有相同的宽度。我已经实现了我的自定义测量和排列行为,但我很难让它与SharedSize模型一起工作。我怀疑我必须以某种方式完成安排过程的两次通过?首先找出默认大小(并收集最大宽度),然后再一次传递以使用此最大宽度作为排列结果中的参数。但是我该怎么做呢?我想我不能在每个ArrangeOverride中运行两个传递,因为这会使每个元素都对其整个降序元素树进行两次传递? Hmmmmm。有什么建议吗?

更新

此代码更详细地说明了问题:

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>

在文本框中输入文本使其溢出时,它会扩展到空间不可用...

1 个答案:

答案 0 :(得分:2)

幸运的是,整个树的那两个通道已经内置到布局系统中。首先在MeasureOverride过程中收集所有自然尺寸,然后在ArrangeOverride过程中使用该信息来选择共享宽度值。