2

环境

我正在开发一个 Windows 应用商店应用程序我创建了一个带有自动换行功能的 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>

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

问题

我希望文本框将边界外的所有字符换行。单词不必完整保存。当字符超出边界时,该字符应出现在新行上。此外,前一个字符应该留在上一行。这应该使用包括空格在内的所有字符来完成。

当前行为

当前的行为可以用下图来解释:

示例行为 图 1:示例行为

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

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

    当前行为 您要附加字符的单词被简单地换行。见图 1.2。

    期望 的行为 只有字符被换行,在图 1.2 的情况下,字符 'd' 只会在第二行。

  • 字符类型:空格

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

    期望 的行为 空格被换行,在图 1.2 的情况下,字符 'd' 只会在第二行。

如何实现这种期望的行为(该页面由 c# 支持)?

编辑:

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

4

2 回答 2

0

用不间断空格替换空格(见上文)似乎可以解决所有问题。使用不间断空格,文本框会认为只有一个单词,因此不能“智能”换行。

编辑

这不适用于所有字符,例如“example1>example2”仍被视为两个单词“example1>”和“example2”。也许我可以在每个字符之间插入一个不可见的单词分隔符?

于 2013-01-05T14:01:05.170 回答
0

按照您的想法,您可以在每个字符后插入一个零宽度空格。它是 unicode 符号 200B ( http://en.wikipedia.org/wiki/Zero-width_space )。我刚刚尝试使用 Windows 窗体,它在那里工作。

于 2013-01-06T13:47:32.137 回答