Verticale uitlijning van tekst in WPF TextBlock

Hoe wijs ik verticale middenuitlijning toe aan de tekst in een TextBlock? Ik heb de eigenschap TextAlignment gevonden, maar deze is bedoeld voor horizontale tekstuitlijning. Hoe doe ik het voor verticale tekstuitlijning?


Antwoord 1, autoriteit 100%

Een tekstblok kan zelf geen verticale uitlijning uitvoeren

De beste manier om dit te doen die ik heb gevonden, is door het tekstblok in een rand te plaatsen, zodat de rand de uitlijning voor je doet.

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

Opmerking: dit is functioneel gelijk aan het gebruik van een raster, het hangt er gewoon van af hoe u wilt dat de bedieningselementen in de rest van uw lay-out passen en welke het meest geschikt is


Antwoord 2, autoriteit 34%

Hoewel Orion Edwards Answervoor elke situatie werkt, kan het lastig zijn om de rand toe te voegen en de eigenschappen van de grens telkens als u dit wilt doen. Een andere snelle manier is om de opvulling van het tekstblok in te stellen:

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

Antwoord 3, autoriteit 21%

Het TextBlock ondersteunt geen verticale tekstuitlijning.

Ik werk hier omheen door het tekstblok in een raster te plaatsen en HorizontalAlignment=”Stretch” en VerticalAlignment=”Center” in te stellen.

Zoals dit:

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

Antwoord 4, autoriteit 6%

Je kunt label gebruiken in plaats van tekstblok.

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

Antwoord 5, autoriteit 3%

TextBlockondersteunt geen verticale uitlijning van de inhoud. Als u TextBlockmoet gebruiken, moet u het uitlijnen met betrekking tot het bovenliggende element.

Als u in plaats daarvan Labelkunt gebruiken (en ze hebben zeer vergelijkbare functionaliteit), dan kunt ude tekstinhoud positioneren:

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

Het Labelwordt standaard uitgerekt om de grenzen te vullen, wat betekent dat de tekst van het label wordt gecentreerd.


Antwoord 6, autoriteit 2%

Als je zonder de tekstterugloop, ik denk dat het vervangen van het tekstblok door een label de meest beknopte manier is om dit te doen. Volg anders een van de andere geldige antwoorden.

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

Antwoord 7

Voor mij lost VerticalAlignment="Center"dit probleem op.
Dit kan zijn omdat het TextBlockin een raster is gewikkeld, maar dat geldt ook voor praktisch alles in wpf.


Antwoord 8

In mijn geval deed ik dit om de weergave van TextBlockmooier te maken.

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

De truc om de tekst verder van onderen te maken, is in te stellen

Margin="0,0,0,-5"

Antwoord 9

Ik heb ontdekt dat het aanpassen van de tekstvakstijl (dwz: controltemplate) en vervolgens het wijzigen van de PART_ContentHostverticale uitlijning naar Center voldoende is


Antwoord 10

Gewoon om te giechelen, geef deze XAML een draai. Het is niet perfect omdat het geen ‘uitlijning’ is, maar je kunt de tekstuitlijning binnen een alinea aanpassen.

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

Antwoord 11

Als je de hoogte van TextBlock over het hoofd kunt zien, kun je beter dit gebruiken:

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

Antwoord 12

Ik merkte dat ik het iets anders moest doen. Mijn probleem was dat als ik de lettergrootte zou wijzigen, de tekst omhoog zou gaan in de TextBox in plaats van onderaan te blijven staan ​​met de rest van de TextBoxen op de regel. Door de vert-uitlijning van boven naar beneden te wijzigen, kon ik het lettertype programmatisch wijzigen van maat 20 naar maat 14 & terug, de zwaartekracht van de tekst op de bodem houdend en de zaken netjes houden. Hier is hoe:


Antwoord 13

Om het antwoord van @Orion Edwards uit te breiden, dit is hoe u het volledig zou doen vanuit code-behind (geen stijlen ingesteld). Maak in feite een aangepaste klasse die erft van Border waarvan het onderliggende is ingesteld op een TextBox. In het onderstaande voorbeeld wordt ervan uitgegaan dat je maar één regel wilt en dat de rand een kind is van een Canvas. Er wordt ook van uitgegaan dat u de eigenschap MaxLength van de TextBox moet aanpassen op basis van de breedte van de rand. In het onderstaande voorbeeld wordt de cursor van de rand ook ingesteld om een ​​tekstvak na te bootsen door deze in te stellen op het type ‘IBeam’. Er is een marge van ‘3’ ingesteld zodat de TextBox niet absoluut links van de rand is uitgelijnd.

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

Antwoord 14

Ik denk dat het beter is om een ​​label (of tekstblok) in een label te gebruiken, je kunt een muisgebeurtenis niet rechtstreeks in de grenscontrole toevoegen, uiteindelijk wordt het in het tekstblok toegevoegd, dit is mijn aanbeveling:

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

Antwoord 15

Ik denk dat het verstandig is om een ​​tekstvak zonder rand en achtergrond te gebruiken als een gemakkelijke en snelle manier om het gecentreerde tekstblok te bereiken

<TextBox
TextWrapping="Wrap"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Background="{x:Null}"
BorderBrush="{x:Null}"
/>

Antwoord 16

 <TextBox AcceptsReturn="True" 
           TextWrapping="Wrap"  
           VerticalContentAlignment="Top" >
  </TextBox>

Other episodes