RichTextBox无法正常工作

4
当我第一次运行程序并在richtextbox中输入文本时,如果我按回车键,导致游标移动到新行,然后按退格键而不是转到上一行,它只会向后移动一个空格,即使我没有在这个新行上输入任何文本。我无法弄清楚发生了什么。我做错了什么?我该如何解决?
编辑:
看起来richtextbox在我开始输入时会在第一个字符前添加一个空格,并且在我制作新行时会添加一个空格。我无法通过单击其前面来将插入符号放在空格前面,但我可以使用退格键删除它,然后一切都恢复正常。
编辑2:这似乎是导致问题的代码,但我无法弄清楚为什么会这样:
<RichTextBox.Resources>
     <Style TargetType="{x:Type Paragraph}">
            <Setter Property="Margin" Value="5"/>
     </Style>
</RichTextBox.Resources>

1
如果你在新行上还没有输入任何内容,那么它怎么会回到前一个空格呢?这个空格是从哪里来的? - slugster
这是我的问题。我不知道它怎么可能发生。当它回到一个空格时,插入符号处于一个本不应该到达的位置。 - Justin
你是说它超出了 RichTextBox 的边界吗?光标在哪里?能给我看个截图吗? - Steve Danner
当RichTextBox第一次加载时,插入符号处于正确位置,但是一旦我开始输入,第一行前面就会添加一个空格。 - Justin
1个回答

4

如果我把这个代码放到Kaxaml中,RichTextBox的行为不应该是这样的:

<Page
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
  <Grid>  
    <RichTextBox/>
  </Grid>
</Page>

这让我怀疑你的代码还有其他问题。请问是什么问题?
编辑:好吧,现在清楚了为什么光标前面会出现“空格”:你对段落应用了一个设置了边距的样式。但完全不清楚按BACKSPACE键为什么会使其消失。
如何解决这类问题:向你的RichTextBox添加事件处理程序(我使用KeyUp),并使用XamlWriter将其Document属性转储到Console.Out。你会发现,当它第一次被填充时,Document包含:
<FlowDocument PagePadding="5,0,5,0" AllowDrop="True" NumberSubstitution.CultureSource="User" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
  <Paragraph />
</FlowDocument>

当你按下BACKSPACE键后,它会看起来像这样:
<FlowDocument PagePadding="5,0,5,0" AllowDrop="True" NumberSubstitution.CultureSource="User" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
  <Paragraph Margin="0,5,5,5" />
</FlowDocument>

如果您将样式中的边距设置为50而不是5,则会更清楚地看到发生了什么。您在段落前面看到的“空格”实际上是由RTB资源字典中的样式设置的段落左边距。由于该段落没有本地Margin属性,因此它继承了样式的边距。
当您按BACKSPACE键时,左边距将设置为0。这会使段落的Margin属性具有本地值,因此它停止从样式继承。
如果您按ENTER并添加新段落,则新段落将复制上一段落的边距。因此,基本上,您的样式停止工作。
这似乎是RTB如何实现EditingCommands.Backspace的错误。官方上说,该命令应该做什么:
当在空选择上调用时,此命令将删除插入符号之前的字符或段落分隔符。在非空选择上调用时,此命令删除选择内容。
此命令保留从已删除选择中获取的任何格式化信息,以便在此命令调用后立即插入到相同位置的内容中。
我认为很明显它实际上没有这样做。实际上,如果将边距设置为50,则可以清楚地看到,当插入符号位于带有边距的段落开头时,按BACKSPACE会将该段落的左边距减少20。我无法看到任何文档上对该行为的理由。
那么,您可以怎么做呢?这在某种程度上取决于您为什么首先要设置该边距。根据您最初的描述,似乎您认为边距而不是BACKSPACE使其消失是错误。嗯,很容易解决; 摆脱那个样式。
但是,如果您出于某种原因需要该边距,则我不知道该告诉您什么。

我已经找到了有问题的代码并将其作为编辑发布到了我的问题中。虽然我已经找到了问题所在,但仍然无法弄清楚为什么会出现这种情况。 - Justin

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