2009-09-29 35 views
179

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

+0

@shrと他のもの: 'TextAlignment'は、(垂直方向の)整列ではなく、水平整列にのみ影響することに注意してください。 –

答えて

223

AのTextBlock自体は、垂直配向性に

私が見つけたこと、これは境界線の内側にテキストブロックを置くことで行うための最善の方法なので、国境を行うことはできませんあなたのための調整を行います。

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

注:これは、グリッドを使用して機能的に同等である、それだけでVerticalAlignment="Center"、あなたはどの1つが私にとってより適切な

+18

+1垂直方向の配置を有効にするには、境界線の高さを設定する必要があります。 –

+13

また、TextBlockの高さを指定することはできません。 – pearcewg

+17

@gav - TextAlignmentは水平方向の配置のみを行います...質問は垂直方向の配置についてです –

46

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

グリッドでテキストブロックを折り返し、Horizo​​ntalAlignment = "Stretch"とVerticalAlignment = "Center"に設定することで、この問題を回避します。このよう

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

+1ボーダーベースのアプローチのように、グリッドの高さを設定する必要はありません。 –

+0

私はこのアプローチが私にとって最も効果的であることを発見しました。 'Grid'の中の' Ellipse'に 'TextBlock'をオーバーレイすることで、動的インジケータライトを作成しています。幅と高さのプロパティをバインドする必要はありません。 – paddy

1

あるとしてコントロールがレイアウトの残りの部分で収まるようにしたいどのように依存しますこの問題を修正しました。
これは、TextBlockがグリッドでラップされているためですが、実際にはwpfのすべてがそのためです。

76

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

+11

これは最も華麗な答えだと思います。 –

+1

私は探していた!ありがとうございました! –

+1

これは、フォントが16pxのサイズでない場合にのみ機能します! – C4u

0

私のブログの投稿を見ることができます。コードビハインドからTextBlockのカスタム高さを設定できます。カスタム高さを設定するために、あなたは国境で内側にそれを設定するか、またはあなたがテキストブロックの代わりにラベルを使用することができます

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

14

をStackPanelのする必要があります。

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

ニース、ラベルには、VerticalContentAlignmentがあります。 Greeeat。 +1 –

+3

OPがTextBlockを使用する必要がある場合、またはラベルを取得できない場合は明確ではありません。私が必要としたもののためにラベルを使用しました。 +1 –

+18

これは、垂直方向の配置を適用する方法ではなく、垂直方向のテキストを生成する方法の質問に答えます。 –

1

私は、テキストボックスのスタイル(すなわち:controltemplate)を変更することがわかってきましたし、その後、センターにPART_ContentHost垂直方向の配置を変更すると、ちょうどくすくす笑いのためのトリックに

+0

OPが尋ねていますTextBlocksについて彼らはControlTemplatesを持っていません。 – ANeves

1

を行い、このXAMLに旋回を与えるだろう。それは完璧ではないので、「整列」ではなく、段落内のテキストの整列を調整することができます。

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

はあなたのTextBlockの高さを見落とすことができた場合は、これを使用するために、それは良いでしょう。私の場合は

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

を、私は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

を設定することです。私の問題は、フォントサイズを変更した場合、テキストはTextBox内の残りのTextBoxと一緒に一番下にとどまるのではなく、TextBox内で上に移動するということでした。頂点の配置を上から下に変更することで、フォントをプログラムでサイズ20からサイズ14 &に戻し、テキストの重力を下に保ち、物事をきちんと保つことができました。ここに方法は次のとおりです。@Orionエドワーズが提供する答えに展開する

enter image description here

1

Vertically aligned single line TextBox.

、これは(ないスタイルが設定されていない)あなたは、コードビハインドから完全に行うだろう方法です。基本的に、ChildをTextBoxに設定したBorderから継承するカスタムクラスを作成します。以下の例では、1行だけを必要とし、境界線は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); 

クラス:私はラベルにラベル(またはのTextBlock)を使用する方が良いと思い

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

、あなたは最終的にそれが装着され、国境管理で直接マウスイベントをアタッチすることはできませんTextBlock内の、これは私のrecomendationです:

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

あなたがtext wrappingなしで行うことができる場合、私はラベルとのTextBlockを交換し、これを行うための最も簡潔な方法だと思います。そうでない場合は、他の有効な回答の1つに従ってください。

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

質問は 'TextBox'ではなく' TextBlock'についての質問でした。 -1 – KnorxThieus

0

TextBlockそのコンテンツの垂直方向の配置をサポートしていません。 TextBlockを使用する必要がある場合は、それをその親に関して揃えなければなりません。

しかしあなたの代わりにLabelを使用することができます(と彼らは非常によく似た機能を持っている)場合は、あなたでき位置テキストの内容:

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

Labelを意味し、デフォルトではその境界を埋めるためにストレッチしますラベルのテキストは中央に配置されます。

関連する問題