Windows phone 7 居中文本边框元素内的块文本

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展开以填充边框,

我正在玩silverlight,特别是针对windows phone的silverlight。我希望在边框元素中有一个textblock。我希望textblock填充整个边框元素。我还希望文本块内的文本在文本块内居中-垂直和水平

我遇到的问题是,如果我将textblock的水平和垂直对齐设置为居中,则textblock的大小将调整为文本的大小,因此textblock不会填满边框内的所有可用空间。如果我将textblock的水平和垂直对齐属性设置为“拉伸”,则会使textblock展开以填充边框,但textblock文本不再居中。我想我可以使用填充来居中文本,但这并不能给出一个精确的结果,因为文本的长度可能会有所不同

我之所以希望textblock位于边框内,首先是因为Silverlight for Windows Phone不为textblock提供背景属性。我使用边框来提供背景色

简而言之,当textblock位于border元素内并且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>