Подходящее решение - разбиение строки на слова и распределение слов по ширине тестовой колонки с одинаковым интервалом.
На начальном этапе нам понадобится контейнер, назовем его JustifiedPanel, назначение которого понятно из названия.
/// /// Spreads items horizontally /// public class JustifiedPanel : Panel { public const int MinimalGapPixels = 2; protected override Size MeasureOverride(Size availableSize) { var width = 0d; var height = 0d; foreach (var item in Children) { item.Measure(availableSize); width += item.DesiredSize.Width; height = Math.Max(height, item.DesiredSize.Height); } if (Children.Count > 0) width += (Children.Count - 1)*MinimalGapPixels; return new Size(width, height); } protected override Size ArrangeOverride(Size finalSize) { var gapCount = Children.Count - 1; var spaceLeft = Children.Aggregate(finalSize.Width, (current, item) => current - item.DesiredSize.Width); var gap = gapCount > 0 ? spaceLeft/gapCount : 0; var left = 0d; foreach (var item in Children) { var final = new Rect(left, 0, item.DesiredSize.Width, finalSize.Height); item.Arrange(final); left += final.Width + gap; } return new Size(left, finalSize.Height); } }
Проверяем путем размещения в нашем тестовом MainPage.xaml следующего фрагмента:
<JustifiedPanel> <TextBlock text="This"/> <TextBlock text="is"/> <TextBlock text="a"/> <TextBlock text="justified"/> <TextBlock text="line"/> <TextBlock text="of"/> <TextBlock text="text"/> <TextBlock text="that"/> <TextBlock text="demonstrates"/> <TextBlock text="feasibility"/> </JustifiedPanel>
Внимание: код схематичный, для промышленного применения требуется доработка.
В следующий раз займемся разбиением строки и вопросами интернационализации (и19я).
Комментариев нет:
Отправить комментарий