Відповіді:
Сам Textblock не може виконати вертикальне вирівнювання
Найкращий спосіб зробити це, що я знайшов, - помістити текстовий блок всередині межі, щоб межа була для вас вирівнюванням.
<Border BorderBrush="{x:Null}" Height="50">
<TextBlock TextWrapping="Wrap" Text="Some Text" VerticalAlignment="Center"/>
</Border>
Примітка. Це функціонально еквівалентно використанню сітки, це просто залежить від того, як ви хочете, щоб елементи керування вписувалися в решту вашого макета щодо того, який із них підходить більше
Хоча відповідь Orion Edwards працює в будь-якій ситуації, може бути болючим додавати межу та встановлювати властивості межі кожного разу, коли ви хочете це зробити. Ще один швидкий спосіб - встановити прокладку текстового блоку:
<TextBlock Height="22" Padding="3" />
TextBlock не підтримує вертикальне вирівнювання тексту.
Я обіймаю це, обертаючи текстовий блок сіткою та встановлюючи HorizontalAlignment = "Stretch" та VerticalAlignment = "Центр".
Подобається це:
<Grid>
<TextBlock
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Text="Your text" />
</Grid>
TextBlock
на Ellipse
Всередині Grid
. Не потрібно прив'язувати властивості моєї ширини та висоти чи робити щось складне.
Ви можете використовувати мітку замість текстового блоку.
<Label Content="Hello, World!">
<Label.LayoutTransform>
<RotateTransform Angle="270"/>
</Label.LayoutTransform>
</Label>
Якщо ви можете обійтися без обгортання тексту , я вважаю, що заміна TextBlock етикеткою - це найкоротший спосіб зробити це. В іншому випадку дотримуйтесь одну з інших дійсних відповідей.
<Label Content="Some Text" VerticalAlignment="Center"/>
TextBlock
не підтримує вертикальне вирівнювання його вмісту. Якщо вам потрібно скористатися, TextBlock
то вам доведеться вирівняти його стосовно батьків.
Однак якщо ви можете використовувати Label
натомість (а вони мають дуже подібний функціонал), ви можете розмістити текстовий вміст:
<Label VerticalContentAlignment="Center" HorizontalContentAlignment="Center">
I am centred text!
</Label>
Label
Буде розтягуватися , щоб заповнити свої кордони за замовчуванням, тобто текст лейбла буде центрирован.
Для мене 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"
Ви можете побачити мою публікацію в блозі. Ви можете встановити власну висоту Textblock з коду ззаду. Для встановлення власної висоти вам потрібно встановити її всередині в облямівці або стекпанелі
http://ciintelligence.blogspot.com/2011/02/wpf-textblock-vertical-alignment-with.html
Я виявив, що мені це потрібно зробити трохи інакше. Моя проблема полягала в тому, що якби я змінив розмір шрифту, текст перемістився б в TextBox, а не залишився внизу, а решта TextBoxes - у рядку. Змінюючи вирівнювання вершини зверху вниз, я зміг програмно змінити шрифт від розміру 20 до розміру 14 і назад, зберігаючи гравітацію тексту внизу і підтримуючи акуратність. Ось як:
Щоб розширити відповідь, надану @Orion Edwards, саме так ви робите повністю з коду позаду (не встановлено жодних стилів). В основному створити користувацький клас, який успадковується від Border, який має свою дочірню програму TextBox. Наведений нижче приклад передбачає, що ви хочете лише одну лінію і що межа є полотниною полотна. Також передбачається, що вам потрібно буде відрегулювати властивість MaxLength TextBox на основі ширини кордону. Наведений нижче приклад також встановлює курсор Border для імітації 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;
}
}
}
Я думаю, що краще використовувати мітку (або 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
TextWrapping="Wrap"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Background="{x:Null}"
BorderBrush="{x:Null}"
/>
<TextBox AcceptsReturn="True"
TextWrapping="Wrap"
VerticalContentAlignment="Top" >
</TextBox>
TextBlock
, не TextBox
. -1
TextAlignment
впливає лише горизонтальне вирівнювання, а не вертикальне вирівнювання (як це стосується питання).