web-dev-qa-db-ja.com

WPF TextBlockのテキストの垂直方向の配置

TextBlock内のテキストに垂直方向の中央揃えを割り当てるにはどうすればよいですか? TextAlignmentプロパティを見つけましたが、テキストの水平方向の配置用です。垂直方向のテキストの配置にはどうすればよいですか?

206
Ant

Textblock自体は垂直方向の配置を行えません

私が見つけたこれを行うための最良の方法は、境界内にテキストブロックを配置することです。そうすれば、境界があなたのために整列をします。

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

注:これは機能的にはグリッドを使用するのと同等です。コントロールがレイアウトの残りの部分にどのように適合するかによって異なります。

262
Orion Edwards

Orion Edwards Answer はどのような状況でも機能しますが、これを行うたびに境界線を追加し、境界線のプロパティを設定するのは面倒な場合があります。もう1つの簡単な方法は、テキストブロックのパディングを設定することです。

<TextBlock Height="22" Padding="3" />
90
Ben Jones

TextBlockは、垂直方向のテキスト配置をサポートしていません。

この問題を回避するには、テキストブロックをグリッドでラップし、Horizo​​ntalAlignment = "Stretch"およびVerticalAlignment = "Center"を設定します。

このような:

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

テキストブロックの代わりにラベルを使用できます。

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

TextBlockは、コンテンツの垂直方向の配置をサポートしていません。 TextBlockを使用する必要がある場合は、親に対して整列させる必要があります。

ただし、代わりにLabelを使用できる場合(およびそれらに非常に類似した機能がある場合)、canテキストコンテンツを配置します。

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

Labelは、デフォルトで境界を埋めるように伸縮します。つまり、ラベルのテキストが中央に配置されます。

3
Drew Noakes

text wrapping なしでできるなら、TextBlockをLabelで置き換えるのが最も簡単な方法だと思います。それ以外の場合は、他の有効な回答のいずれかに従ってください。

<Label Content="Some Text" VerticalAlignment="Center"/>
3
Mike Fuchs

私にとって、VerticalAlignment="Center"はこの問題を修正します。
これは、TextBlockがグリッドにラップされているためかもしれませんが、実際にはwpfのすべてがラップされています。

2
user448777

私の場合、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>

下からさらにテキストを作成するコツは、

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

TextBlockの高さを見落とすことができる場合は、これを使用することをお勧めします。

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

私は、テキストボックスのスタイル(つまり、controltemplate)を変更してから、PART_ContentHostの垂直方向の配置をCenterに変更すると、うまくいくことがわかりました

1
JLuis Estrada

笑いだけのために、このXAMLに旋回を与えます。 「整列」ではないため完全ではありませんが、段落内のテキストの整列を調整できます。

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

私はそれをわずかに異なるものにしなければならなかったことがわかりました。私の問題は、フォントサイズを変更すると、テキストボックスの下に留まるのではなく、テキストボックス内でテキストが上に移動し、残りのテキストボックスが行に表示されることでした。頂点の配置を上から下に変更することで、フォントをプログラムでサイズ20からサイズ14以降に変更し、下部のテキストの重力を維持し、物事をきれいに保つことができました。方法は次のとおりです。

enter image description here

0
Dave S.

Vertically aligned single line TextBox.

@Orion Edwardsが提供する答えを拡張するには、これがコードビハインド(スタイルセットなし)から完全に行う方法です。基本的に、子をTextBoxに設定したBorderから継承するカスタムクラスを作成します。以下の例では、単一の行のみが必要であり、境界線はCanvasの子であると想定しています。また、Borderの幅に基づいてTextBoxのMaxLengthプロパティを調整する必要があると想定しています。次の例では、境界線のカーソルを「IBeam」タイプに設定することにより、テキストボックスを模倣するように設定します。 TextBoxが境界線の左に絶対に配置されないように、「3」のマージンが設定されます。

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

クラス:

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
Aaron
  <TextBox AcceptsReturn="True" 
           TextWrapping="Wrap"  
           VerticalContentAlignment="Top" >
  </TextBox>
0

Label(またはTextBlock)をLabelに使用する方が良いと思います、境界線コントロールにマウスイベントを直接添付することはできません、最終的にTextBlockに添付されます、これは私の推奨です:

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

私のブログ記事をご覧ください。分離コードからTextblockのカスタムの高さを設定できます。カスタムの高さを設定するには、境界線またはスタックパネル内で設定する必要があります

http://ciintelligence.blogspot.com/2011/02/wpf-textblock-vertical-alignment-with.html

0
Syed Bashar