content - Alineación vertical del texto en WPF TextBlock
stackpanel content alignment (16)
Creo que es mejor usar una Etiqueta (o TextBlock) en una Etiqueta, no puedes adjuntar un evento de mouse directamente en el control de borde, finalmente 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>
¿Cómo asigno la alineación central vertical al texto dentro de un TextBlock? Encontré la propiedad TextAlignment pero es para la alineación horizontal del texto. ¿Cómo lo hago para la alineación vertical del texto?
Descubrí que modificar el estilo del cuadro de texto (es decir, la PART_ContentHost
) y luego modificar la alineación vertical PART_ContentHost
para PART_ContentHost
hará el truco
El TextBlock no admite la alineación vertical del texto.
Para solucionar esto, ajuste el bloque de texto con una cuadrícula y establezca HorizontalAlignment = "Stretch" y VerticalAlignment = "Center".
Me gusta esto:
<Grid>
<TextBlock
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Text="Your text" />
</Grid>
En mi caso, hice esto para que el TextBlock
vea mejor.
<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 que el texto más lejos de la parte inferior es establecer
Margin="0,0,0,-5"
Encontré 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 del tamaño 20 al tamaño 14 y atrás, manteniendo la gravedad del texto en la parte inferior y manteniendo las cosas ordenadas. Así es cómo:
Para mí, VerticalAlignment="Center"
soluciona este problema.
Esto podría deberse a que TextBlock
está envuelto en una cuadrícula, pero también lo es prácticamente todo en wpf.
Puede utilizar la etiqueta en lugar de bloque de texto.
<Label Content="Hello, World!">
<Label.LayoutTransform>
<RotateTransform Angle="270"/>
</Label.LayoutTransform>
</Label>
Puedes ver mi blog. Puede establecer la altura personalizada de Textblock desde codebehind. Para configurar la altura personalizada, debe colocarla dentro de un borde o panel de apilamiento
http://ciintelligence.blogspot.com/2011/02/wpf-textblock-vertical-alignment-with.html
Sólo para las risitas, dale un giro a este XAML. 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 bien la respuesta de Orion Edwards 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 forma rápida es configurar el relleno del bloque de texto:
<TextBlock Height="22" Padding="3" />
Si puede hacerlo sin el ajuste de texto , creo que reemplazar el TextBlock con una Etiqueta es la forma más sucinta de hacerlo. De lo contrario, siga una de las otras respuestas válidas.
<Label Content="Some Text" VerticalAlignment="Center"/>
Si puedes pasar por alto la altura de TextBlock, es mejor que uses esto:
<TextBlock Height="{Binding}" Text="Your text"
TextWrapping="Wrap" VerticalAlignment="Center" Width="28"/>
Un Textblock en sí no puede hacer alineación vertical
La mejor manera de hacer esto que he encontrado es colocar el bloque de texto dentro de un borde, para que el borde haga la alineación por ti.
<Border BorderBrush="{x:Null}" Height="50">
<TextBlock TextWrapping="Wrap" Text="Some Text" VerticalAlignment="Center"/>
</Border>
Nota: esto es funcionalmente equivalente a usar una cuadrícula, solo depende de cómo desea que los controles se ajusten al resto de su diseño en cuanto a cuál es el más adecuado
TextBlock
no admite la alineación vertical de su contenido. Si debe usar TextBlock
entonces debe alinearlo con respecto a su padre.
Sin embargo, si puede usar la Label
lugar (y tienen una funcionalidad muy similar), puede colocar el contenido del texto:
<Label VerticalContentAlignment="Center" HorizontalContentAlignment="Center">
I am centred text!
</Label>
La Label
se estirará para completar sus límites de forma predeterminada, lo que significa que el texto de la etiqueta estará centrado.
Para ampliar la respuesta proporcionada por @Orion Edwards, esta es la forma en que lo haría completamente desde el código subyacente (sin estilos establecidos). Básicamente, cree una clase personalizada que herede de Border que tiene su hijo establecido en un TextBox. El siguiente ejemplo supone que solo desea una sola línea y que el borde es un elemento secundario de un lienzo. También supone que deberías ajustar la propiedad MaxLength del TextBox en función del ancho del borde. El ejemplo a continuación también establece el cursor del borde para imitar un cuadro de texto configurándolo en el tipo ''IBeam''. Se establece un margen de ''3'' para que el TextBox no esté completamente 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;
}
}
}
<TextBox AcceptsReturn="True"
TextWrapping="Wrap"
VerticalContentAlignment="Top" >
</TextBox>