Я пытаюсь реализовать нечто похожее на SharedSizeGroup в Column / RowDefinition для гридов.
Упрощенный кейс:
<l:MyCustomPanel>
<l:MyCustomPanel>
<TextBlock l:MyCustomPanel.SharedWidth="t1" />
</l:MyCustomPanel>
<l:MyCustomPanel>
<TextBlock l:MyCustomPanel.SharedWidth="t1" />
</l:MyCustomPanel>
</l:MyCustomPanel>
Корневая панель определяет область действия. Все элементы с одинаковым SharedWidth должны иметь одинаковую ширину. Я реализовал свои собственные меры Measure и Arrange-поведения, но я изо всех сил пытаюсь заставить его работать с 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>
При вводе текста в текстовое поле с переполнением он расширяется в пространство, недоступное ...