source

WPF 텍스트블록의 텍스트 수직 정렬

ittop 2023. 4. 17. 22:29
반응형

WPF 텍스트블록의 텍스트 수직 정렬

TextBlock 내의 텍스트에 수직 중심 맞춤을 할당하려면 어떻게 해야 합니까?TextAlignment 속성을 찾았는데 수평 텍스트 정렬용입니다.세로 텍스트 정렬은 어떻게 해야 합니까?

텍스트 블록 자체가 수직 정렬을 수행할 수 없습니다.

이렇게 하는 가장 좋은 방법은 텍스트 블록을 테두리 안에 넣는 것입니다. 그러면 테두리가 맞춤을 대신할 수 있습니다.

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

주의: 이것은 기능적으로는 그리드를 사용하는 것과 같습니다.어느 것이 더 적합한지에 대해서는 컨트롤이 레이아웃의 나머지 부분과 어떻게 일치시키느냐에 따라 달라집니다.

Orion Edwards Answer는 어떤 상황에서도 작동하지만 이 작업을 수행할 때마다 테두리를 추가하고 테두리 속성을 설정하는 것이 번거로울 수 있습니다.다른 빠른 방법은 텍스트 블록의 패딩을 설정하는 것입니다.

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

텍스트 블록은 수직 텍스트 정렬을 지원하지 않습니다.

텍스트 블록을 그리드로 감싸고 수평 정렬="스트레치" 및 수직 정렬="중앙"을 설정합니다.

다음과 같이 합니다.

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

텍스트 블록 대신 레이블을 사용할 수 있습니다.

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

TextBlock는 콘텐츠의 수직 정렬을 지원하지 않습니다.를 해야 하는 TextBlock이치노

, 「」를 사용할 수 는, 「」를 합니다.Label대신(또한 매우 유사한 기능을 가지고 있습니다) 텍스트 내용을 배치할 수 있습니다.

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

Label는 기본적으로 경계를 채우도록 확장됩니다. 즉, 라벨의 텍스트가 중심에 배치됩니다.

텍스트 래핑 없이 사용할 수 있다면 텍스트 블록을 라벨로 교체하는 것이 가장 간결한 방법이라고 생각합니다.그렇지 않으면 다른 유효한 답변 중 하나를 따릅니다.

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

을 성취하는 을 지원하는 입니다.이 라벨은VerticalContentAlignment

꼭 한 게 TextBlockLabel안 돼요.를 들어 '안 돼요'처럼TextWrapping 해서 이렇게 붙일 수 요.TextBlock면 insideLabel

는 두 욕구를 모두 시켜 줍니다.VerticalContentAlignment ★★★★★★★★★★★★★★★★★」TextWrapping

<Label
   VerticalContentAlignment="Center">
   <TextBlock
             TextWrapping="WrapWithOverflow">
             My text goes here!
   </TextBlock> 
<Label/>

같은 경우에는요.VerticalAlignment="Center"는 이 문제를 해결합니다.
은 '', '아까', '아까'가 원인일 수 있습니다.TextBlock그리드로 둘러싸여 있지만 실제로는 wpf의 모든 것도 마찬가지입니다.

에는 이렇게 in in 、 in 、 렇 、 in 、 in 、 in 、 。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"

스타일을 텍스트 상자 스타일을 수정하는 것),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"/>

나는 그것을 약간 다르게 해야 한다는 것을 알았다.문제는 글꼴 크기를 변경하면 텍스트가 맨 아래에 있는 대신 TextBox에서 위로 이동한다는 것입니다.vert 얼라인먼트를 위에서 아래로 변경함으로써 20사이즈에서 14사이즈 & back으로 프로그래밍 방식으로 글꼴을 변경할 수 있어 텍스트의 비중을 낮게 유지하고 깔끔하게 유지할 수 있었습니다.방법은 다음과 같습니다.

여기에 이미지 설명 입력

세로 방향으로 정렬된 한 줄의 TextBox.

@Orion Edwards에서 제공한 답변을 자세히 설명하려면 코드 뒤에서 완전히 수행하는 방법을 설명합니다(스타일 설정 없음).기본적으로 하위 항목이 텍스트 상자로 설정된 보더에서 상속하는 사용자 지정 클래스를 만듭니다.다음 예제에서는 한 줄만 사용하고 테두리가 캔버스의 자식이라고 가정합니다.또한 테두리 너비에 따라 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에 첨부합니다.이것이 추천입니다.

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

언급URL : https://stackoverflow.com/questions/1491649/text-vertical-alignment-in-wpf-textblock

반응형