在WPF TextBlock中的文本垂直alignment

如何将垂直中心alignment分配给TextBlock中的文本? 我发现TextAlignment属性,但它是水平文本alignment。 我如何做垂直文本alignment?

文本块本身不能做垂直alignment

做到这一点,我发现最好的办法是把文本块内的边界,所以边界为你做alignment。

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

注意:这在function上等同于使用网格,这取决于您希望控件如何适应您的布局的其余部分,以确定哪个更合适

虽然Orion Edwards Answer可以适用于任何情况,但每次您想要添加边框并设置边框的属性可能会很痛苦。 另一个快速的方法是设置文本块的填充:

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

TextBlock不支持垂直文本alignment。

我通过用网格包装文本块并设置Horizo​​ntalAlignment =“Stretch”和VerticalAlignment =“Center”来解决这个问题。

喜欢这个:

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

您可以使用标签而不是文本块。

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

对我来说, VerticalAlignment="Center"修复了这个问题。
这可能是因为TextBlock包装在一个网格中,但实际上wpf中的所有内容都是如此。

我发现修改文本框样式(即: PART_ContentHost ),然后修改PART_ContentHost垂直alignment到中心将做的伎俩

只是为了笑声,给这个XAML一个旋风。 这不是完美的,因为它不是“alignment”,但它允许您调整段落内的文本alignment方式。

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

如果你可以忽略TextBlock的高度,最好使用这个:

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

在我的情况下,我这样做,使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> 

让文字更底层的诀窍就是设置

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

我发现我不得不做一点点不同。 我的问题是,如果我改变了字体大小,文本将在TextBox中向上移动,而不是停留在文本框的其余部分。 通过从上到下改变垂直alignment方式,我能够以编程方式将字体从20更改为14和更大,保持文本的底部重心,保持整洁。 就是这样:

在这里输入图像说明

垂直排列的单行TextBox。

为了扩展@Orion Edwards提供的答案,这是你将完全从代码隐藏(没有样式设置)。 基本上创build一个自定义类inheritance自其子被设置为一个文本框的边界。 下面的例子假设你只需要一行代码,而且边框是一个Canvas的子代。 还假定您需要根据边框的宽度调整文本框的MaxLength属性。 下面的例子还设置边框的光标,通过设置为“IBeam”types来模仿文本框。 设置“3”的边距,以便文本框不完全alignment到边界的左侧。

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

类:

 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> 

你可以看到我的博客文章。 您可以从代码隐藏设置文本块的自定义高度。 要设置自定义高度,您需要将其设置在边框或堆叠面板中

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

我认为最好使用Label(或TextBlock)到Label中,不能直接在边框控件中附加鼠标事件,最后将它附加到TextBlock中,这是我的build议:

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

如果你没有文字环绕 ,我认为用标签replaceTextBlock是最简单的方法。 否则,请按照其他有效的答案之一。

 <Label Content="Some Text" VerticalAlignment="Center"/>