Текстовое выравнивание по вертикали в WPF TextBlock

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

Ответ 1

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

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

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

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

Ответ 2

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

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

Ответ 3

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

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

Вот так:

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

Ответ 4

Вы можете использовать ярлык вместо textblock.

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

Ответ 5

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

Ответ 6

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

Ответ 7

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

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

Ответ 8

Если вы можете игнорировать высоту TextBlock, вам лучше использовать это:

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

Ответ 9

В моем случае я сделал это, чтобы сделать 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"

Ответ 10

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

enter image description here

Ответ 11

Vertically aligned single line TextBox.

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

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

Ответ 12

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

Ответ 13

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

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

Ответ 14

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

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

Ответ 15

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

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