Как бы вы обосновали текст в Silverlight? - PullRequest
4 голосов
/ 11 февраля 2009

Есть ли у кого-нибудь предложения о том, как обосновать текст только для чтения (преобразованный в TextBlock) в Silverlight 2? WPF поддерживает выравнивание текста путем перечисления TextAlignment:

public enum TextAlignment
{
    Left,
    Right,
    Center,
    Justify // <--- Missing from Silverlight :(
}

Однако Silverlight 2 поддерживает только следующее:

public enum TextAlignment
{
    Center,
    Left,
    Right
}

Любые идеи или предложения, полученные с благодарностью.

Ответы [ 5 ]

1 голос
/ 11 февраля 2009

Вдобавок ко всему, я могу придумать два не очень простых способа сделать это. Один довольно хромой; добавляя пробелы между словами. Другой способ состоит в том, чтобы как-то разобрать текст так, чтобы каждое слово было его собственным текстовым блоком, затем вы могли бы использовать сетку для выравнивания по левому краю первого слова строки и выравнивания по правому краю для последнего слова строки, а затем пробела для других блоков в центральная ячейка с использованием панели стека или аналогичной.

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

0 голосов
/ 19 июля 2012

Теперь вы можете использовать <RichTextBox>, и это будет здорово.

Если хотите, это французский туто от Руди Хьюна: http://www.rudyhuyn.com/blog/2011/11/08/comment-justifier-du-texte-sous-windows-phone/

0 голосов
/ 01 июня 2010

Очевидно, что единственным решением является разбиение текстовой строки на слова и расположение слов в столбце (как предлагает Джефф Йейтс выше). Первым делом проверяем идею с помощью контейнера 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 и правильное разбиение строки.

0 голосов
/ 11 февраля 2009

Я нашел сообщение в блоге об этом - http://math -geek-rock-chick.blogspot.com / 2008/08 / silverlight-and-text-alignjustify.html . Идея состоит в том, чтобы разделить текст на отдельные строки, а затем применить ScaleTransform к каждой строке, масштабируя текст слева (RenderTransformOrigin = 0,0) вправо (Scale.X = 1.02). Но этот метод хорош только для небольших фрагментов текста и, вероятно, будет тормозить, если размер вашего TextBox меняется.

0 голосов
/ 11 февраля 2009

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...