多个<Run>的文本块间距问题

37
在 Windows Phone 7.1 项目中,给定一个格式化的文本块:
<StackPanel Orientation="Horizontal">
    <TextBlock Foreground="DarkGray" VerticalAlignment="Bottom" Margin="0,0,0,8">
            <Run Text="total length "/>
            <Run Text="{Binding TotalHours}" FontSize="48"/>
            <Run Text="h "/>
            <Run Text=":" FontSize="48"/>
            <Run Text="{Binding TotalMinutes}" FontSize="48"/>
            <Run Text="m "/>
    </TextBlock>
</StackPanel>

在 VS 设计器中,它被正确地预览:

vs text block

但在 Blend 中已经不是我想要的样子了:

blend text block

在模拟器和真实设备中,它看起来和 Blend 一样(Blend 团队干得好)。

是什么导致在大数字 8 和 45 前面和后面添加了这些空格?

如何强制我的布局看起来正确(像在 VS 设计器中一样)?

2个回答

62
如果您将所有的Runs都写在同一行,那么空格将不会出现。基本上,在这里换行是UI上的一个空格。
<TextBlock Foreground="DarkGray" VerticalAlignment="Bottom" Margin="0,0,0,8"><Run Text="total length "/><Run Text="{Binding TotalHours}" FontSize="48"/><Run Text="h "/><Run Text=":" FontSize="48"/><Run Text="{Binding TotalMinutes}" FontSize="48"/><Run Text="m "/></TextBlock>

在此输入图片描述


3
好的回复。说真的,我们有那些作为TextBlock子元素的Runs,为什么在它们之间放置空格会影响TextBlock的显示方式呢?另外为什么换行符和很多空格被解释为单个空格? - Valentin Kuzub
3
因为您可以在运行之间输入纯文本,并且它将被呈现。将连续的空格(制表符、换行符)折叠成一个单一的空格是常见的 XML 行为,大多数人已经在 HTML 中熟悉了这种行为。 - Agent_L
2
是的,就好像这是一个HTML优于XML的绝佳示例一样?允许在Runs之间混合文本,并对空格进行特殊处理显然不是一件好事,也是一个奇怪的选择。你的交换问题及其原因。问题在于对TextBlock的子XML元素的奇怪处理。它包括奇怪的空格处理和元素之间的奇怪原始文本处理。 - Valentin Kuzub
2
不情愿地+1 - 我一直讨厌这个。一个编辑器试图将它们放在一行上,另一个则试图将它们分开。真是一团糟。 - Simon_Weaver
非常好用!太棒了!在我的情况下,我的第一个Run标签绑定的值可能为空,没有空格,但字符串开头始终有一个空格。在XAML中将Run标签放在同一行上可以解决此问题。 - Jerry

11

在Justin XL的回答的基础上,重要的是标记之间不能有空格,但标记内部的空格并不重要...

因此,您可以创造性地将运行放在单独的行上,但不能向结果添加空格:

<!-- Formatted to prevent adding spaces between runs -->
<TextBlock Foreground="DarkGray" VerticalAlignment="Bottom" Margin="0,0,0,8"
    ><Run Text="total length "
    /><Run Text="{Binding TotalHours}" FontSize="48"
    /><Run Text="h "
    /><Run Text=":" FontSize="48"
    /><Run Text="{Binding TotalMinutes}" FontSize="48"
    /><Run Text="m "
/></TextBlock>

为什么不使用Spans而是用Runs呢?(或者它们在Windows Phone上不支持吗?) - George Birbilis
1
我认为这里的问题更多地与标签之间的空格被视为空格而不是标签本身有关。据我所知,Span 用于向 TextBlock 添加非文本元素,而 Run 仅用于文本,因此我怀疑使用 Span 替换 Run 将无法解决添加额外空格的问题。 - Josh Stribling

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接