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>
这是可行的:
你的TextBlock
的TextAlignment
属性应该设置为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