47 votes

Texte vertical dans Wpf TextBlock

Est-il possible d'afficher le texte dans un TextBlock verticalement de manière à ce que toutes les lettres soient empilées les unes sur les autres (sans rotation avec LayoutTransform)?

80voto

Ray Burns Points 38537

Personne n'a encore mentionné l'évident et banal façon d'empiler les lettres d'une chaîne de caractères arbitraire verticalement (sans rotation) à l'aide de pure XAML:

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

Il suffit de énonce le texte verticalement, en reconnaissant le fait que la chaîne est un IEnumerable et donc ItemsControl peut traiter chaque caractère de la chaîne comme un élément distinct. Le panneau par défaut pour ItemsControl est un StackPanel, de sorte que les caractères sont disposés verticalement.

Remarque: Pour un contrôle précis de la position horizontale, à la verticale de l'espacement, etc, le ItemContainerStyle et ItemTemplate propriétés peuvent être définies sur la ItemsControl.

28voto

esko22 Points 131

Juste au cas où quelqu'un rencontrerait encore ce message ... voici une solution simple à 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>
 

19voto

Micah Points 28683

Je ne pense pas qu'il soit facile de le faire sans changer la manière dont le système affiche le texte de manière inhérente. La solution la plus simple serait de changer la largeur du bloc de texte et de fournir quelques propriétés supplémentaires comme celle-ci:

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

C'est hacky, mais ça marche.

18voto

lunatix Points 397

Il suffit d'utiliser un simple 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>
 

4voto

Christoffer Lette Points 4739

C'est faisable:

Votre propriété TextBlock 's TextAlignment doit être définie sur Center :

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

Ajoutez ensuite NewLine s entre chaque caractère:

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

(Utilise System.Linq pour créer un tableau de chaînes à partir des caractères individuels de la chaîne d'origine. Je suis sûr qu'il existe d'autres moyens de le faire ...)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X