Windows phone 7 居中文本边框元素内的块文本
我正在玩silverlight,特别是针对windows phone的silverlight。我希望在边框元素中有一个textblock。我希望textblock填充整个边框元素。我还希望文本块内的文本在文本块内居中-垂直和水平 我遇到的问题是,如果我将textblock的水平和垂直对齐设置为居中,则textblock的大小将调整为文本的大小,因此textblock不会填满边框内的所有可用空间。如果我将textblock的水平和垂直对齐属性设置为“拉伸”,则会使textblock展开以填充边框,但textblock文本不再居中。我想我可以使用填充来居中文本,但这并不能给出一个精确的结果,因为文本的长度可能会有所不同 我之所以希望textblock位于边框内,首先是因为Silverlight for Windows Phone不为textblock提供背景属性。我使用边框来提供背景色 简而言之,当textblock位于border元素内并且textblock必须拉伸以填充边框时,是否有任何方法可以将textblock中的文本居中 下面是我到目前为止的代码Windows phone 7 居中文本边框元素内的块文本,windows-phone-7,silverlight-4.0,border,textblock,Windows Phone 7,Silverlight 4.0,Border,Textblock,我正在玩silverlight,特别是针对windows phone的silverlight。我希望在边框元素中有一个textblock。我希望textblock填充整个边框元素。我还希望文本块内的文本在文本块内居中-垂直和水平 我遇到的问题是,如果我将textblock的水平和垂直对齐设置为居中,则textblock的大小将调整为文本的大小,因此textblock不会填满边框内的所有可用空间。如果我将textblock的水平和垂直对齐属性设置为“拉伸”,则会使textblock展开以填充边框,
<Border BorderBrush="Red" BorderThickness="2" Grid.Row="0" Grid.Column="0">
<TextBlock Name="textBlockA1" Text="Center Me!" HorizontalAlignment="Stretch"
VerticalAlignment="Stretch"/>
</Border>
如果居中对齐不适合您,并且您希望拉伸文本以占用更多空间,则可以使用FontSize属性并选择更大的字体或使用ViewBox:
<Border
BorderBrush="Red"
BorderThickness="2"
Grid.Row="0"
Grid.Column="0">
<Viewbox>
<TextBlock
Name="textBlockA1"
Text="Center Me!"
HorizontalAlignment="Stretch"
VerticalAlignment="Stretch" />
</Viewbox>
</Border>
您不需要居中或拉伸任何东西。我假设您最终会将此
边框
放置到网格
,因此只需将网格
的列和行设置为自动,边框
将根据文本块
的大小自行调整大小
<Grid>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Border BorderBrush="Red" BorderThickness="2">
<TextBlock x:Name="textBlockA1" Text="Center Me!"/>
</Border>
</Grid>
此外,如果您想在
TextBlock
上留一个左边距或右边距,您可以对TextBlock
应用样式(例如PhoneTextNormalStyle
),或者在边框上加一个空格
,这为什么会改变文本块的大小?它只会调整第一列/行的大小,将文本块和边框移动到网格的顶部/左侧……他真正想要的不是调整TextBlock
的大小,他只是不确定边框
为什么不适合TextBlock
的大小。将它们放入网格中
将是一个显而易见的解决方案。我不想调整文本块的大小。文本块需要有一个固定的大小。我只想让textblock中的文本居中,而textblock会拉伸以填充其“容器”,在本例中,它是边界元素。我的答案不是您想要实现的吗?是什么使文本居中?您使用的是网格的风格还是事实?谢谢您的建议。我尝试按照您的建议使用Viewbox控件。viewbox将文本居中,但缺点是它会更改字体的大小。我的UI中会有许多这样的文本块,它们显示不同的文本,如果我使用viewbox,看起来我会根据文本的长度使用不同的字体大小。这在UI上看起来不太好。您提到,当您将TextBlock设置为居中,并将水平/垂直对齐设置为居中时,您没有使用整个可用空间。另一方面,您说过希望TextBlock在其容器中居中,并且它应该拉伸。。。我有点不知所措。TextBlock的大小永远只是它的文本大小,它是否更大也无关紧要,因为它本身没有任何背景笔刷或边框。也许您只需要将TextBlock.TextAlignment属性设置为中心?谢谢您的回复。也许我不太理解文本块。我不知道textblock的大小总是它的“文本”大小。我的印象是textblock元素的大小可能与它所包含的文本大小不同。在我的应用程序中,我需要有大约20个大小相等的控件,用户可以按这些控件进行选择。如果这些控件中的文本都相对于控件居中,看起来会很好看。因此,我最好使用一个按钮而不是一个文本块?如果你需要一行或一列文本块,每个文本块占用相同的空间量,你可以将它们放在一个带有星形高度/宽度行/列定义(例如)的网格中,或者你可以使用宽度和高度为它们指定特定的尺寸,以便每个文本块占用相同的空间量。如果你需要背景-你也可以把它们放在a的内部或前面,同时确保将它们的水平/垂直对齐设置为中心。
<Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="Auto"/>
<ColumnDefinition Width="12"/>
<ColumnDefinition Width="Auto" />
<ColumnDefinition Width="Auto" />
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<Grid.RowDefinitions>
<RowDefinition Height="Auto"/>
<RowDefinition Height="12"/>
<RowDefinition Height="Auto"/>
<RowDefinition Height="12" />
<RowDefinition Height="Auto"/>
<RowDefinition/>
</Grid.RowDefinitions>
<Border Background="#FFBC7C0A">
<TextBlock x:Name="textBlockA1" Text="Center Me!" Foreground="White" Style="{StaticResource PhoneTextNormalStyle}"/>
</Border>
<Border Background="#FFBC7C0A" Grid.Row="2">
<TextBlock x:Name="textBlockA2" Text="Center Me!" Foreground="White" Style="{StaticResource PhoneTextNormalStyle}"/>
</Border>
<Border Background="#FFBC7C0A" Grid.Row="2" Grid.Column="2">
<TextBlock x:Name="textBlockA3" Text="This is a longer text" Foreground="White" Style="{StaticResource PhoneTextNormalStyle}"/>
</Border>
<Border Background="#FFBC7C0A" Grid.Column="3">
<TextBlock x:Name="textBlockA4" Text="Short" Foreground="White" Height="27" VerticalAlignment="Top" Style="{StaticResource PhoneTextNormalStyle}"/>
</Border>
<Border Background="#FFBC7C0A" Grid.ColumnSpan="3" Grid.Row="4" HorizontalAlignment="Left">
<TextBlock x:Name="textBlockA5" Text="Center Me!" Foreground="White" FontSize="{StaticResource PhoneFontSizeExtraLarge}" Style="{StaticResource PhoneTextNormalStyle}"/>
</Border>
</Grid>