我试图在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>
在文本框中输入文本使其溢出时,它会扩展到空间不可用...
答案 0 :(得分:2)
幸运的是,整个树的那两个通道已经内置到布局系统中。首先在MeasureOverride
过程中收集所有自然尺寸,然后在ArrangeOverride
过程中使用该信息来选择共享宽度值。