Alignement vertical du texte dans le texte de WPF

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

193
demandé sur Adam K Dean 2009-09-29 14:06:33

16 réponses

un texte lui-même ne peut pas faire l'alignement vertical

la meilleure façon de faire cela que j'ai trouvé est de mettre le texte à l'intérieur d'une frontière, donc la frontière fait l'alignement pour vous.

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

Note: Ceci est fonctionnellement équivalent à l'aide d'une grille, cela dépend comment vous voulez que les commandes pour s'adapter avec le reste de votre mise en page, qui est plus adapté

240
répondu Orion Edwards 2010-04-13 23:20:52

alors que Orion Edwards Answer fonctionne pour toute situation, il peut être une douleur d'ajouter la frontière et de définir les propriétés de la frontière à chaque fois que vous voulez faire cela. Un autre moyen rapide est de régler le remplissage du bloc de texte:

<TextBlock Height="22" Padding="3" />
83
répondu Ben Jones 2017-05-23 11:55:10

la zone de texte ne supporte pas l'alignement vertical du texte.

je travaille autour de cela en enveloppant le bloc de texte avec une grille et la mise HorizontalAlignment=" Stretch"et VerticalAlignment="Center".

comme ceci:

    <Grid>
        <TextBlock 
            HorizontalAlignment="Stretch"
            VerticalAlignment="Center"
            Text="Your text" />
    </Grid>
47
répondu hwiechers 2009-10-28 05:39:40

vous pouvez utiliser label au lieu de textlock.

<Label Content="Hello, World!">
    <Label.LayoutTransform>
        <RotateTransform Angle="270"/>
    </Label.LayoutTransform>
</Label>
15
répondu Aneesh Daniel 2011-08-22 10:01:18

si vous pouvez vous passer du text wrapping , je pense que remplacer le texte par une étiquette est la façon la plus succincte de le faire. Sinon, suivez l'une des autres réponses valables.

<Label Content="Some Text" VerticalAlignment="Center"/>
2
répondu Mike Fuchs 2017-05-23 12:26:35

pour moi, VerticalAlignment="Center" corrige ce problème.

Cela pourrait être dû au fait que le TextBlock est enveloppé dans une grille, mais il en va de même pour pratiquement tout ce qui se trouve dans la wpf.

1
répondu user448777 2011-08-28 20:03:56

j'ai trouvé que modifier le style de la boîte de texte (i.e.: controltemplate ) et puis modifier le PART_ContentHost alignement vertical au centre fera l'affaire

1
répondu JLuis Estrada 2011-11-25 20:46:34

juste pour rire, faites tourner XAML. Il n'est pas parfait car il n'est pas un "alignement", mais il permet d'ajuster 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
répondu Gusdor 2012-07-18 10:46:33

si vous pouvez ignorer la hauteur de la serrure, il est préférable pour vous d'utiliser ceci:

<TextBlock Height="{Binding}" Text="Your text"
TextWrapping="Wrap" VerticalAlignment="Center" Width="28"/>
1
répondu fa wildchild 2012-08-07 15:30:24

dans mon cas, je l'ai fait 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>

le truc pour faire le texte plus loin du bas est de mettre

Margin="0,0,0,-5"
1
répondu Brandon Gao 2012-09-25 22:03:33

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éplacer vers le haut dans la boîte de texte au lieu de rester sur le fond avec le reste des boîtes de texte sur la ligne. En changeant l'alignement du vert de haut en bas, j'ai pu changer la police de façon programmatique de la taille 20 à la taille 14 & back, en gardant la gravité du texte sur le bas et en gardant les choses propres. Voici comment:

enter image description here

1
répondu Dave S. 2013-08-10 02:58:22

Vertically aligned single line TextBox.

pour développer la réponse fournie par @Orion Edwards, c'est comme ça que vous vous débrouillez entièrement à partir de code-behind (pas de style). Fondamentalement créer une classe personnalisée qui hérite de la frontière qui a son enfant mis à une boîte de texte. L'exemple ci-dessous suppose que vous ne souhaitez qu'une seule ligne et que la frontière est un enfant d'une Toile. Suppose aussi que vous devez ajuster la propriété MaxLength de la TextBox en fonction de la largeur de la bordure. Le l'exemple ci-dessous définit également le curseur de la bordure pour imiter une zone de texte en la positionnant sur le type "IBeam". Une marge de '3' est définie pour que la zone de texte ne soit pas 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;
        }
    }
}
1
répondu Aaron 2014-09-08 16:47:33

vous pouvez voir mon billet de blog. Vous pouvez définir la hauteur de texte personnalisée de Codebehind. Pour définir la hauteur personnalisée, vous avez besoin de le mettre à l'intérieur dans un cadre ou stackpanel

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

0
répondu Syed Bashar 2011-08-16 17:55:43

je pense qu'il est préférable d'utiliser une étiquette (ou un texte) dans une étiquette, vous ne pouvez pas attacher un événement de la souris directement dans le contrôle des frontières, enfin il est attaché dans le texte, c'est 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
répondu acamro 2016-11-20 03:21:33
  <TextBox AcceptsReturn="True" 
           TextWrapping="Wrap"  
           VerticalContentAlignment="Top" >
  </TextBox>
0
répondu Bastianon Massimo 2016-12-16 17:11:58

TextBlock ne supporte pas l'alignement vertical de son contenu. Si vous devez utiliser TextBlock alors vous devez l'Aligner par rapport à son parent.

cependant si vous pouvez utiliser Label à la place (et ils ont des fonctionnalités très similaires) alors vous peut positionner le contenu du texte:

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

Le Label s'étirer pour remplir ses limites par défaut, le texte de l'étiquette sera centrée.

0
répondu Drew Noakes 2017-12-12 21:03:36