2009-09-29 36 views
179

¿Cómo asigno la alineación del centro vertical al texto dentro de un TextBlock? Encontré la propiedad TextAlignment pero es para la alineación de texto horizontal. ¿Cómo lo hago para la alineación de texto vertical?Alineación vertical del texto en WPF TextBlock

+0

@shr y otros: tenga en cuenta que 'TextAlignment' solo afecta la alineación horizontal, no la alineación * vertical * (como se refiere a la pregunta). –

Respuesta

223

Un Textblock no se puede hacer la alineación vertical

La mejor manera de hacer esto que he encontrado es poner el bloque de texto dentro de un borde, por lo que la frontera hace la alineación para ti

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

Nota: Este es funcionalmente equivalente a utilizar una cuadrícula, sólo depende de cómo desea que los controles de encajar con el resto de su diseño en cuanto a cuál es más adecuado

+18

+1 La altura del borde debe establecerse para que la alineación vertical surta efecto. –

+13

Además, TextBlock no puede tener una altura especificada, o no se centrará verticalmente. – pearcewg

+17

@gav - TextAlignment solo hace alineación horizontal ... la pregunta es acerca de la alineación vertical –

46

El TextBlock no admite la alineación de texto vertical.

Para solucionar esto, ajuste el bloque de texto con una cuadrícula y establezca HorizontalAlignment = "Stretch" y VerticalAlignment = "Center".

De esta manera: sí

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

+1 Ni siquiera necesita establecer la altura para la cuadrícula, como con el enfoque basado en el borde. –

+0

Encontré que este enfoque funciona mejor para mí. Estoy creando luces indicadoras dinámicas al superponer 'TextBlock' en' Ellipse' dentro de 'Grid'. No es necesario vincular mis propiedades de ancho y alto ni hacer nada complicado. – paddy

1

Para mí, VerticalAlignment="Center" arregla este problema
Esto podría deberse a que el TextBlock está envuelto en una cuadrícula, pero también lo es prácticamente todo en wpf.

76

Mientras que Orion Edwards Answer funciona para cualquier situación, puede ser una molestia agregar el borde y establecer las propiedades del borde cada vez que quiera hacer esto. Otra manera rápida es establecer el relleno del bloque de texto:

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

creo que esta es la respuesta más brillante. –

+1

¡Que me buscaron! ¡Gracias! –

+1

Esto solo funciona si la fuente tiene un tamaño de 16px ¿no? – C4u

14

Usted puede usar la etiqueta en lugar de bloque de texto.

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

Agradable, la etiqueta tiene VerticalContentAlignment. Greeeat. +1 –

+3

No está claro si el OP necesitó usar un TextBlock o podría salirse con la etiqueta. Usar una etiqueta funcionó para lo que necesitaba. +1 –

+18

Esto responde a la pregunta sobre cómo producir texto vertical, ¡no cómo aplicar la alineación vertical! –

1

he encontrado que la modificación del estilo de texto (es decir: controltemplate) y luego modificar la alineación vertical a PART_ContentHost Centro hará el truco

+0

OP pregunta sobre TextBlocks. No tienen ControlTemplates. – ANeves

1

Sólo por diversión, dan a este XAML un torbellino. No es perfecto ya que no es una "alineación", pero le permite ajustar la alineación del texto dentro de un párrafo.

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

Si se puede pasar por alto la altura de TextBlock, es mejor para que pueda utilizar esto:

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

En mi caso, lo hice para que la pantalla TextBlock más agradable.

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

El truco para hacer el texto más lejos de la parte inferior es fijar

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

me encontré con que tenía que hacerlo un poco diferente.Mi problema era que si cambiaba el tamaño de la fuente, el texto se movería hacia arriba en el TextBox en lugar de permanecer en la parte inferior con el resto de TextBoxes en la línea. Al cambiar la alineación vertical de arriba a abajo, pude cambiar la fuente programáticamente desde el tamaño 20 al tamaño 14 &, manteniendo la gravedad del texto en la parte inferior y manteniéndolo ordenado. Así es como:

enter image description here

1

Vertically aligned single line TextBox.

Para ampliar la respuesta proporcionada por @Orion Edwards, esta es la forma en que lo haría completamente de código subyacente (no hay estilos de juego). Básicamente, cree una clase personalizada que herede de Border que tiene su elemento secundario configurado en un TextBox. El siguiente ejemplo asume que solo quieres una línea y que el borde es un elemento secundario de un lienzo. También supone que deberá ajustar la propiedad MaxLength del TextBox en función del ancho del borde. El siguiente ejemplo también establece el cursor del borde para imitar un cuadro de texto configurándolo al tipo 'IBeam'. Se establece un margen de '3' para que el TextBox no esté absolutamente alineado a la izquierda del borde.

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

Clase:

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

Creo que es mejor usar una etiqueta (o TextBlock) en una etiqueta, no se puede adjuntar un evento de ratón directamente en el control de fronteras, por último, se adjunta en el TextBlock, esta es mi recomendación:

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

Si se puede prescindir de la text wrapping, creo que la sustitución del TextBlock con una etiqueta es la forma más concisa para hacer esto. De lo contrario, siga una de las otras respuestas válidas.

<Label Content="Some Text" VerticalAlignment="Center"/> 
0
<TextBox AcceptsReturn="True" 
      TextWrapping="Wrap" 
      VerticalContentAlignment="Top" > 
    </TextBox> 
+0

La pregunta era para un 'TextBlock', no' TextBox'. -1 – KnorxThieus

0

TextBlock no es compatible con la alineación vertical de su contenido. Si debe usar TextBlock, debe alinearlo con respecto a su elemento primario.

Sin embargo si se puede usar Label lugar (y tienen una funcionalidad muy similar), entonces puede posición el contenido del texto:

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

El Label se amplía para llenar sus límites por defecto, es decir, el el texto de la etiqueta estará centrado.

Cuestiones relacionadas