Frage

Wie kann ich vertikale Mittel Ausrichtung auf den Text in einem Textblock zuweisen? Ich fand Textalignment-Eigenschaft, aber es ist für die horizontale Textausrichtung. Wie mache ich es für vertikale Textausrichtung?

War es hilfreich?

Lösung

Ein Textblock selbst kann nicht vertikale Ausrichtung tun

Der beste Weg, dies zu tun, dass ich gefunden habe, ist den Textblock innerhalb einer Grenze zu setzen, so dass die Grenze macht die Ausrichtung für Sie.

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

Hinweis: Diese funktional äquivalent ist ein Raster zu verwenden, hängt es nur, wie man die Kontrollen wollen mit dem Rest Ihres Layout passen als auf die man besser geeignet ist

Andere Tipps

Während für jede Situation funktioniert, kann es ein Schmerz sein, um die Grenze zu addieren und legen Sie die Eigenschaften von die Grenze jedes Mal, wenn Sie, dies zu tun. Eine weitere schnelle Art und Weise ist die Polsterung des Textblocks zu setzen:

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

Der Textblock nicht vertikale Textausrichtung unterstützt.

ich dieses Problem umgehen, indem Sie den Textblock mit einem Gitter Einwickeln und Horizontal = „Stretch“ und Vertical = „Center“ zu setzen.

Wie folgt aus:

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

Sie können Label anstelle von Textblock.

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

Wenn Sie tun können, ohne dass der Textumbruch , ich denke, dass ein Etikett mit dem Textblock ersetzt die knappste Art und Weise, dies zu tun. Ansonsten eine der anderen gültigen Antworten folgen.

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

TextBlock unterstützt keine vertikale Ausrichtung des Inhalts. Wenn Sie TextBlock verwenden müssen, dann müssen Sie es in Bezug auf seine Eltern auszurichten.

Jedoch können, wenn Sie Label verwenden, anstatt (und sie haben sehr ähnliche Funktionalität), dann Sie können Position der Textinhalt:

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

Die Label dehnt seine Grenzen standardmäßig zu füllen, den Text der Bezeichnung Bedeutung wird zentriert werden.

Für mich VerticalAlignment="Center" behebt dieses Problem.
Dies könnte sein, weil der TextBlockis in einem Raster eingewickelt, dann aber so ist praktisch alles in wpf.

Ich habe festgestellt, dass der Textbox Stil modifiziert (dh: controltemplate) und dann die PART_ContentHost vertikale Ausrichtung zu Zentrum Modifiziert den Trick

Nur für kichert, geben diesem XAML einen Wirbel. Es ist nicht perfekt, da es keine ‚Ausrichtung‘, aber es ermöglicht es Ihnen, Textausrichtung innerhalb eines Absatzes anzupassen.

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

Wenn Sie die Höhe des Textblockes übersehen können, ist es besser für Sie, dies zu nutzen:

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

In meinem Fall, ich habe dies 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, den Text weiter von unten zu machen, ist auf

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

Sie können meine Blog-Post sehen. Sie können benutzerdefinierte Höhe von Textblock von Code-Behind eingestellt. Zur Einstellung benutzerdefinierte Höhe müssen Sie es innerhalb in einer Grenze setzen oder Stackpanel

http://ciintelligence.blogspot.com/ 2011/02 / wpf-Textblock-Vertikal-Ausrichtung-with.html

Ich fand ich es etwas anders zu tun hatte. Mein Problem war, dass, wenn ich die Schriftgröße verändert, wird der Text in dem Text stattdessen mit dem Rest der Textfelder auf der Linie auf die Unterseite bleiben bewegen würde. Durch die Änderung der vert Ausrichtung von oben nach unten konnte ich die Schriftart aus programmatisch Größe ändern 20 bis Größe 14 und Rückseite, Text Schwerkraft auf dem Boden zu halten und die Dinge ordentlich zu halten. Hier ist, wie:

eingeben Bild Beschreibung hier

Vertically einzelne Zeilen TextBox ausgerichtet.

auf der Antwort von @Orion Edwards zur Verfügung gestellt zu erweitern, ist dies, wie Sie in vollem Umfang von Code-Behind tun würden (keine Stile gesetzt). Im Grunde eine benutzerdefinierte Klasse erstellen, die von Border erbt, die ihre Kinder auf eine TextBox gesetzt hat. Das folgende Beispiel geht davon aus, dass Sie nur eine einzige Zeile wollen und dass die Grenze ein Kind einer Leinwand ist. Auch vorausgesetzt, dass Sie müßten die MaxLength-Eigenschaft des TextBox auf der Grundlage der Breite des Rahmens einzustellen. Das nachstehende Beispiel setzt auch den Cursor des Border eine Textbox zu imitieren, indem sie es auf den Typ ‚IBeam‘ -Einstellung. Eine Marge von ‚3‘ ist so eingestellt, dass die TextBox ist absolut nicht links von der Grenze 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;
        }
    }
}

Ich denke, besser ist ein Label (oder Textblock) in ein Etikett zu verwenden, können Sie nicht ein Mausereignis direkt in der Grenzkontrolle legen, schließlich ist es im Textblock befestigt, das ist meine Empfehlung:

<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>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top