Можно ли отображать текст в TextBlock вертикально, чтобы все буквы были уложены друг на друга (не вращаются с помощью LayoutTransform)?
Вертикальный текст в Wpf TextBlock
Ответ 1
Никто еще не упомянул о очевидном и тривиальном способе укладки букв произвольной строки по вертикали (без их вращения) с использованием чистого XAML:
<ItemsControl
ItemsSource="Text goes here, or you could use a binding to a string" />
Это просто выставляет текст вертикально, признавая факт, что строка является IEnumerable, и поэтому ItemsControl может обрабатывать каждый символ в строке как отдельный элемент. Панель по умолчанию для ItemsControl - это StackPanel, поэтому символы расположены вертикально.
Примечание. Для точного управления горизонтальным позиционированием, вертикальным интервалом и т.д. свойства ItemContainerStyle и ItemTemplate могут быть установлены в ItemsControl.
Ответ 2
На всякий случай кто-то еще сталкивается с этим сообщением... вот простое решение 100% xaml.
<TabControl TabStripPlacement="Left">
<TabItem Header="Tab 1">
<TabItem.LayoutTransform>
<RotateTransform Angle="-90"></RotateTransform>
</TabItem.LayoutTransform>
<TextBlock> Some Text for tab 1</TextBlock>
</TabItem>
<TabItem Header="Tab 2">
<TabItem.LayoutTransform>
<RotateTransform Angle="-90"></RotateTransform>
</TabItem.LayoutTransform>
<TextBlock> Some Text for tab 2</TextBlock>
</TabItem>
</TabControl>
Ответ 3
Я не думаю, что это не так, потому что он решил изменить способ, по которому система излагает текст. Самым простым решением было бы изменить ширину текстового блока и предоставить несколько дополнительных свойств, подобных этому:
<TextBlock TextAlignment="Center" FontSize="14" FontWeight="Bold" Width="10" TextWrapping="Wrap">THIS IS A TEST</TextBlock>
Это хак, но он работает.
Ответ 4
Просто используйте простой LayoutTransform..
<Label Grid.Column="0" Content="Your Text Here" HorizontalContentAlignment="Center">
<Label.LayoutTransform>
<TransformGroup>
<RotateTransform Angle="90" />
<ScaleTransform ScaleX="-1" ScaleY="-1"/>
</TransformGroup>
</Label.LayoutTransform>
</Label>
Ответ 5
Это можно сделать:
Свойство TextBlock
TextAlignment
должно иметь значение Center
:
<TextBlock Name="textBlock1" TextAlignment="Center" Text="Stacked!" />
Затем добавьте NewLine
между каждым символом:
textBlock1.Text =
String.Join(
Environment.NewLine,
textBlock1.Text.Select(c => new String(c, 1)).ToArray());
(Использует System.Linq
для создания массива строк из отдельных символов в исходной строке. Я уверен, что есть другие способы сделать это...)
Ответ 6
принятый ответ, предложенный Ray Burns, не работает для меня на .net 4.0. Вот как я это сделал:
вытащите mscorlib
xmlns:s="clr-namespace:System;assembly=mscorlib"
введите свои ресурсы usercontrol/window/page
<s:String x:Key="SortString">Sort</s:String>
и используйте его так:
<ItemsControl ItemsSource="{Binding Source={StaticResource SortString}}" Margin="5,-1,0,0" />
надеюсь, что это поможет!
Ответ 7
Ниже кода XAML изменяется угол текста, отображаемого в текстовом блоке.
<TextBlock Height="14"
x:Name="TextBlock1"
Text="Vertical Bottom to Up" Margin="73,0,115,0" RenderTransformOrigin="0.5,0.5" >
<TextBlock.RenderTransform>
<TransformGroup>
<ScaleTransform/>
<SkewTransform/>
<RotateTransform Angle="-90"/>
<TranslateTransform/>
</TransformGroup>
</TextBlock.RenderTransform>
</TextBlock>
Ответ 8
создать стекную панель с пучком от текстовых блоков, которые принимают один char
Ответ 9
сделать максимальную ширину текстового контейнера, чтобы разрешить только один char и обернуть текст:
<TextBlock TextWrapping="Wrap" MaxWidth="8" TextAlignment="Center" Text="stack" />
Ответ 10
Сделать изображение и заполнить блок изображением, использовать фотошоп или что-то, что предназначено для манипулирования текстом, а не возиться в коде?
Ответ 11
Этот код позволяет иметь вертикальную укладку текста и горизонтальные центрированные буквы.
<ItemsControl Grid.Row="1"
Grid.Column="0"
ItemsSource="YOUR TEXT HERE"
HorizontalAlignment="Center"
VerticalAlignment="Center">
<ItemsControl.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"
HorizontalAlignment="Center"/>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
Ответ 12
Здесь можно вставить '\n' после каждого символа в тексте TextBlock, тем самым делая его вертикальным:
<TextBlock x:Name="VertTextBlock" Text="Vertical Text" Loaded="VertTextBlock_Loaded"></TextBlock>
Затем в обработчике событий Loaded вы скажете:
TextBlock tb = sender as TextBlock;
StringBuilder sb = new StringBuilder(tb.Text);
int len = tb.Text.Length * 2;
for (int i = 1; i < len; i += 2)
{
sb.Insert(i, '\n');
}
tb.Text = sb.ToString();
Это решение было предложено Lette, но я считаю, что моя реализация требует меньших накладных расходов.
Ответ 13
<linebreak/> can be used to show data in two lines