WPF: общий размер в пользовательской панели? - PullRequest
1 голос
/ 20 апреля 2011

Я пытаюсь реализовать нечто похожее на 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>

При вводе текста в текстовое поле с переполнением он расширяется в пространство, недоступное ...

1 Ответ

2 голосов
/ 21 апреля 2011

По счастливой случайности, эти два прохода всего дерева уже встроены в систему макетов. Сначала соберите все натуральные размеры во время прохода MeasureOverride, а затем используйте эту информацию во время прохода ArrangeOverride, чтобы выбрать общие значения ширины.

...