基于WPF RichTextBox的编辑器(关键字高亮着色)

课设准备用WPF做一个写字板,打算能够代码高亮,结果发现WPF中的RichTextbox和WinForm里面的RichTextbox差别很大。不得不求助网络,在 郁闷的小胡子 的博客中发现了关键字高亮的一些代码。(http://www.cnblogs.com/xiaohuziHu/archive/2010/12/17/xiaohuzi.html)十分感谢他的分享。但是这段代码有些不尽人意的地方,在这里提出解决方案。

首先贴出和原版对应的类的代码吧~

 

 
  
1 public void ChangeColor(Color l, RichTextBox richBox, string keyword)
2 {
3 // 设置文字指针为Document初始位置
4 // richBox.Document.FlowDirection
5   TextPointer position = richBox.Document.ContentStart;
6 while (position != null )
7 {
8 // 向前搜索,需要内容为Text
9 if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text)
10 {
11 // 拿出Run的Text
12 string text = position.GetTextInRun(LogicalDirection.Forward);
13 // 可能包含多个keyword,做遍历查找
14 int index = 0 ;
15 index = text.IndexOf(keyword, 0 );
16 if (index != - 1 )
17 {
18 TextPointer start = position.GetPositionAtOffset(index);
19 TextPointer end = start.GetPositionAtOffset(keyword.Length);
20 position = selecta(l, richBox, keyword.Length, start, end);
21 }
22
23 }
24 // 文字指针向前偏移
25 position = position.GetNextContextPosition(LogicalDirection.Forward);
26
27 }
28 }

 

 

还有一个函数

 
  
1 public TextPointer selecta(Color l,RichTextBox richTextBox1, int selectLength, TextPointer tpStart, TextPointer tpEnd)
2 {
3 TextRange range = richTextBox1.Selection;
4 range.Select(tpStart, tpEnd);
5 // 高亮选择
6  
7 range.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(l));
8 range.ApplyPropertyValue(TextElement.FontWeightProperty, FontWeights.Bold);
9
10 return tpEnd.GetNextContextPosition(LogicalDirection.Forward);
11 }

 

这里解释一下为什么郁闷的小胡子会发现关键字只有部分高亮。这是因为在对关键字高亮的时候整个文档的结构也发生了变化,以前是一个Context包含文字的,但是现在由于有了高亮的关键字,这个时候文档的前半段自动变成一个Context,关键字是一个Context,然后后半段是一个Context。如图:

imageimage

左边是原始状态,右边是当关键字高亮后的状态。其中圆矩框表示一个Context。

我的解决方案很简单,就是在高亮的Context之后重新赋值position,让其指向下一个Context即可。

转载于:https://www.cnblogs.com/pangliang/archive/2011/01/08/1930888.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值