web-dev-qa-db-fra.com

Alignement vertical du texte dans WPF TextBlock

Comment attribuer un alignement central vertical au texte à l'intérieur d'un TextBlock? J'ai trouvé la propriété TextAlignment mais c'est pour l'alignement du texte horizontal. Comment puis-je le faire pour l'alignement de texte vertical?

199
Ant

Un Textblock lui-même ne peut pas faire d'alignement vertical

La meilleure façon de faire que j'ai trouvée est de placer le bloc de texte à l'intérieur d'une bordure, de sorte que la bordure effectue l'alignement pour vous.

<Border BorderBrush="{x:Null}" Height="50">
    <TextBlock TextWrapping="Wrap" Text="Some Text" VerticalAlignment="Center"/>
</Border>

Remarque: Ceci est fonctionnellement équivalent à l’utilisation d’une grille, cela dépend simplement de la manière dont vous souhaitez que les contrôles s’intègrent dans le reste de votre mise en page pour déterminer celle qui convient le mieux.

254
Orion Edwards

Alors que Orion Edwards Answer convient à n’importe quelle situation, il peut être difficile d’ajouter une bordure et de définir ses propriétés à chaque fois que vous souhaitez effectuer cette opération. Un autre moyen rapide consiste à définir le remplissage du bloc de texte:

<TextBlock Height="22" Padding="3" />
88
Ben Jones

Le TextBlock ne supporte pas l'alignement de texte vertical.

Je contourne cela en encapsulant le bloc de texte avec une grille et en réglant HorizontalAlignment = "Stretch" et VerticalAlignment = "Center".

Comme ça:

    <Grid>
        <TextBlock 
            HorizontalAlignment="Stretch"
            VerticalAlignment="Center"
            Text="Your text" />
    </Grid>
49
hwiechers

Vous pouvez utiliser label au lieu de textblock.

<Label Content="Hello, World!">
    <Label.LayoutTransform>
        <RotateTransform Angle="270"/>
    </Label.LayoutTransform>
</Label>
15
Aneesh Daniel

Si vous pouvez vous en passer sans le wrapping , je pense que le remplacement du TextBlock par une étiquette est la manière la plus succincte de le faire. Sinon, suivez l'une des autres réponses valides.

<Label Content="Some Text" VerticalAlignment="Center"/>
3
Mike Fuchs

Pour moi, VerticalAlignment="Center" résout ce problème.
Cela peut être dû au fait que la TextBlock est encapsulée dans une grille, mais il en va de même pour tout dans wpf.

2
user448777

Dans mon cas, j’ai fait cela pour rendre l’affichage TextBlock plus agréable.

<Border BorderThickness="3" BorderBrush="Yellow" CornerRadius="10" Padding="2"
    HorizontalAlignment="Center" VerticalAlignment="Center" Height="30" Width="150">
        <TextBlock FontSize="20" Height="23" HorizontalAlignment="Left" Margin="0,0,0,-5" Text="" VerticalAlignment="Top" Width="141" Background="White" />
</Border>

L'astuce pour rendre le texte plus éloigné du bas est de définir

Margin="0,0,0,-5"
1
Brandon Gao

Si vous pouvez ignorer la hauteur de TextBlock, mieux vaut utiliser ceci:

<TextBlock Height="{Binding}" Text="Your text"
TextWrapping="Wrap" VerticalAlignment="Center" Width="28"/>
1
fa wildchild

J'ai constaté que modifier le style de la zone de texte (c.-à-d. controltemplate), puis modifier l'alignement vertical PART_ContentHost sur le centre ferait l'affaire

1
JLuis Estrada

TextBlock ne prend pas en charge l'alignement vertical de son contenu. Si vous devez utiliser TextBlock, vous devez l'aligner par rapport à son parent.

Cependant, si vous pouvez utiliser Label à la place (et que leurs fonctionnalités sont très similaires), vous pouvez pouvez positionner le contenu du texte:

<Label VerticalContentAlignment="Center" HorizontalContentAlignment="Center">
   I am centred text!
</Label>

La Label va s'étendre pour remplir ses limites par défaut, ce qui signifie que le texte de l'étiquette sera centré.

1
Drew Noakes

Juste pour rire, donnez à ce XAML un tourbillon. Ce n'est pas parfait car ce n'est pas un "alignement", mais cela vous permet de régler l'alignement du texte dans un paragraphe.

<TextBlock>
    <TextBlock BaselineOffset="30">One</TextBlock>
    <TextBlock BaselineOffset="20">Two</TextBlock>  
    <Run>Three</Run>            
    <Run BaselineAlignment="Subscript">Four</Run>   
</TextBlock>
1
Gusdor

J'ai trouvé que je devais le faire légèrement différent. Mon problème était que si je changeais la taille de la police, le texte serait déplacé vers le haut dans la zone de texte au lieu de rester en bas avec le reste des zones de texte sur la ligne. En modifiant l’alignement vertical de haut en bas, j’ai pu modifier la police de taille par programme de taille 20 à taille 14 et inversement, en maintenant la gravité du texte en bas et en veillant à ce que les choses restent claires. Voici comment:

enter image description here

0
Dave S.

Vertically aligned single line TextBox.

Pour développer la réponse fournie par @Orion Edwards, voici comment procéder comme vous le feriez avec code-behind (aucun jeu de styles). En gros, créez une classe personnalisée qui hérite de Border et dont Child est défini sur une zone de texte. L'exemple ci-dessous suppose que vous ne voulez qu'une seule ligne et que la bordure est un enfant d'un canevas. Suppose également que vous auriez besoin d'ajuster la propriété MaxLength de la zone de texte en fonction de la largeur de la bordure. L'exemple ci-dessous définit également le curseur de la bordure pour imiter une zone de texte en lui donnant le type 'IBeam'. Une marge de '3' est définie pour que la zone de texte ne soit pas absolument alignée à gauche de la bordure.

double __dX = 20;
double __dY = 180;
double __dW = 500;
double __dH = 40;
int __iMaxLen = 100;

this.m_Z3r0_TextBox_Description = new CZ3r0_TextBox(__dX, __dY, __dW, __dH, __iMaxLen, TextAlignment.Left);
this.Children.Add(this.m_Z3r0_TextBox_Description);

Classe:

using System;
using System.Collections.Generic;
using System.Text;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Shapes;
using System.Windows.Controls.Primitives;


namespace ifn0tz3r0Exp
{
    class CZ3r0_TextBox : Border
    {
        private TextBox m_TextBox;

        private SolidColorBrush m_Brush_Green = new SolidColorBrush(Colors.MediumSpringGreen);
        private SolidColorBrush m_Brush_Black = new SolidColorBrush(Colors.Black);
        private SolidColorBrush m_Brush_Transparent = new SolidColorBrush(Colors.Transparent);

        public CZ3r0_TextBox(double _dX, double _dY, double _dW, double _dH, int _iMaxLen, TextAlignment _Align)
        {

            /////////////////////////////////////////////////////////////
            //TEXTBOX
            this.m_TextBox = new TextBox();
            this.m_TextBox.Text = "This is a vertically centered one-line textbox embedded in a border...";
            Canvas.SetLeft(this, _dX);
            Canvas.SetTop(this, _dY);
            this.m_TextBox.FontFamily = new FontFamily("Consolas");
            this.m_TextBox.FontSize = 11;
            this.m_TextBox.Background = this.m_Brush_Black;
            this.m_TextBox.Foreground = this.m_Brush_Green;
            this.m_TextBox.BorderBrush = this.m_Brush_Transparent;
            this.m_TextBox.BorderThickness = new Thickness(0.0);
            this.m_TextBox.Width = _dW;
            this.m_TextBox.MaxLength = _iMaxLen;
            this.m_TextBox.TextAlignment = _Align;
            this.m_TextBox.VerticalAlignment = System.Windows.VerticalAlignment.Center;
            this.m_TextBox.FocusVisualStyle = null;
            this.m_TextBox.Margin = new Thickness(3.0);
            this.m_TextBox.CaretBrush = this.m_Brush_Green;
            this.m_TextBox.SelectionBrush = this.m_Brush_Green;
            this.m_TextBox.SelectionOpacity = 0.3;

            this.m_TextBox.GotFocus += this.CZ3r0_TextBox_GotFocus;
            this.m_TextBox.LostFocus += this.CZ3r0_TextBox_LostFocus;
            /////////////////////////////////////////////////////////////
            //BORDER

            this.BorderBrush = this.m_Brush_Transparent;
            this.BorderThickness = new Thickness(1.0);
            this.Background = this.m_Brush_Black;            
            this.Height = _dH;
            this.Child = this.m_TextBox;
            this.FocusVisualStyle = null;
            this.MouseDown += this.CZ3r0_TextBox_MouseDown;
            this.Cursor = Cursors.IBeam;
            /////////////////////////////////////////////////////////////
        }
        private void CZ3r0_TextBox_MouseDown(object _Sender, MouseEventArgs e)
        {
            this.m_TextBox.Focus();
        }
        private void CZ3r0_TextBox_GotFocus(object _Sender, RoutedEventArgs e)
        {
            this.BorderBrush = this.m_Brush_Green;
        }
        private void CZ3r0_TextBox_LostFocus(object _Sender, RoutedEventArgs e)
        {
            this.BorderBrush = this.m_Brush_Transparent;
        }
    }
}
0
Aaron
  <TextBox AcceptsReturn="True" 
           TextWrapping="Wrap"  
           VerticalContentAlignment="Top" >
  </TextBox>
0
Bastianon Massimo

Je pense qu'il est préférable d'utiliser un Label (ou TextBlock) dans un Label, vous ne pouvez pas attacher un événement de souris directement dans le contrôle des bordures, enfin, il est attaché dans le TextBlock, voici ma recommandation:

<Label 
    Height="32"
    VerticalContentAlignment="Center"
    HorizontalContentAlignment="Stretch"
    MouseLeftButtonUp="MenuItem_MouseLeftButtonUp">
    <TextBlock Padding="32 0 10 0">
        Label with click event
    </TextBlock>
</Label>
0
acamro

Vous pouvez voir mon blog. Vous pouvez définir la hauteur personnalisée de Textblock à partir de codebehind. Pour définir la hauteur personnalisée, vous devez le définir à l'intérieur d'une bordure ou d'un panneau d'empilement.

http://ciintelligence.blogspot.com/2011/02/wpf-textblock-vertical-alignment-with.html

0
Syed Bashar