Risposte:
Un blocco di testo stesso non può eseguire l'allineamento verticale
Il modo migliore per farlo è quello di mettere il blocco di testo all'interno di un bordo, quindi il bordo fa l'allineamento per te.
<Border BorderBrush="{x:Null}" Height="50">
<TextBlock TextWrapping="Wrap" Text="Some Text" VerticalAlignment="Center"/>
</Border>
Nota: questo è funzionalmente equivalente all'utilizzo di una griglia, dipende solo da come si desidera che i controlli si adattino al resto del layout su quale sia più adatto
Mentre Orion Edwards Answer funziona in qualsiasi situazione, può essere una seccatura aggiungere il bordo e impostare le proprietà del bordo ogni volta che lo si desidera. Un altro modo rapido è quello di impostare il riempimento del blocco di testo:
<TextBlock Height="22" Padding="3" />
TextBlock non supporta l'allineamento verticale del testo.
Lavoro intorno a questo avvolgendo il blocco di testo con una griglia e impostando HorizontalAlignment = "Stretch" e VerticalAlignment = "Center".
Come questo:
<Grid>
<TextBlock
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Text="Your text" />
</Grid>
TextBlock
su Ellipse
all'interno di una Grid
. Non c'è bisogno di legare le mie proprietà di larghezza e altezza o fare qualcosa di complicato.
È possibile utilizzare l'etichetta anziché il blocco testo.
<Label Content="Hello, World!">
<Label.LayoutTransform>
<RotateTransform Angle="270"/>
</Label.LayoutTransform>
</Label>
Se riesci a fare a meno del ritorno a capo automatico , penso che sostituire TextBlock con un'etichetta sia il modo più conciso per farlo. Altrimenti segui una delle altre risposte valide.
<Label Content="Some Text" VerticalAlignment="Center"/>
TextBlock
non supporta l'allineamento verticale del suo contenuto. Se devi usareTextBlock
è necessario allinearlo rispetto al suo genitore.
Tuttavia, se è possibile utilizzare Label
invece (e hanno funzionalità molto simili), è possibile posizionare il contenuto del testo:
<Label VerticalContentAlignment="Center" HorizontalContentAlignment="Center">
I am centred text!
</Label>
Per Label
impostazione predefinita, si allungherà per riempire i suoi limiti, il che significa che il testo dell'etichetta sarà centrato.
Per me, VerticalAlignment="Center"
risolve questo problema.
Ciò potrebbe essere dovuto al fatto che TextBlock
è racchiuso in una griglia, ma in pratica è praticamente tutto in wpf.
Ho scoperto che la modifica dello stile della casella di testo (ovvero:) controltemplate
e quindi la modifica PART_ContentHost
dell'allineamento verticale su Centro farà il trucco
Solo per le risatine, dai 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 riesci a trascurare l'altezza di TextBlock, è meglio usare questo:
<TextBlock Height="{Binding}" Text="Your text"
TextWrapping="Wrap" VerticalAlignment="Center" Width="28"/>
Nel mio caso, l'ho fatto per rendere il TextBlock
display più gradevole.
<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 basso è impostare
Margin="0,0,0,-5"
Puoi vedere il mio post sul blog. Puoi impostare l'altezza personalizzata di Textblock da codebehind. Per impostare l'altezza personalizzata è necessario impostarlo all'interno in un bordo o in uno stackpanel
http://ciintelligence.blogspot.com/2011/02/wpf-textblock-vertical-alignment-with.html
Ho scoperto che dovevo farlo in modo leggermente diverso. Il mio problema era che se avessi cambiato la dimensione del carattere, il testo si sarebbe spostato verso l'alto nella TextBox invece di rimanere in fondo con il resto delle TextBox sulla riga. Modificando l'allineamento verticale dall'alto verso il basso sono stato in grado di cambiare il carattere programmaticamente dalla dimensione 20 alla dimensione 14 e ritorno, mantenendo la gravità del testo sul fondo e mantenendo le cose pulite. Ecco come:
Per espandere la risposta fornita da @Orion Edwards, ecco come faresti completamente da code-behind (senza stili impostati). Fondamentalmente creare una classe personalizzata che eredita da Border che ha il suo Child impostato su TextBox. Nell'esempio seguente si presuppone che si desideri solo una singola linea e che il bordo sia figlio di una tela. Si presume inoltre che sia necessario regolare la proprietà MaxLength di TextBox in base alla larghezza del bordo. L'esempio seguente imposta anche il cursore del bordo per imitare una casella di testo impostandola sul tipo "IBeam". Viene impostato un margine di "3" in modo che TextBox non sia assolutamente allineato a 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;
}
}
}
Penso che sia meglio usare un'etichetta (o TextBlock) in un'etichetta, non è possibile collegare un evento del mouse direttamente nel controllo del bordo, 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>
Penso che sia saggio usare una casella di testo senza bordi e sfondo come un modo semplice e veloce per raggiungere il blocco di testo allineato al centro
<TextBox
TextWrapping="Wrap"
HorizontalContentAlignment="Center"
VerticalContentAlignment="Center"
Background="{x:Null}"
BorderBrush="{x:Null}"
/>
<TextBox AcceptsReturn="True"
TextWrapping="Wrap"
VerticalContentAlignment="Top" >
</TextBox>
TextBlock
, no TextBox
. -1
TextAlignment
influisce solo sull'allineamento orizzontale, non sull'allineamento verticale (come indicato dalla domanda).