Domanda

Come si assegna l'allineamento al centro verticale del testo all'interno di un TextBlock? Ho trovato immobili TextAlignment ma è per l'allineamento del testo orizzontale. Come posso fare per l'allineamento verticale del testo?

È stato utile?

Soluzione

Un blocco di testo in sé non può fare l'allineamento verticale

Il modo migliore per farlo che ho trovato è quello di mettere il blocco di testo all'interno di un bordo, in modo che il confine fa l'allineamento per voi.

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

Nota: Questo è funzionalmente equivalente a utilizzando una griglia, dipende solo da come si desidera che i controlli in sintonia con il resto del layout su quale uno è più adatto

Altri suggerimenti

Orion Edwards risposta funziona per qualsiasi situazione, può essere un dolore per aggiungere il confine e impostare le proprietà di il confine ogni volta che si vuole fare questo. Un altro modo rapido è quello di impostare l'imbottitura del blocco di testo:

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

Il TextBlock non supporta l'allineamento verticale del testo.

Io lavoro intorno a questo avvolgendo il blocco di testo con una griglia e l'impostazione HorizontalAlignment = "Stretch" e VerticalAlignment = "center".

In questo modo:

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

È possibile utilizzare l'etichetta al posto di blocco di testo.

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

Se si può fare a meno della disposizione del testo , penso che la sostituzione TextBlock con un etichetta è il modo più succinta per fare questo. In caso contrario, seguire una delle altre risposte valide.

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

TextBlock non supporta l'allineamento verticale del suo contenuto. Se è necessario utilizzare TextBlock poi si deve allinearlo rispetto al suo genitore.

Tuttavia, se si può usare Label invece (e hanno funzionalità molto simili), allora si possono la posizione del contenuto del testo:

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

Il Label tenderà a riempire i suoi limiti, per impostazione predefinita, vale a dire il testo dell'etichetta verrà centrato.

Per quanto mi riguarda, correzioni VerticalAlignment="Center" questo problema.
Questo potrebbe essere perché le TextBlockis avvolti in una griglia, ma poi così è praticamente tutto in wpf.

Ho scoperto che modificando lo stile di testo (es: controltemplate) e quindi modificare l'allineamento verticale PART_ContentHost al Centro farà il trucco

Solo per risatine, dare a questo XAML un vortice. Non è perfetto in quanto non è un 'allineamento', ma consente di regolare l'allineamento del testo all'interno di un paragrafo.

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

Se si può trascurare l'altezza di TextBlock, è meglio per l'utilizzo di questo:

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

Nel mio caso, ho fatto questo per rendere il più piacevole visualizzazione 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>

Il trucco per rendere il testo più lontano dalla fondo è quello di impostare

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

È possibile vedere il mio post sul blog. È possibile impostare l'altezza su misura di blocco di testo da codebehind. Per impostare l'altezza su misura è necessario impostare all'interno di un bordo o StackPanel

http://ciintelligence.blogspot.com/ 2011/02 / WPF-TextBlock-verticale-allineamento-with.html

Ho trovato che ho dovuto fare è leggermente diverso. Il mio problema era che se ho cambiato la dimensione del carattere, il testo sarebbe spostarsi verso l'alto nel controllo TextBox, invece di rimanere sul fondo con il resto del TextBoxes sulla linea. Modificando l'allineamento vert da cima a fondo sono stato in grado di cambiare il tipo di carattere di programmazione dal 20 al 14 dimensioni e indietro, mantenendo la gravità del testo sul fondo e mantenere le cose pulite. Ecco come:

entrare descrizione dell'immagine qui

allineata verticalmente singola linea TextBox.

Per espandere sulla risposta fornita da @Orion Edwards, questo è come si dovrebbe fare pienamente di code-behind (nessun stili set). Fondamentalmente creare una classe personalizzata che eredita da Border che ha il suo Bambino impostato su un TextBox. L'esempio che segue presuppone che si desidera solo una singola linea e che il confine è un bambino di una tela. presuppone inoltre si avrebbe bisogno di regolare la proprietà MaxLength del controllo TextBox in base alla larghezza del bordo. L'esempio che segue imposta inoltre il cursore del confine di imitare una casella di testo impostando al tipo 'IBeam'. Un margine di '3' è impostata in modo che la casella di testo non è assolutamente allineato alla sinistra del bordo.

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

Classe:

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

Credo che sia meglio utilizzare un etichetta (o TextBlock) in un'etichetta, non è possibile collegare un evento del mouse direttamente nel controllo delle frontiere, infine, che sia apposta in TextBlock, questa è la mia raccomandazione:

<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>
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top