Вертикальное выравнивание текста в текстовом блоке WPF

Как назначить вертикальное выравнивание по центру тексту внутри текстового блока? Я нашел свойство TextAlignment, но оно предназначено для выравнивания текста по горизонтали. Как это сделать для вертикального выравнивания текста?

16 ответов


сам текстовый блок не может выполнять вертикальное выравнивание

лучший способ сделать это, который я нашел, - поместить textblock внутри границы, чтобы граница выполняла выравнивание для вас.

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

Примечание: это функционально эквивалентно использованию сетки, это просто зависит от того, как вы хотите, чтобы элементы управления вписывались в остальную часть вашего макета относительно того, какой из них более подходит


While Орион Эдвардс Ответ работает для любой ситуации, это может быть боль, чтобы добавить границу и установить свойства границы каждый раз, когда вы хотите сделать это. Еще один быстрый способ-установить заполнение текстового блока:

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

TextBlock не поддерживает вертикальное выравнивание текста.

Я работаю над этим, обертывая текстовый блок сеткой и устанавливая HorizontalAlignment="Stretch" и VerticalAlignment="Center".

такой:

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

вместо textblock можно использовать label.

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

Если вы можете обойтись без Обтекание текстом, Я думаю, что замена TextBlock меткой-самый краткий способ сделать это. В противном случае следуйте одному из других правильных ответов.

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

для меня VerticalAlignment="Center" исправляет эту проблему.
Это может быть потому что TextBlockзавернут в сетку, но тогда так же практически все в wpf.


я обнаружил, что изменение стиля текстового поля (т. е.:controltemplate), а затем изменив PART_ContentHost вертикальное выравнивание по центру сделает трюк


просто для хихиканья, дайте этому XAML вихрь. Он не идеален, поскольку это не "выравнивание", но он позволяет настроить выравнивание текста в абзаце.

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

Я обнаружил, что мне пришлось сделать это немного по-другому. Моя проблема заключалась в том, что если я изменю размер шрифта, текст будет двигаться вверх в текстовом поле, а не оставаться внизу с остальными текстовыми полями в строке. Изменив выравнивание vert сверху вниз, я смог программно изменить шрифт с размера 20 на размер 14 и обратно, сохраняя гравитацию текста внизу и сохраняя аккуратность. Вот как:

enter image description here


Vertically aligned single line TextBox.

чтобы расширить ответ, предоставленный @Orion Edwards, это то, как вы бы сделали полностью из кода (без набора стилей). В основном создайте пользовательский класс, который наследует от Border, у которого есть дочерний набор в TextBox. В приведенном ниже примере предполагается, что требуется только одна строка и что граница является дочерним элементом холста. Также предполагается, что вам нужно будет настроить свойство MaxLength текстового поля на основе ширины границы. Пример ниже также устанавливает курсор границы, чтобы имитировать текстовое поле, установив его в тип "IBeam". Поле "3" устанавливается таким образом, чтобы текстовое поле не было полностью выровнено слева от границы.

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

вы можете увидеть мой пост в блоге. Вы можете установить пользовательскую высоту Textblock из codebehind. Для установки пользовательской высоты вам нужно установить ее внутри в border или stackpanel

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


Я думаю, что лучше использовать метку (или TextBlock) в метку, вы не можете прикрепить событие мыши непосредственно в пограничном контроле, наконец, оно прикреплено в TextBlock, это моя рекомендация:

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

  <TextBox AcceptsReturn="True" 
           TextWrapping="Wrap"  
           VerticalContentAlignment="Top" >
  </TextBox>

TextBlock не поддерживает вертикальное выравнивание его содержания. Если вы должны использовать TextBlock затем вы должны выровнять его по отношению к его родителю.

однако, если вы можете использовать Label вместо этого (и они имеют очень похожую функциональность), то вы can положение текста:

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

на Label будет растягиваться, чтобы заполнить его границы по умолчанию, то есть текст метки будет центрирован.