テキストの垂直の配置にコンポーネントのラインナップTextBlock
-
18-09-2019 - |
質問
たい割り当て垂直センターへの配置テキスト内のTextBlock?このTextAlignment物件で水平テキストにアライメントを実施します。ういった垂直文字の大きさを指定する?
解決
A身自体が垂直配向を行うことができない
私が見つけたこれを行うための最善の方法は、境界線の内側にテキストブロックを置くことで、その境界線はあなたのための位置合わせを行います。
<Border BorderBrush="{x:Null}" Height="50">
<TextBlock TextWrapping="Wrap" Text="Some Text" VerticalAlignment="Center"/>
</Border>
注:これは、グリッドを使用して機能的に同等である、それはちょうどあなたがその1つが、
より適しているとコントロールがレイアウトの残りの部分で収まるようにしたいどのように依存します他のヒント
のTextBlockに対応しておりません縦テキストにアライメントを実施します。
私が仕事をこすっぽり包むことにより、テキストブロックグリッドおよび設定HorizontalAlignment="伸び"とVerticalAlignment="Center".
このように:
<Grid>
<TextBlock
HorizontalAlignment="Stretch"
VerticalAlignment="Center"
Text="Your text" />
</Grid>
あなたは代わりにテキストブロックのラベルを使用することができます。
<Label Content="Hello, World!">
<Label.LayoutTransform>
<RotateTransform Angle="270"/>
</Label.LayoutTransform>
</Label>
あなたはテキストの折り返しなしで行うことができる場合、私はラベルとのTextBlockを交換し、これを行うための最も簡潔な方法だと思います。そうでなければ、他の有効な答えの一つに従っています。
<Label Content="Some Text" VerticalAlignment="Center"/>
TextBlock
は、そのコンテンツの垂直方向の配置をサポートしていません。あなたがTextBlock
を使用しなければならないなら、あなたはその親に対し、それを整列させる必要があります。
しかし、あなたはをあなたの代わりにLabel
を使用することができます(そして、彼らは非常によく似た機能を持っている)場合は、のテキストコンテンツを配置することができます:
<Label VerticalContentAlignment="Center" HorizontalContentAlignment="Center">
I am centred text!
</Label>
Label
は、ラベルのテキストが中央に表示されますつまり、デフォルトではその境界を埋めるためにストレッチされます。
私にとっては、VerticalAlignment="Center"
はこの問題を修正します。
TextBlock
isがグリッドに包まれたが、その後ので、実質的にWPFのすべてですので、これは可能性があります。
私はテキストボックスのスタイルを変更することを発見しました(すなわち:controltemplate
)、その後、センターにPART_ContentHost
垂直方向の配置を変更すると、トリックを行います。
ただ、笑いのために、このXAMLに旋回を与えます。それは「アライメント」ではありませんが、それはあなたが段落内のテキストの配置を調整することができますように、それは完璧ではありません。
<TextBlock>
<TextBlock BaselineOffset="30">One</TextBlock>
<TextBlock BaselineOffset="20">Two</TextBlock>
<Run>Three</Run>
<Run BaselineAlignment="Subscript">Four</Run>
</TextBlock>
は、それはあなたがこれを使用する方が良いでしょう。
<TextBlock Height="{Binding}" Text="Your text"
TextWrapping="Wrap" VerticalAlignment="Center" Width="28"/>
私の場合、私はこれは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"
あなたは私のブログ投稿を参照してくださいすることができます。あなたは、分離コードからテキストブロックのカスタム高さを設定することができます。カスタム高さを設定するために、あなたが国境で内部に設定する必要がありますかStackPanelの
http://ciintelligence.blogspot.com/ 2011/02 / WPF-身-垂直配向with.html の
私はそれが少し異なるしなければならなかった発見しました。私の問題は、私は、フォントサイズを変更した場合、テキストはテキストボックスに上がる代わりのライン上のTextBoxの残りの部分と下部にとどまるということでした。上から下へヴェール配置を変更することにより、私は一番下にテキストの重力を保ち、きちんと物事を保ち、14&バックのサイズにサイズ20からプログラムフォントを変更することができました。ここに方法は次のとおりです。
これはあなたがコードビハインドから完全にどうなるかである@Orionエドワーズ、(何のスタイルが設定されていない)が提供する答えに展開します。基本的にはテキストボックスに設定され、その子を持つボーダーを継承するカスタムクラスを作成します。以下の例では、単一の行をしたいとの境界線がキャンバスの子であることをことを想定しています。また、あなたはボーダーの幅に基づいて、テキストボックスのMaxLengthプロパティを調整する必要がありますを前提としています。また、以下の例では、タイプ「IBEAM」に設定することにより、テキストボックスを模倣するように境界線のカーソルを設定します。テキストボックスは、絶対にボーダーの左側に整列されないように、「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;
}
}
}
私はラベルにラベル(またはのTextBlock)を使用する方が良いと思い、あなたが最終的にそれがのTextBlockに装着され、国境管理で直接マウスイベントを添付することはできません、これは私のrecomendationです。
<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>