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



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

1114   16  

16 ответов:

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

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

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

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

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

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

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

Я работаю над этим, обертывая текстовый блок сеткой и устанавливая HorizontalAlignment="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>

Если вы можете обойтись без Обтекание текстом, Я думаю, что замена 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, это то, как вы могли бы сделать полностью из кода позади (без набора стилей). В основном создать пользовательский класс, который наследует от границы, которая имеет свой дочерний набор в текстовое поле. В приведенном ниже примере предполагается, что требуется только одна строка и что граница является дочерним элементом холста. Также предполагается, что вам нужно будет настроить свойство 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. Для установки пользовательской высоты вам нужно установить ее внутри в рамке или 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 вместо этого (и они имеют очень похожую функциональность), то вы можете положение текста:

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

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

Comments

    Ничего не найдено.