当我第一次运行我的程序并在richtextbox中键入一些文本时,如果我按enter键,这会导致克拉移到一个新行,然后按back space键而不是移到前一行,它只是移回一个空格,即使我没有在这一新行上键入任何文本。我搞不清发生了什么事。我做错什么了?我该怎么解决呢?
编辑:
当我开始输入时,richtextbox似乎在第一个字符前面添加了一个空格,并且在我生成的每一行新行前面都添加了一个空格。我不能把克拉放在空间前面,点击它前面,但我可以用back space删除它,然后一切恢复正常。
编辑2:这似乎是导致问题的代码,但我不明白它为什么这样做:

<RichTextBox.Resources>
     <Style TargetType="{x:Type Paragraph}">
            <Setter Property="Margin" Value="5"/>
     </Style>
</RichTextBox.Resources>

最佳答案

如果我把这个放进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的资源字典中的样式设置。由于段落没有localMargin属性,因此它继承了样式的边距。
按backspace时,左边距设置为0。这将给段落的margin属性一个局部值,因此它将停止从样式继承。
如果按enter并添加新段落,则新段落将复制上一段落的边距。所以,从本质上说,你的风格已经失效了。
这似乎是rtb如何实现EditingCommands.Backspace的一个bug。命令应该做什么,正式的:
在空选择上调用时,此命令将删除插入符号前面的字符或段落分隔符。在非空选择上调用时,此命令将删除选择。
此命令保留在调用此命令后立即在同一位置插入的内容的已删除选定内容的任何格式。
我想很明显这不是它真正在做的。事实上,如果您将边距设置为50,则很明显,当插入符号位于带有边距的段落的开头,并按Backspace键时,会将该段落的左边距减少20。我看不出有任何证据证明这种行为是正当的。
那么,你能做些什么呢?这有点取决于你当初为什么要设置这个边距。从你最初的描述来看,听起来好像你认为这是空白,而不是退格让它消失的事实,这是错误。好吧,那很容易解决;摆脱那种风格。
但如果你出于某种原因需要那笔保证金,我不知道该告诉你什么。

10-06 11:17