2010-04-05 111 views
2

我正在将格式应用于WPF RichTextBox中选定的标记。要做到这一点,我得到一个TextRange,它包含了我想强调的标记。然后,我将改变文本的颜色是这样的:WPF RichTextBox - 输入文本的格式

// Get start and end pointer for token 
TextPointer startPointer = run.ContentStart.GetPositionAtOffset(startOffset); 
TextPointer endPointer = run.ContentStart.GetPositionAtOffset(endOffset); 

// Get text range for token 
TextRange textRange = new TextRange(startPointer, endPointer); 

// Highlight token 
textRange.ApplyPropertyValue(TextElement.ForegroundProperty, Brushes.Blue); 

这是对我的RichTextBox的TextChanged事件发生。

格式化按预期方式应用,但继续输入文本将导致新文本继承已应用于相邻单词的格式。我希望将任何新文本的格式设置为使用RichTextBox属性中定义的默认格式选项。这可能吗?

另外,我可以突出显示所有令牌,我不想用默认的格式化选项为蓝色,但这对我来说感觉很尴尬。

回答

3

这不就是标准的行为吗?如果我在Word中突出显示文本,将其设置为粗体,将光标移动到该文本旁边并键入,新文本也变为粗体。我可以想象,MS使得富文本框的工作方式类似于Word中的文本区域。

如果您根据匹配某些条件(如语法突出显示)选择令牌,是否可以尝试将样式应用于文本之后光标距令牌1个字符?例如:

SomeToken |

代替

SomeToken |

其中|是游标。在第一个示例中光标与标记分隔一个空格,因此如果程序找到SomeToken,它将从S之前到(空格)之前的文本范围。我会想象那个样式不会被应用到新输入的文本中。

我承认这只是一个猜测,我可能误解了你的问题描述中的确切情况。更多的代码可能会有所帮助,特别是您提到的TextChanged事件或创建文本范围的代码。

+0

感谢您的回复Benny。 是的,这是标准的行为,但我试图实现语法突出显示,宁愿它没有这样做。在TextChanged事件中,我简单地调用了我的解析例程,该例程产生具有用于创建TextRange的开始和结束位置的令牌(我已将此代码添加到我的原始问题中)。 使用空格作为分隔符是可能的,但我宁愿避免它,因为空格不能保证。 谢谢, Alan – 2010-04-05 11:52:09

+0

嗯,它不必是空格作为分隔符。我所建议的是**等待**直到光标位于'endOffset + 1'处,以便在光标和文本范围之间存在某种东西。所以即使在输入'SomeToken |'* *之后,输入“n”后,标记还没有被选中。但是,当我输入* next *字符,'SomeToken {|',那么当我输入“{”(或任何其他字符)时,就会找到并设置标记。我注意到,语法突出显示在其他一些程序中就像那样。对不起,如果我不清楚。我希望更清楚。 – 2010-04-05 12:21:49

+0

再次感谢本尼。别担心,你很清楚。 我试图避免的是每个解析器上格式化的完全重置,但我仍然可以看到RichTextBox在继承相邻格式时的行为,如果我没有完全重置格式,会导致我出现问题。我相信会有一个快乐的媒介。 谢谢, Alan – 2010-04-05 13:01:47