Я пытаюсь реализовать что-то похожее на SharedSizeGroup в Column/RowDefinition для Grids.
Упрощенный случай:
<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, потому что это приведет к тому, что каждый элемент будет делать два прохода всего своего дерева нисходящих элементов? Хммммм. Какие-либо предложения?
ОБНОВЛЕНИЕ
Этот код иллюстрирует проблему более подробно:
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>
При вводе текста в текстовое поле оно переполняется, а пространство становится недоступным...