Очевидно, что единственным решением является разбиение текстовой строки на слова и расположение слов в столбце (как предлагает Джефф Йейтс выше). Первым делом проверяем идею с помощью контейнера Grid:
<Grid Name="grid1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="*"/>
<ColumnDefinition Width="Auto"/>
</Grid.ColumnDefinitions>
<TextBlock HorizontalAlignment="Left" Text="This" Grid.Column="0" />
<TextBlock HorizontalAlignment="Center" Text="is" Grid.Column="2" />
<TextBlock HorizontalAlignment="Center" Text="someprettylongpiece" Grid.Column="4" />
<TextBlock HorizontalAlignment="Right" Text="text" Grid.Column="6" />
</Grid>
Следующим шагом является создание пользовательской панели, которая выполняет разметку текстовых блоков без работы с сеткой:
<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>
(Пример исходного кода доступен на моем блоге )
Наконец, я собираюсь создать элемент управления JustifiedTextBlock, который будет разбивать текст на слова и размещать их в макете. Нетривиальными вещами здесь являются правильная поддержка RTL и правильное разбиение строки.