Question

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

Était-ce utile?

La solution

A Textblock lui-même ne peut pas faire l'alignement vertical

La meilleure façon de le faire que j'ai trouvé est de mettre le textblock l'intérieur d'une frontière, de sorte que la frontière ne l'alignement pour vous.

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

Note: Ceci est équivalent à l'utilisation d'une grille, cela dépend de la façon dont vous voulez que les commandes pour s'adapter avec le reste de votre mise en page à laquelle on est plus approprié

Autres conseils

Alors que Orion Edwards Réponse fonctionne pour toutes les situations, il peut être une douleur d'ajouter la frontière et définir les propriétés de la frontière chaque fois que vous voulez faire. Une autre façon rapide est de régler le rembourrage du bloc de texte:

<TextBlock Height="22" Padding="3" />

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

Je travaille autour de ce en enveloppant le bloc de texte avec une grille et réglage HorizontalAlignment = « Stretch » et VerticalAlignment = « center ».

Comme ceci:

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

Vous pouvez utiliser l'étiquette au lieu de textblock.

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

Si vous pouvez faire sans le texte emballage , je pense que le remplacement du TextBlock avec 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"/>

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

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

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

Le Label étendra pour remplir ses limites par défaut, ce qui signifie le texte de l'étiquette sera centrée.

Pour moi, VerticalAlignment="Center" résout ce problème.
Cela pourrait être parce que les TextBlockis enveloppés dans une grille, mais il en est pratiquement tout dans WPF.

J'ai trouvé que la modification du style de zone de texte (par exemple: controltemplate), puis modifier l'alignement vertical de PART_ContentHost au centre fera l'affaire

Juste pour rire, donner à ce XAML un tourbillon. Il est pas parfait car il est pas un « alignement », mais il vous 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>

Si vous ne pouvez ignorer la hauteur de TextBlock, il est préférable pour vous d'utiliser ceci:

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

Dans mon cas, je l'ai fait pour rendre le plus agréable d'affichage TextBlock.

<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 du fond est de définir

Margin="0,0,0,-5"

Vous pouvez voir mon blog. Vous pouvez régler la hauteur sur mesure de Textblock de codebehind. Pour régler la hauteur personnalisée, vous devez le mettre à l'intérieur dans une bordure ou StackPanel

http://ciintelligence.blogspot.com/ 2011/02 / WPF-textblock-alignement vertical with.html

Je trouve que je devais le faire un peu différent. Mon problème était que si je l'ai changé la taille de la police, le texte se déplacerait dans la zone de texte au lieu de rester sur le fond avec le reste de TextBoxes sur la ligne. En changeant l'alignement de vert de haut en bas, j'ai pu changer la police de taille 20 par programme à la taille 14 et en arrière, en gardant la gravité de texte sur le fond et de garder les choses propre. Voici comment:

entrer image description ici

zone de texte à ligne unique alignés verticalement.

Pour développer la réponse fournie par @Orion Edwards, voici comment vous feriez pleinement de code-behind (aucun jeu de styles). Fondamentalement créer une classe personnalisée qui hérite de la frontière qui a son enfant fixé à une zone de texte. L'exemple ci-dessous suppose que vous voulez une seule ligne et que la frontière est un enfant d'une toile. Aussi vous suppose besoin d'ajuster la propriété MaxLength de la zone de texte en fonction de la largeur de la frontière. L'exemple ci-dessous définit également le curseur de la frontière pour imiter une zone de texte en fixant au type « IBeam ». Une marge de « 3 » est réglé de telle sorte que la zone de texte n'a pas été complètement aligné sur la gauche de la frontière.

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;
        }
    }
}

Je pense est préférable d'utiliser une étiquette (ou TextBlock) dans une étiquette, vous ne pouvez pas joindre un événement de souris directement dans le contrôle des frontières, enfin il est attaché dans le TextBlock, voici mon recomendation:

<Label 
    Height="32"
    VerticalContentAlignment="Center"
    HorizontalContentAlignment="Stretch"
    MouseLeftButtonUp="MenuItem_MouseLeftButtonUp">
    <TextBlock Padding="32 0 10 0">
        Label with click event
    </TextBlock>
</Label>
  <TextBox AcceptsReturn="True" 
           TextWrapping="Wrap"  
           VerticalContentAlignment="Top" >
  </TextBox>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top