Подтвердить что ты не робот

Вертикальный текст в Wpf TextBlock

Можно ли отображать текст в TextBlock вертикально, чтобы все буквы были уложены друг на друга (не вращаются с помощью LayoutTransform)?

4b9b3361

Ответ 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