2009-09-29 17 views
179

Come si assegna l'allineamento del centro verticale al testo all'interno di un TextBlock? Ho trovato la proprietà TextAlignment ma è per l'allineamento orizzontale del testo. Come faccio per l'allineamento verticale del testo?Allineamento verticale del testo in WPF TextBlock

+0

@shr e altri: si noti che 'TextAlignment' ha effetto solo sull'allineamento orizzontale, non sull'allineamento * verticale * (a cui si riferisce la domanda). –

risposta

223

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

<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

+18

+1 L'altezza del bordo deve essere impostata affinché l'allineamento verticale abbia effetto. –

+13

Inoltre, TextBlock non può avere un'altezza specificata, o non centrerà verticalmente. – pearcewg

+17

@gav - TextAlignment fa solo l'allineamento orizzontale ... la domanda riguarda l'allineamento verticale –

46

TextBlock non supporta l'allineamento verticale del testo.

Lavoro attorno a questo avvolgendo il blocco di testo con una griglia e impostando HorizontalAlignment = "Stretch" e VerticalAlignment = "Center".

Ti piace questa:

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

+1 Non ha nemmeno bisogno di impostare l'altezza per la griglia, come con l'approccio basato sul bordo. –

+0

Ho trovato che questo approccio funziona meglio per me. Sto creando indicatori luminosi dinamici sovrapponendo 'TextBlock' su' Ellipse' all'interno di una 'Grid'. Non c'è bisogno di legare le mie proprietà di larghezza e altezza o fare qualcosa di difficile. – paddy

1

Per me, VerticalAlignment="Center" risolve questo problema
Questo potrebbe essere dovuto al fatto che TextBlock è racchiuso in una griglia, ma quindi è praticamente tutto in wpf.

76

Mentre Orion Edwards Answer funziona in qualsiasi situazione, potrebbe essere difficile aggiungere il bordo e impostare le proprietà del bordo ogni volta che si desidera eseguire questa operazione. Un altro modo rapido è impostare il padding del blocco di testo:

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

penso che questa sia la risposta più brillante. –

+1

Che mi è stato cercato !!! Grazie! –

+1

Questo funziona solo se il font ha una dimensione di 16px non lo fa !? – C4u

14

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

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

Bello, l'etichetta ha VerticalContentAlignment. Greeeat. +1 –

+3

Non è chiaro se l'OP avesse bisogno di usare un TextBlock o di farla franca con un'etichetta. Usare un'etichetta ha funzionato per quello di cui avevo bisogno. +1 –

+18

Questo risponde alla domanda su come produrre testo verticale, non su come applicare l'allineamento verticale! –

1

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

+0

OP chiede su TextBlocks. Non hanno ControlTemplates. – ANeves

1

Solo per risatine, conferiscono 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> 
1

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"/> 
1

Nel mio caso, ho fatto questo per rendere il display TextBlock più bello.

<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 dal fondo è quello di impostare

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

ho scoperto che ho dovuto fare è leggermente diverso.Il mio problema era che se avessi cambiato la dimensione del carattere, il testo si sarebbe spostato verso l'alto nel TextBox invece di rimanere in fondo con il resto dei TextBox sulla linea. Modificando l'allineamento vert da cima a fondo, sono stato in grado di modificare il carattere a livello di codice dalla dimensione 20 alla dimensione 14 & indietro, mantenendo la gravità del testo sul fondo e mantenendo le cose pulite. Ecco come:

enter image description here

1

Vertically aligned single line TextBox.

Per espandere sulla risposta fornita da @Orion Edwards, questo è come si farebbe appieno code-behind (nessun stili set). Fondamentalmente crea una classe personalizzata che eredita da Border che ha il suo Figlio impostato su un TextBox. L'esempio seguente presuppone che si desidera una sola riga e che il bordo è figlio di una tela. Inoltre, si presuppone che sia necessario regolare la proprietà MaxLength del controllo TextBox in base alla larghezza del bordo. L'esempio seguente imposta anche il cursore del bordo per simulare una casella di testo impostandolo sul tipo "IBeam". Un margine di "3" è impostato in modo che il TextBox non sia allineato in modo assoluto 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; 
     } 
    } 
} 
0

credo sia meglio utilizzare un'etichetta (o TextBlock) in un'etichetta, non è possibile collegare un evento del mouse direttamente nel controllo delle frontiere, infine, è collegato 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> 
1

Se si può fare a meno del text wrapping, penso che la sostituzione del TextBlock con un etichetta è il modo più succinta per fare questo. Altrimenti segui una delle altre risposte valide.

<Label Content="Some Text" VerticalAlignment="Center"/> 
0
<TextBox AcceptsReturn="True" 
      TextWrapping="Wrap" 
      VerticalContentAlignment="Top" > 
    </TextBox> 
+0

La domanda era per un 'TextBlock', non' TextBox'. -1 – KnorxThieus

0

TextBlock non supporta allineamento verticale del suo contenuto. Se è necessario utilizzare TextBlock, è necessario allinearlo rispetto al relativo genitore.

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

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

Il Label sarà allungare a riempire i suoi limiti di default, cioè la il testo dell'etichetta sarà centrato.

Problemi correlati