Вертикальный текст в текстовом блоке Wpf - PullRequest
42 голосов
/ 08 декабря 2008

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

Ответы [ 13 ]

72 голосов
/ 19 января 2010

Никто еще не упомянул очевидный и тривиальный способ сложения букв произвольной строки по вертикали (без их поворота) с использованием чистого XAML:

<ItemsControl
  ItemsSource="Text goes here, or you could use a binding to a string" />

Это просто размещает текст по вертикали, распознавая тот факт, что строка является IEnumerable, и поэтому ItemsControl может обрабатывать каждый символ в строке как отдельный элемент. Панель по умолчанию для ItemsControl - это StackPanel, поэтому символы располагаются вертикально.

Примечание. Для точного управления горизонтальным позиционированием, вертикальным интервалом и т. Д. Свойства ItemContainerStyle и ItemTemplate можно установить в ItemsControl.

22 голосов
/ 19 января 2010

На всякий случай, если кто-нибудь все еще сталкивается с этим постом ... вот простое 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>
18 голосов
/ 08 декабря 2008

Я не думаю, что было бы просто сделать это без изменения способа, которым система по сути выдает текст. Самым простым решением было бы изменить ширину текстового блока и предоставить несколько дополнительных свойств, таких как:

<TextBlock TextAlignment="Center" FontSize="14" FontWeight="Bold" Width="10" TextWrapping="Wrap">THIS IS A TEST</TextBlock>

Это хакерство, но оно работает.

11 голосов
/ 31 июля 2013

Просто используйте простой 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>
4 голосов
/ 09 декабря 2008

Это выполнимо:

Ваше свойство TextBlock TextAlignment должно быть установлено на Center:

<TextBlock Name="textBlock1" TextAlignment="Center" Text="Stacked!" />

Затем добавьте NewLine s между каждым символом:

textBlock1.Text =
    String.Join(
        Environment.NewLine,
        textBlock1.Text.Select(c => new String(c, 1)).ToArray());

(использует System.Linq для создания массива строк из отдельных символов в исходной строке. Я уверен, что есть другие способы сделать это ...)

2 голосов
/ 15 февраля 2011

Ниже кода 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>
2 голосов
/ 13 октября 2010

принятый ответ, предложенный Рэй Бернсом, не работает для меня в .net 4.0 Вот как я это сделал:

потяните в mscorlib

xmlns:s="clr-namespace:System;assembly=mscorlib"

положить в ваш пользовательский контроль / окно / ресурсы страницы

<s:String x:Key="SortString">Sort</s:String>

и используйте его вот так

<ItemsControl ItemsSource="{Binding Source={StaticResource SortString}}" Margin="5,-1,0,0"   />    

надеюсь, это поможет!

1 голос
/ 08 октября 2012

Этот код позволяет иметь вертикальную укладку текста и буквы по горизонтали.

<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>
1 голос
/ 21 марта 2012

Сделать изображение и заполнить блок изображением, использовать фотошоп или что-то, предназначенное для манипулирования текстом, а не возиться с кодом?

1 голос
/ 29 сентября 2010

сделать максимальную ширину текстового контейнера для одного символа и обернуть текст:

<TextBlock TextWrapping="Wrap" MaxWidth="8" TextAlignment="Center" Text="stack" />
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...