【问题标题】:Why does TextBlock trims ending spaces from the text?为什么 TextBlock 会从文本中修剪结束空格?
【发布时间】:2013-01-15 12:21:25
【问题描述】:

这是我的TextBlocks:

<StackPanel Orientation="Horizontal" Margin="0,3,0,0">
    <TextBlock Text="6 or more characters, at least one letter and a number,   "  FontFamily="Segoe UI" Foreground="#000000" FontSize="13"/>
    <TextBlock Text="no symbols"  FontFamily="Segoe UI" Foreground="#000000" FontSize="13"/>
</StackPanel>

这是输出(屏幕截图):

为什么TextBlock 会修剪结尾空格?但是,当有前导空格时,它可以正常工作。

【问题讨论】:

    标签: xaml windows-8 microsoft-metro .net-4.5


    【解决方案1】:

    看起来xml:space="preserve" 应该 可以解决问题(请参阅Preserving Whitespace in XAML),但这似乎不适用于 Windows 应用商店应用程序(它可以在 WPF 中使用)。

    如果您使用不间断空格字符 &amp;#160; 它确实有效

     <TextBlock Text="6 or more characters, at least one letter and a number,&#160;&#160;&#160;&#160;&#160;&#160;&#160;"  ....
    

    我想您可以尝试在 Text 属性上构建一个转换器来检查尾随空格并替换为不间断空格 - 假设发生的截断不会太早发生。

    【讨论】:

    • 不间断空格可以解决问题,但space 属性很容易做到:(
    • 从 WinRT 8.1 更新。 xml:space 仍然不起作用,这个解决方案可以。
    • 这(使用  )目前似乎不适用于 Windows 10 通用应用程序。我必须将其简单地设置为开始标签和结束标签之间的内容,而不是设置 Text 属性以使其正确呈现。尝试了许多其他变体均无济于事(\u0020、#nbsp 等)
    【解决方案2】:

    &lt;TextBlock /&gt;. 中使用&lt;Run /&gt; 解决。

    <StackPanel Orientation="Horizontal" Margin="0,3,0,0">
        <TextBlock FontFamily="Segoe UI" Foreground="#000000" FontSize="13">
            <Run Text="6 or more characters, at least one letter and a number, " />
            <Run Text="no symbols" />
        </TextBlock>
    </StackPanel>
    

    自动换行仍然有效

    <StackPanel Orientation="Horizontal" Margin="0,3,0,0">
        <TextBlock FontFamily="Segoe UI" Foreground="#000000" FontSize="13" 
            Width="200" TextWrapping="Wrap">
            <Run Text="6 or more characters, at least one letter and a number, " />
            <Run Text="no symbols" />
        </TextBlock>
    </StackPanel>
    

    如果包装不是问题,我会很容易地使用 Jim 的解决方案 (#160;)。

    请考虑一下 HTML 如何处理和保留空格。这也是 XAML 处理和保留空格的方式。当然,您会认为在 TextBlock 内部会更直接地处理它,对吧?嗯,就是这样。至少有一个解决方案。

    【讨论】:

    • 杰瑞为什么我这样做是因为当我的应用程序处于正常模式时,文本应该是 6 or more characters, at least one letter and a number, no symbols 而在快照视图模式下应该是 @987654327 @。我已经做到了。但我希望这些文本应该来自.resw 文件。换句话说,我将如何在 &lt;ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="Text" Storyboard.TargetName="textBlock"&gt; &lt;DiscreteObjectKeyFrame KeyTime="0" Value="Text From resw file"/&gt; 中设置文本,就像 &lt;TextBlock x:Uid="txt"/&gt;
    • 同一个&lt;Run Text="{Binding Whatever}" /&gt;
    【解决方案3】:

    尝试使用xml:space="preserve":

    <StackPanel Orientation="Horizontal" Margin="0,3,0,0">
        <TextBlock xml:space="preserve" Text="6 or more characters, at least one letter and a number,   "  FontFamily="Segoe UI" Foreground="#000000" FontSize="13"/>
        <TextBlock xml:space="preserve" Text="no symbols"  FontFamily="Segoe UI" Foreground="#000000" FontSize="13"/>
    </StackPanel>
    

    【讨论】:

    • +1 表示空间属性。但这在商店应用中不起作用
    【解决方案4】:

    我找到了不同的解决方案!当您还设置IsTextSelectionEnabled 时,\u+A0 有效。

    我不知道为什么会这样,这完全出乎我的意料(我添加了该字段,因为我刚刚发现它同时还在处理我的“为什么我的文本在通用应用程序中会被修剪? em>'的问题)。

    另外U+205F(中等数学空间)也可以与IsTextSelectionEnabled结合使用。

    【讨论】:

    • 自 2016 年 10 月 6 日起,IsTextSelectionEnabled 技巧不再起作用,
    【解决方案5】:

    RichTextBlock 似乎保留了前导和尾随空格(在 WP 8.1 WinRT 中):

    <RichTextBlock>
     <RichTextBlock.Blocks>
      <Paragraph >
       <Paragraph.Inlines>
        <Run Text="trailing " /><Run Text="bbb" /><Run Text=" leading" />
       </Paragraph.Inlines>
      </Paragraph>
     </RichTextBlock.Blocks>
    </RichTextBlock>
    

    但除了您指定的那些之外,它似乎还在运行之间添加了一个额外的空间。

    【讨论】:

      猜你喜欢
      • 2020-04-25
      • 1970-01-01
      • 2015-02-06
      • 2012-11-18
      • 2017-10-23
      • 1970-01-01
      • 2014-12-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多