Alignement vertical du texte dans WPF TextBlock

Comment atsortingbuer un alignement vertical au texte dans un TextBlock? J’ai trouvé la propriété TextAlignment mais c’est pour l’alignement du texte horizontal. Comment le faire pour l’alignement vertical du texte?

Un bloc de texte lui-même ne peut pas effectuer d’alignement vertical

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

    

Remarque: Cela équivaut, sur le plan fonctionnel, à l’utilisation d’une grid, cela dépend simplement de la manière dont vous souhaitez que les commandes s’intègrent dans le rest de votre mise en page.

Bien qu’Orion Edwards Answer fonctionne dans toutes les situations, l’ajout de la bordure et la définition des propriétés de la bordure à chaque fois que cela est nécessaire peuvent être pénibles. Un autre moyen rapide consiste à définir le remplissage du bloc de texte:

  

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

Je contourne ce problème en encapsulant le bloc de texte avec une grid et en définissant HorizontalAlignment = “Stretch” et VerticalAlignment = “Center”.

Comme ça:

     

Vous pouvez utiliser label au lieu de textblock.

   

Si vous pouvez vous en passer, je pense que remplacer le TextBlock par une étiquette est la manière la plus succincte de le faire. Sinon, suivez l’une des autres réponses valables.

  

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

J’ai trouvé que la modification du style de la zone de texte (c.-à-d.: controltemplate ) et la modification de l’alignement vertical PART_ContentHost au centre feront l’affaire.

Juste pour rire, donnez à ce XAML un tourbillon. Ce n’est pas parfait car ce n’est pas un «alignement» mais cela vous permet d’ajuster l’alignement du texte dans un paragraphe.

  One Two Three Four  

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

  

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

    

L’astuce pour rendre le texte plus éloigné est de définir

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

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 remonterait dans la zone de texte au lieu de restr en bas avec le rest des zones de texte sur la ligne. En changeant l’alignement vertical de haut en bas, j’ai pu modifier la police par programmation de la taille 20 à la taille 14 et inversement, en maintenant la gravité du texte sur le fond et en gardant les choses propres. Voici comment:

entrer la description de l'image ici

Ligne de texte simple ligne alignée verticalement.

Pour développer la réponse fournie par @Orion Edwards, voici comment procéder à partir de code-behind (aucun jeu de styles). Fondamentalement, créez une classe personnalisée qui hérite de Border dont l’enfant est défini sur TextBox. L’exemple ci-dessous suppose que vous ne souhaitez qu’une seule ligne et que la bordure est un enfant d’un canevas. En outre, vous devez ajuster la propriété MaxLength du TextBox 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 le définissant sur 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; } } } 

Vous pouvez voir mon article de blog. Vous pouvez définir la hauteur personnalisée de Textblock à partir de codebehind. Pour régler la hauteur personnalisée, vous devez la définir à l’intérieur d’une bordure ou d’un empilage

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

Je pense qu’il est préférable d’utiliser une étiquette (ou TextBlock) dans une étiquette, vous ne pouvez pas attacher un événement de souris directement dans le contrôle de bordure, enfin il est attaché dans le TextBlock, c’est ma recommandation:

  
    

TextBlock ne supporte pas 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 place (et ils ont des fonctionnalités très similaires), vous pouvez positionner le contenu du texte:

  

L’ Label s’étirera pour remplir ses limites par défaut, ce qui signifie que le texte de l’étiquette sera centré.