RichTextBox无法正常工作

时间:2010-02-28 00:30:51

标签: c# wpf richtextbox

当我第一次运行我的程序并在richtextbox中键入一些文本时,如果我按下enter键,这会导致carat移动到新行,然后按退格键而不是前一行,它只会向后移动一个空格即使我没有在这个新行上输入任何文字。我无法弄清楚发生了什么。我究竟做错了什么?我该如何解决?

编辑:

当我开始输入时,看起来richtextbox在第一个字符前面添加了一个空格,并且在我创建的每个新行的前面添加了一个空格。我不能将克拉放在空间前面,点击它前面,但我可以使用退格键将其删除,然后一切都恢复正常。

编辑2:这是导致问题的代码,但我无法弄清楚为什么会这样做:

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

1 个答案:

答案 0 :(得分: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>

这让我怀疑你的代码还有其他的东西。它是什么?

修改

嗯,好吧,很明显为什么你要在插入符号前面获得“空间”:你正在为设置边距的段落应用一种风格。 all 的不清楚是为什么按BACKSPACE会让它消失。

如何解决此类问题:向RichTextBox添加事件处理程序(我使用KeyUp),并使用XamlWriter将其Document属性转储到{ {1}}。你会看到,当它首次填充时,Console.Out包含:

Document

点击BACKSPACE后,它看起来像这样:

<FlowDocument PagePadding="5,0,5,0" AllowDrop="True" NumberSubstitution.CultureSource="User" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
  <Paragraph />
</FlowDocument>

如果你将你的风格中的边距设置为50而不是5,那么会发生什么更明显。你在段落前面看到的“空间”实际上是段落的左边距,由RTB的资源字典中的样式。由于段落没有本地<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> 属性,因此它继承了样式的边距。

按BACKSPACE时,左边距设置为0.这使得段落的Margin属性为本地值,因此它会停止继承样式。

如果按Enter键并添加新段落,则新段落将复制上一段的边距。所以,基本上,你的风格停止了。

这似乎是RTB如何实现Margin的错误。该命令应该做什么,正式:

  

在空选择上调用时,此命令会删除插入符号之前的字符或段落分隔符。在非空选择上调用时,此命令将删除选择。

     

在调用此命令后,此命令将保留已删除选择的任何格式,以便立即插入到同一位置的内容。

我认为很明显,这不是它实际上在做什么。事实上,如果你将保证金设置为50,很明显,当一个带有边距的段落开头的插入符号,并按下BACKSPACE时,它会将该段落的左边距缩小20.我看不到任何记录的理由对于那种行为。

那么,你能做些什么呢?这有点取决于你为什么要设置这个边际。从你原来的描述中,听起来你觉得它是边缘,而不是BACKSPACE让它消失的事实,那就是bug。嗯,这很容易修复;摆脱那种风格。

但如果由于某种原因需要保证金,我不知道该告诉你什么。