Vertical Text in Wpf TextBlock

后端 未结 14 1737
星月不相逢
星月不相逢 2020-11-29 04:14

Is it possible to display the text in a TextBlock vertically so that all letters are stacked upon each other (not rotated with LayoutTransform)?

相关标签:
14条回答
  • 2020-11-29 04:16
    <linebreak/> can be used to show data in two lines
    
    0 讨论(0)
  • 2020-11-29 04:17

    I don't think there is a straighforward of doing this withought changing the way the system inherently laysout text. The easiest solution would be to change the width of the textblock and supply a few extra properties like this:

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

    This is hacky, but it does work.

    0 讨论(0)
  • 2020-11-29 04:17

    It's doable:

    Your TextBlock's TextAlignment property should be set to Center:

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

    Then add NewLines between every character:

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

    (Uses System.Linq to create an array of strings from the individual characters in the original string. I'm sure there are other ways of doing that...)

    0 讨论(0)
  • 2020-11-29 04:20

    Nobody has yet mentioned the obvious and trivial way to stack the letters of an arbitrary string vertically (without rotating them) using pure XAML:

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

    This simply lays out the text vertically by recognizing the fact that the string is an IEnumerable and so ItemsControl can treat each character in the string as a separate item. The default panel for ItemsControl is a StackPanel, so the characters are laid out vertically.

    Note: For precise control over horizontal positioning, vertical spacing, etc, the ItemContainerStyle and ItemTemplate properties can be set on the ItemsControl.

    0 讨论(0)
  • 2020-11-29 04:21

    You could also use the "RUN" binding

    In the App.xaml file use something like this:

    <Application x:Class="Some.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:commands="clr-namespace:Deridiam.Helper.Commands"
             xmlns:i="http://schemas.microsoft.com/xaml/behaviors"
             ShutdownMode="OnMainWindowClose"
             StartupUri="Views/MainWindow.xaml">
    <Application.Resources>
    
        <commands:HorizontalToVertical x:Key="HorizontalToVertical_Command"></commands:HorizontalToVertical>
    
        <ControlTemplate x:Key="VerticalCell" TargetType="ContentControl">
                <TextBlock Text="{TemplateBinding Content}" Foreground="Black"
                        TextAlignment="Center" FontWeight="Bold" VerticalAlignment="Center"
                        TextWrapping="Wrap" Margin="0" FontSize="10">  
                    <i:Interaction.Triggers>
                        <i:EventTrigger EventName="Loaded">
                            <i:InvokeCommandAction Command="{Binding ConvertToVerticalCmd, Source={StaticResource HorizontalToVertical_Command}}" 
                                                   CommandParameter="{Binding RelativeSource={RelativeSource AncestorType={x:Type TextBlock}}}" />
                        </i:EventTrigger>
                    </i:Interaction.Triggers>
                </TextBlock>
        </ControlTemplate>
    
    </Application.Resources>
    

    Create the command class binded to the textblock using i:Interaction.Triggers on the Loaded event in the app.xaml example

    namespace Deridiam.Helper.Commands
    {
    public class HorizontalToVertical
    {
        private ICommand _convertToVerticalCommand;
    
        public ICommand ConvertToVerticalCmd =>
            _convertToVerticalCommand ?? (_convertToVerticalCommand = new RelayCommand(
                    x =>
                    {
                        var tBlock = x as TextBlock;
                        var horizontalText = tBlock.Text;
                        tBlock.Text = "";
    
                        horizontalText.Select(c => c).ToList().ForEach(c =>
                        {
                            if (c.ToString() == " ")
                            {
                                tBlock.Inlines.Add("\n");
                                //tBlock.Inlines.Add("\n");
                            }
    
                            else
                            {
                                tBlock.Inlines.Add((new Run(c.ToString())));
                                tBlock.Inlines.Add(new LineBreak());
                            }
    
    
                        });
                    }));
    }
    }
    

    Finally in the .xaml file where you want the vertical text to be shown

    <ContentControl Width="15" Content="Vertical Text" Template="{StaticResource VerticalCell}">
    </ContentControl>
    

    Will result in:

    V
    e
    r
    t
    i
    c
    a
    l

    T
    e
    x
    t

    0 讨论(0)
  • 2020-11-29 04:24

    This code allows to have vertical text stacking and horizontal centered letters.

    <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>
    
    0 讨论(0)
提交回复
热议问题