当我第一次运行我的程序并在richtextbox中键入一些文本时,如果我按下enter键,这会导致carat移动到新行,然后按退格键而不是前一行,它只会向后移动一个空格即使我没有在这个新行上输入任何文字。我无法弄清楚发生了什么。我究竟做错了什么?我该如何解决?
编辑:
当我开始输入时,看起来richtextbox
在第一个字符前面添加了一个空格,并且在我创建的每个新行的前面添加了一个空格。我不能将克拉放在空间前面,点击它前面,但我可以使用退格键将其删除,然后一切都恢复正常。
编辑2:这是导致问题的代码,但我无法弄清楚为什么会这样做:
<RichTextBox.Resources>
<Style TargetType="{x:Type Paragraph}">
<Setter Property="Margin" Value="5"/>
</Style>
</RichTextBox.Resources>
答案 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。嗯,这很容易修复;摆脱那种风格。
但如果由于某种原因需要保证金,我不知道该告诉你什么。