Принимая во внимание HorizontalAlignment и VerticalAlignment при создании пользовательской панели - PullRequest
3 голосов
/ 17 января 2011

Я пытаюсь создать пользовательскую панель в wpf. Вот сомнения у меня,

  • Как я считаю, Горизонтальное выравнивание и Вертикальные факторы выравнивания при размещать предметы в моей панели. Должен ли я проверить эти флаги в моем Метод ArrangeOverride ??
  • Рассмотрим что я хочу написать WrapPanel Клон. Если ширина панели установлена ​​на «Авто», как мне узнать фактическую ширину панели, чтобы устроить моего ребенка Предметы. Я всегда получаю ActualWidth / ActualHeight как 0. Я чего-то не хватает ???

Пожалуйста, помогите.

Ответы [ 3 ]

2 голосов
/ 17 января 2011

Независимо от того, действуете ли вы на горизонтальное и / или вертикальное выравнивание, зависит только от вас.Было бы плохо, если бы вертикальная StackPanel учитывала VerticalAlignment потомка.

Вы должны вызывать метод Measure () для каждого дочернего элемента управления.Это даст вам желаемый размер.

1 голос
/ 17 января 2011

Чтобы реализовать собственную панель, вам нужно реализовать MeasureOverride и ArrangeOverride. Во время компоновки вещи выясняются, поэтому окончательные значения еще не доступны. Для начала используйте аргумент Size, переданный вам в MeasureOverride, который является доступным размером. Вы можете использовать больше или меньше этой суммы. Это зависит от поведения макета вашей панели. Независимо от того, что вы делаете, вы должны звонить Measure всем своим детям, и вы, конечно, можете использовать эту информацию в своих расчетах.

Если у вас есть определенное поведение панели, которое вы хотите реализовать, но не хотите обрабатывать большое количество особых случаев, тогда вы можете предоставить своим детям все пространство, которое они запрашивают, в направлении, которое вы не складываете, и позволить своим детям при необходимости раскладывайте их с помощью панелей.

0 голосов
/ 17 января 2011
  • Вам не нужно учитывать горизонтальное выравнивание и вертикальное выравнивание.Эти свойства используются внутри FrameworkElement и вступают в силу автоматически.
  • Одиночный аргумент ArrangeOverride даст вам размер, какой родительский элемент разрешен для вашей панели.Вы должны организовать детей в этой области.Если вы имеете в виду, что «Auto» - это размер для размещения всех дочерних элементов панели, вы должны вычислить и вернуть его из MeasureOverride.

И не забудьте использовать InternalChildren вместо Children.

...