【问题标题】:Centering TextBlock text inside border element在边框元素内居中 TextBlock 文本
【发布时间】:2011-11-17 23:09:16
【问题描述】:

我正在使用 silverlight - 特别是用于 windows phone 的 Silverlight。我想在边框元素中有一个文本块。我希望文本块填满整个边框元素。我还希望文本块内的文本在文本块内居中 - 垂直和水平。

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

我首先希望将文本块放在边框内的原因是因为 Silverlight for Windows Phone 没有为文本块提供背景属性。我使用边框来提供背景颜色。

简而言之,当文本块位于边框元素内并且文本块必须拉伸以填充边框时,有什么方法可以使文本块中的文本居中。

下面是我目前的代码。

<Border BorderBrush="Red" BorderThickness="2" Grid.Row="0" Grid.Column="0">
    <TextBlock Name="textBlockA1" Text="Center Me!" HorizontalAlignment="Stretch"            
        VerticalAlignment="Stretch"/>
</Border>

【问题讨论】:

    标签: windows-phone-7 silverlight-4.0 border textblock


    【解决方案1】:

    您不需要居中或拉伸任何东西。我假设你最终会将这个Border 放入Grid,所以只需将Grid 的列和行设置为自动,Border 将根据TextBlock 的大小自行调整大小。

        <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 添加Background 颜色的好方法。就像您正在用Border 的背景颜色填充Grid 的单元格。请参见下面的示例。

        <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>
    

    此外,如果您想在 TextBlock 上设置左边距或右边距,您可以为 TextBlock 应用样式(例如 PhoneTextNormalStyle)或为 Border 提供填充。

    【讨论】:

    • 为什么会以不同的方式调整 TextBlock 的大小?它只会调整第一列/行的大小,将 TextBlock 和 Border 移动到网格的顶部/左侧......
    • 他真正想要的不是调整TextBlock 的大小,他只是不确定为什么Border 不适合TextBlock 的大小。将它们放入Grid 将是一个明显的解决方案。
    • 我不想调整文本块的大小。文本块需要具有固定大小。我想要的只是文本块中的文本居中,而文本块拉伸以填充其容器,在这种情况下是边框元素。
    • 我的回答不是你想要达到的吗?
    • 是什么使文本集中?是样式还是您使用网格的事实?
    【解决方案2】:

    如果居中对齐不适合您,并且您想拉伸文本以占用更多空间,您可以使用 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>
    

    【讨论】:

    • 感谢您的建议。我尝试按照您的建议使用 Viewbox 控件。视图框使文本居中,但缺点是它会更改字体的大小。我的 UI 中会有很多这样的文本块显示不同的文本,如果我使用 viewbox,看起来我会有不同的字体大小,具体取决于文本的长度。这在 UI 上看起来不太好。
    • 您提到,当您将 TextBlock 居中并将 Horizo​​ntal/Vertical-Alignment 设置为 Center 时 - 您并没有使用整个可用空间。另一方面 - 你说你希望 TextBlock 在它的容器中居中并且它应该伸展......我有点难过。 TextBlock 将永远只是其文本的大小,如果它更大也没关系,因为它本身没有任何背景画笔或边框。也许您只需要将 TextBlock.TextAlignment 属性设置为 Center?
    • 感谢您的回复。也许我不太了解文本块。我不知道文本块将始终是其文本的大小。我的印象是 textblock 元素的大小可能与其包含的文本不同。在我的应用程序中,我需要大约 20 个大小相同的控件,用户可以按下这些控件进行选择。如果这些控件中的文本都相对于控件居中,那么视觉上会很好看。那么我最好使用按钮而不是文本块?
    • 如果您需要一行或一列 TextBlocks,每个都占用相同数量的空间 - 您可以将它们放在具有星高/宽度行/列定义的网格中(例如。) 或者您可以使用 Width 和 Height 为它们指定特定尺寸,这样每个尺寸都将占用相同的空间。如果您需要背景 - 您还可以将它们放在 内或 前面,同时确保将它们的水平/垂直对齐设置为中心。
    猜你喜欢
    • 2022-01-26
    • 1970-01-01
    • 2014-10-19
    • 2023-02-03
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 2014-02-03
    • 2023-03-05
    相关资源
    最近更新 更多