Wpf TextBlock中的垂直文本

是否有可能垂直显示TextBlock中的文本,以便所有字母相互堆叠(不与LayoutTransform旋转)?

没有人提到使用纯XAML垂直堆叠任意string的字母(不旋转它们)的显而易见的方法:

 <ItemsControl ItemsSource="Text goes here, or you could use a binding to a string" /> 

这只是通过识别string是IEnumerable的事实来垂直布局文本,因此ItemsControl可以将string中的每个字符视为单独的项目。 ItemsControl的默认面板是一个StackPanel,所以字符是垂直布局的。

注意:为了精确控制水平定位,垂直间距等,可以在ItemsControl上设置ItemContainerStyle和ItemTemplate属性。

以防万一还有人遇到这个post…这是一个简单的100%xaml解决scheme。

  <TabControl TabStripPlacement="Left"> <TabItem Header="Tab 1"> <TabItem.LayoutTransform> <RotateTransform Angle="-90"></RotateTransform> </TabItem.LayoutTransform> <TextBlock> Some Text for tab 1</TextBlock> </TabItem> <TabItem Header="Tab 2"> <TabItem.LayoutTransform> <RotateTransform Angle="-90"></RotateTransform> </TabItem.LayoutTransform> <TextBlock> Some Text for tab 2</TextBlock> </TabItem> </TabControl> 

我不认为有这样一个直截了当的做法,不应该改变系统固有的文本的方式。 最简单的解决scheme是改变文本块的宽度,并提供一些额外的属性,如:

 <TextBlock TextAlignment="Center" FontSize="14" FontWeight="Bold" Width="10" TextWrapping="Wrap">THIS IS A TEST</TextBlock> 

这是hacky,但它确实工作。

只需使用一个简单的LayoutTransform

 <Label Grid.Column="0" Content="Your Text Here" HorizontalContentAlignment="Center"> <Label.LayoutTransform> <TransformGroup> <RotateTransform Angle="90" /> <ScaleTransform ScaleX="-1" ScaleY="-1"/> </TransformGroup> </Label.LayoutTransform> </Label> 

这是可行的:

你的TextBlockTextAlignment属性应该设置为Center

 <TextBlock Name="textBlock1" TextAlignment="Center" Text="Stacked!" /> 

然后在每个字符之间添加NewLine

 textBlock1.Text = String.Join( Environment.NewLine, textBlock1.Text.Select(c => new String(c, 1)).ToArray()); 

(使用System.Linq从原始string中的单个字符创build一个string数组,我相信还有其他的方法来做这个…)

Ray Burnsbuild议的接受的答案不适用于.net 4.0。 我是这样做的:

拉入mscorlib

 xmlns:s="clr-namespace:System;assembly=mscorlib" 

把你的usercontrol /窗口/页面资源

 <s:String x:Key="SortString">Sort</s:String> 

像这样使用它

 <ItemsControl ItemsSource="{Binding Source={StaticResource SortString}}" Margin="5,-1,0,0" /> 

希望能帮助到你!

下面的XAML代码改变文本框中显示的文本的angular度。

 <TextBlock Height="14" x:Name="TextBlock1" Text="Vertical Bottom to Up" Margin="73,0,115,0" RenderTransformOrigin="0.5,0.5" > <TextBlock.RenderTransform> <TransformGroup> <ScaleTransform/> <SkewTransform/> <RotateTransform Angle="-90"/> <TranslateTransform/> </TransformGroup> </TextBlock.RenderTransform> </TextBlock> 

创build一个stackpanel与一堆或一个字符的文本块

使文本容器的最大宽度只允许一个字符,并包装文本:

 <TextBlock TextWrapping="Wrap" MaxWidth="8" TextAlignment="Center" Text="stack" /> 

制作一个图像,并填充图像的块,使用Photoshop或devise来操纵文本,而不是在代码中弄乱?

该代码允许垂直文本堆叠和水平居中的字母。

 <ItemsControl Grid.Row="1" Grid.Column="0" ItemsSource="YOUR TEXT HERE" HorizontalAlignment="Center" VerticalAlignment="Center"> <ItemsControl.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding}" HorizontalAlignment="Center"/> </DataTemplate> </ItemsControl.ItemTemplate> </ItemsControl> 

这是在TextBlock文本中的每个字符之后插入'\ n'的方法,这样可以垂直显示:

 <TextBlock x:Name="VertTextBlock" Text="Vertical Text" Loaded="VertTextBlock_Loaded"></TextBlock> 

然后,在Loaded事件处理程序中,您会说:

 TextBlock tb = sender as TextBlock; StringBuilder sb = new StringBuilder(tb.Text); int len = tb.Text.Length * 2; for (int i = 1; i < len; i += 2) { sb.Insert(i, '\n'); } tb.Text = sb.ToString(); 

这个解决scheme是由Lette提出的,但是我相信我的实现会带来更less的开销。

 <linebreak/> can be used to show data in two lines