Xaml.Controls.TextBox中的字符文本包装

时间:2013-01-05 11:14:50

标签: c# xaml windows-8 windows-store-apps

环境

我正在开发一个Windows应用商店应用我创建了一个带有wordwrapping的TextBox

<ScrollViewer x:Name="ScrollView"  Margin="0" Grid.Row="1" Background="Black" BorderThickness="2" BorderBrush="White" KeyDown="keyDown" VerticalScrollBarVisibility="Auto" HorizontalScrollMode="Disabled" ZoomMode="Disabled" IsHorizontalRailEnabled="False" IsHorizontalScrollChainingEnabled="False">
    <Grid x:Name="Canvas" SizeChanged="setConsoleWidth">
        <TextBox x:Name="textbox" Text="TextBox" Foreground="White" FontSize="24" FontFamily="Assets/inconsolata.ttf#inconsolata" AcceptsReturn="True" BorderThickness="0" Background="{x:Null}" SelectionChanged="handleCaret" Margin="0" IsTextPredictionEnabled="False" TextWrapping="Wrap"/>
        <Rectangle x:Name="Caret" Stroke="Black" Fill="White" StrokeThickness="0" Margin="571,260,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Width="0" Height="0"/>
    </Grid>
</ScrollViewer>

这个想法是你可以在“文本框”中垂直滚动但不能水平滚动。

问题

我希望文本框将边界外的所有字符包装到新行。单词不必完全保留。当角色位于边界之外时,该角色应出现在新线上。而且,前一个字符应该保留在前一行。这应该用包括空格在内的所有字符来完成。

当前行为

可以使用以下图像解释当前行为:

Example behavior 图1:示例行为

当插入符号位于我们行的最后一个字符时(图1.1),输入字符时会发生两件事情,具体取决于字符类型:

  • 字符类型:非空格(包括制表符)所有字符

    当前行为 您追加字符的单词只是包装到换行符。见图1.2。

    期望的行为 只有字符被包装到换行符,如图1.2所示,字符'd' 只会在第二行。

  • 字符类型:空格

    当前行为 空格和索引不会被包装,只会在当前行上继续(参见图1.3)。插入另一个空格不会使该空间换行​​(见图1.4,插入符号在屏幕外)。下一个非空格字符包裹在换行符中,但空格字符将保留在第一行。

    期望的行为 空间被包裹到换行符,如图1.2所示,字符'd' 只会在第二行。

<击>

<击> 如何实现此期望的行为(页面由c#支持)?

编辑:

通过用不间断空格(“\ u00A0”)替换所有空格,我能够将字符空间行为更改为非空格行为。现在我只需要第一部分的解决方案。

2 个答案:

答案 0 :(得分:1)

根据您的想法,您可以在每个字符后插入零宽度空格。它是unicode符号200B(http://en.wikipedia.org/wiki/Zero-width_space)。我刚刚尝试使用Windows Forms,它可以运行。

答案 1 :(得分:0)

用非破坏空间替换空格(见上文)似乎可以解决所有问题。对于不间断的空格,文本框会认为只有一个单词,因此无法“智能地”包装。

修改

这对所有字符都不起作用,例如'example1&gt; example2'仍被视为两个单词'example1&gt;'和'example2'。也许我可以在每个角色之间插入一个不可见的单词分隔符?