¿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
Respuesta
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
+1 La altura del borde debe establecerse para que la alineación vertical surta efecto. –
Además, TextBlock no puede tener una altura especificada, o no se centrará verticalmente. – pearcewg
@gav - TextAlignment solo hace alineación horizontal ... la pregunta es acerca de la alineación vertical –
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>
+1 Ni siquiera necesita establecer la altura para la cuadrícula, como con el enfoque basado en el borde. –
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
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.
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" />
creo que esta es la respuesta más brillante. –
¡Que me buscaron! ¡Gracias! –
Esto solo funciona si la fuente tiene un tamaño de 16px ¿no? – C4u
Puedes ver mi publicación en el blog. Puede establecer la altura personalizada de Textblock desde el código subyacente. Para el ajuste de altura personalizada es necesario establecer dentro de una frontera o StackPanel
http://ciintelligence.blogspot.com/2011/02/wpf-textblock-vertical-alignment-with.html
Usted puede usar la etiqueta en lugar de bloque de texto.
<Label Content="Hello, World!">
<Label.LayoutTransform>
<RotateTransform Angle="270"/>
</Label.LayoutTransform>
</Label>
Agradable, la etiqueta tiene VerticalContentAlignment. Greeeat. +1 –
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 –
Esto responde a la pregunta sobre cómo producir texto vertical, ¡no cómo aplicar la alineación vertical! –
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
OP pregunta sobre TextBlocks. No tienen ControlTemplates. – ANeves
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>
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"/>
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"
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:
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;
}
}
}
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>
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"/>
<TextBox AcceptsReturn="True"
TextWrapping="Wrap"
VerticalContentAlignment="Top" >
</TextBox>
La pregunta era para un 'TextBlock', no' TextBox'. -1 – KnorxThieus
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.
- 1. Alineación vertical en WPF cuadro de texto
- 2. La alineación vertical del contenido de WPF de casilla de verificación en relación con checkbox
- 3. Alineación de texto vertical en Crystal Reports?
- 4. Alineación vertical del texto en una celda de tabla
- 5. input type = submit Alineación vertical del texto en Firefox
- 6. ¿Alineación vertical con el texto principal?
- 7. WPF TextBlock texto cambiado notifique
- 8. Alineación vertical incorrecta en IE8
- 9. NSTextField alineación vertical
- 10. Barra de desplazamiento vertical automática en WPF TextBlock?
- 11. UITextField Alineación vertical
- 12. WPF: texto truncado automático en TextBlock
- 13. WPF: Alineación horizontal
- 14. Alineación vertical con CSS
- 15. Ajuste de texto WPF a TextBlock
- 16. WPF - TextBlock - formato de texto mediante programación
- 17. WPF TextBlock Cutoff
- 18. superior Alineación vertical en CSS
- 19. Android: alineación vertical para varias líneas EditText (área de texto)
- 20. Mostrar imágenes en TextBlock (WPF)
- 21. Clip automático TextBlock en WPF
- 22. Alineación vertical de controles en TableLayoutPanel
- 23. Alineación vertical con línea de base y áreas de texto
- 24. La alineación vertical del texto del botón está desactivada en Android
- 25. Force TextBlock para ajustar en WPF ListBox
- 26. WPF Textblock zoom y envuelvo
- 27. C# WinForms Alineación vertical para TextBox, etc.
- 28. CSS Alineación vertical de texto al centro de la imagen
- 29. Cómo mostrar el texto en una línea en wpf textblock
- 30. alineación vertical img y texto dentro de li
@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). –