it-swarm.com.de

Vertikale Textausrichtung in WPF TextBlock

Wie kann ich dem Text in einem TextBlock eine vertikale Mittenausrichtung zuweisen? Ich habe die Eigenschaft TextAlignment gefunden, aber sie ist für die horizontale Textausrichtung bestimmt. Wie mache ich das für die vertikale Textausrichtung?

199
Ant

Ein Textblock selbst kann nicht vertikal ausgerichtet werden

Die beste Methode, die ich gefunden habe, besteht darin, den Textblock innerhalb eines Rahmens zu platzieren, sodass der Rahmen die Ausrichtung für Sie übernimmt.

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

Hinweis: Dies ist funktional gleichbedeutend mit der Verwendung eines Rasters. Es hängt nur davon ab, wie Sie die Steuerelemente in den Rest Ihres Layouts einfügen möchten, je nachdem, welches Steuerelement besser geeignet ist

254
Orion Edwards

Während Orion Edwards Answer in jeder Situation funktioniert, kann es schwierig sein, den Rand hinzuzufügen und die Eigenschaften des Randes jedes Mal festzulegen, wenn Sie dies möchten. Eine weitere schnelle Möglichkeit besteht darin, die Auffüllung des Textblocks festzulegen:

<TextBlock Height="22" Padding="3" />
88
Ben Jones

Der TextBlock unterstützt keine vertikale Textausrichtung.

Ich umgehe dies, indem ich den Textblock mit einem Raster umwickle und HorizontalAlignment = "Stretch" und VerticalAlignment = "Center" setze.

So was:

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

Sie können ein Label anstelle eines Textblocks verwenden.

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

Wenn Sie auf das text wrapping verzichten können, denke ich, dass das Ersetzen des TextBlock durch ein Label der einfachste Weg ist, dies zu tun. Ansonsten folgen Sie einer der anderen gültigen Antworten.

<Label Content="Some Text" VerticalAlignment="Center"/>
3
Mike Fuchs

Für mich behebt VerticalAlignment="Center" dieses Problem.
Dies könnte daran liegen, dass der TextBlock in ein Raster eingebettet ist, aber praktisch alles in wpf.

2
user448777

In meinem Fall habe ich dies getan, um die TextBlock-Anzeige schöner zu machen.

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

Der Trick, um den Text weiter unten zu gestalten, ist das Setzen

Margin="0,0,0,-5"
1
Brandon Gao

Wenn Sie die Höhe von TextBlock übersehen können, sollten Sie Folgendes verwenden:

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

Ich habe festgestellt, dass das Ändern des Textfeld-Stils (z. B. controltemplate) und das anschließende Ändern der vertikalen Ausrichtung von PART_ContentHost in Center dazu ausreichen

1
JLuis Estrada

TextBlock unterstützt keine vertikale Ausrichtung des Inhalts. Wenn Sie TextBlock verwenden müssen, müssen Sie sie in Bezug auf das übergeordnete Element ausrichten.

Wenn Sie jedoch stattdessen Label verwenden können (und sie haben sehr ähnliche Funktionen), können Sie can den Textinhalt positionieren:

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

Die Variable Label wird gedehnt, um die Begrenzungen standardmäßig zu füllen, dh der Text der Beschriftung wird zentriert.

1
Drew Noakes

Nur zum Kichern, gib diesem XAML einen Wirbel. Es ist nicht perfekt, da es sich nicht um eine "Ausrichtung" handelt, aber Sie können die Textausrichtung innerhalb eines Absatzes anpassen.

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

Ich fand, ich musste es etwas anders machen. Mein Problem war, dass, wenn ich die Schriftgröße änderte, der Text in der Textbox nach oben verschoben würde, anstatt auf dem unteren Rand mit dem Rest der TextBoxen in der Zeile zu bleiben. Durch Ändern der Vert-Ausrichtung von oben nach unten konnte ich die Schriftart programmgesteuert von Größe 20 bis Größe 14 und zurück ändern, wobei die Schwerkraft des Textes unten und die Dinge sauber gehalten wurden. Hier ist wie:

enter image description here

0
Dave S.

Vertically aligned single line TextBox.

Um die von @Orion Edwards bereitgestellte Antwort zu erweitern, würden Sie dies in vollem Umfang vom Code-Behind tun (keine Stile festgelegt). Erstellen Sie im Allgemeinen eine benutzerdefinierte Klasse, die von Border erbt, dessen untergeordnetes Element auf ein TextBox festgelegt ist. Im folgenden Beispiel wird davon ausgegangen, dass Sie nur eine einzelne Zeile wünschen und dass der Rand ein untergeordnetes Element eines Canvas ist. Außerdem wird davon ausgegangen, dass Sie die MaxLength-Eigenschaft des TextBox-Objekts basierend auf der Breite des Rahmens anpassen müssen. Im folgenden Beispiel wird der Cursor des Rahmens auch so eingestellt, dass er ein Textfeld imitiert, indem es auf den Typ 'IBeam' gesetzt wird. Ein Rand von '3' ist so festgelegt, dass die TextBox nicht absolut links vom Rand ausgerichtet ist.

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

Klasse:

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;
        }
    }
}
0
Aaron
  <TextBox AcceptsReturn="True" 
           TextWrapping="Wrap"  
           VerticalContentAlignment="Top" >
  </TextBox>
0

Ich denke, es ist besser, ein Label (oder TextBlock) in einem Label zu verwenden. Sie können ein Mausereignis nicht direkt im Rahmensteuerelement anfügen. Schließlich wird es im TextBlock eingefügt.

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

Sie können meinen Blogbeitrag sehen. Sie können die benutzerdefinierte Höhe des Textblocks in codebehind einstellen. Zum Einstellen der benutzerdefinierten Höhe müssen Sie sie innerhalb eines Rahmens oder Stapelpanels einstellen

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

0
Syed Bashar