답변:
텍스트 블록 자체는 수직 정렬을 할 수 없습니다
내가 찾은 가장 좋은 방법은 텍스트 블록을 테두리 안에 넣는 것이므로 테두리가 정렬됩니다.
<Border BorderBrush="{x:Null}" Height="50">
<TextBlock TextWrapping="Wrap" Text="Some Text" VerticalAlignment="Center"/>
</Border>
참고 : 이것은 그리드를 사용하는 것과 기능적으로 동일하며, 컨트롤이 나머지 레이아웃에 맞게 조정하는 방법에 따라 다릅니다.
Orion Edwards Answer 는 어떤 상황에서도 작동 하지만 , 원할 때마다 테두리를 추가하고 테두리 속성을 설정하기가 어려울 수 있습니다. 또 다른 빠른 방법은 텍스트 블록의 안쪽 여백을 설정하는 것입니다.
<TextBlock Height="22" Padding="3" />
TextBlock은 세로 텍스트 정렬을 지원하지 않습니다.
텍스트 블록을 그리드로 감싸고 HorizontalAlignment = "Stretch"및 VerticalAlignment = "Center"를 설정하여이 문제를 해결합니다.
이처럼 :
<Grid>
<TextBlock
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Text="Your text" />
</Grid>
TextBlock
하여 동적 표시등을 만들고 있습니다. 내 width 및 height 속성을 바인딩하거나 까다로운 작업을 수행 할 필요가 없습니다. Ellipse
Grid
텍스트 블록 대신 레이블을 사용할 수 있습니다.
<Label Content="Hello, World!">
<Label.LayoutTransform>
<RotateTransform Angle="270"/>
</Label.LayoutTransform>
</Label>
텍스트 상자 스타일 (예 :) controltemplate
을 수정 한 다음 PART_ContentHost
세로 정렬을 가운데 로 수정 하면 트릭이 수행됩니다.
내 경우에는 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"
내 블로그 게시물을 볼 수 있습니다. 코드 숨김에서 텍스트 블록의 사용자 정의 높이를 설정할 수 있습니다. 사용자 정의 높이를 설정하려면 테두리 또는 스택 패널에서 내부 높이를 설정해야합니다
http://ciintelligence.blogspot.com/2011/02/wpf-textblock-vertical-alignment-with.html
@Orion Edwards가 제공하는 답변을 확장하기 위해 코드 숨김 (스타일 설정 없음)에서 완전히 수행하는 방법입니다. 기본적으로 Child에서 TextBox로 설정된 Border에서 상속되는 사용자 정의 클래스를 만듭니다. 아래 예제에서는 한 줄만 원하고 테두리는 Canvas의 자식이라고 가정합니다. 또한 테두리 너비를 기준으로 TextBox의 MaxLength 속성을 조정해야한다고 가정합니다. 아래 예제는 또한 'IBeam'유형으로 설정하여 텍스트 상자를 모방하도록 테두리 커서를 설정합니다. TextBox가 테두리의 왼쪽에 완전히 정렬되지 않도록 여백 '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;
}
}
}
Label (또는 TextBlock)을 Label에 사용하는 것이 낫다고 생각합니다. 경계 컨트롤에 마우스 이벤트를 직접 첨부 할 수 없으며 마침내 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
아니었다 TextBox
. -1
TextAlignment
아닌 가로 정렬에만 영향을 미칩니다 (질문과 같이).