博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
WPF RichTextBox,关键字搜索,样式改变,超链接替换,图文混排
阅读量:4579 次
发布时间:2019-06-09

本文共 10468 字,大约阅读时间需要 34 分钟。

RichTextBox 只是一个控件,表示对 FlowDocument 对象执行操作的丰富编辑控件。它所承载的内容由其 Document 属性来呈现。 Document 是一个 FlowDocument 类型. RichTextBox控件允许用户输入和编辑文本的同时提供了比普通的TextBox控件更高级的格式特征。 RichTextBox控件提供了数个有用的特征,你可以在控件中安排文本的格式。要改变文本的格式,必须先选中该文本。只有选中的文本才可以编排字符和段落的格式。有了这些属性,就可以设置文本使用粗体,改变字体的颜色,创建超底稿和子底稿。也可以设置左右缩排或不缩排,从而调整段落的格式。 RichTextBox控件可以打开和保存RTF文件或普通的ASCII文本文件。你可以使用控件的方法(LoadFile和SaveFile)直接读和写文件。RichTextBox控件使用集合支持嵌入的对象。每个嵌入控件中的对象都表示为一个对象。这允许文档中创建的控件可以包含其他控件或文档。例如,可以创建一个包含报表、Microsoft Word文档或任何在系统中注册的其他OLE对象的文档。要在RichTextBox控件中插入对象,可以简单地拖住一个文件(如使用Windows 95的Explorer)或其他应用程序(如Microsoft Word)中所用文件的加亮部分(选择部分),将其直接放到该RichTextBox控件上。RichTextBox控件支持剪贴板和OLE对象的OLE拖放功能。当从剪贴板粘贴对象时,就在当前的插入点插入该对象。如果对象是拖放到控件中,则插入点将跟随鼠标指针位置变动,直到释放开鼠标,然后在鼠标释放处插入对象。要打印RichTextBox控件中的所有或部分文本,使用SelPrint方法。因为RichTextBox控件是数据绑定控件,可以将其与Data控件绑定到Microsoft Access数据库的Binary或Memo数据域,或其他数据库中类似的数据域(如SQL Server中的TEXT数据类型的数据域)。RichTextBox控件支持几乎所有的TextBox控件中的属性、事件和方法,如MaxLength, MultiLine, ScrollBars, SelLength, SelStart和SelText。使用TextBox控件的应用程序很容易改为使用RichTextBox控件。然而,RichTextBox控件并没有普通TextBox控件的64K字符能力的限制。

 用法举例:

1向文章内容中增加一段文字

public void AddParagraph(string txtCotent)        {            Paragraph p = new Paragraph();  // Paragraph 类似于 html 的 P 标签            Run r = new Run(txtCotent);      // Run 是一个 Inline 的标签            p.Inlines.Add(r);            richTextBoxFlowDocument.Blocks.Add(p);        }

2 向文章内容中增加一张图片

public void AddImage(Image imageCotent)        {            Paragraph p = new Paragraph();            InlineUIContainer inline = new InlineUIContainer(imageCotent);            p.Inlines.Add(inline);            richTextBoxFlowDocument.Blocks.Add(p);        }

3   把图片添加到光标位置

private void AddImageInPosin(string filepath)        {            Image img = new Image();            BitmapImage bImg = new BitmapImage();            img.IsEnabled = true;            bImg.BeginInit();            bImg.UriSource = new Uri(filepath, UriKind.Relative);            bImg.EndInit();            img.Source = bImg;            //// 调整图片大小            //if (bImg.Height > 100 || bImg.Width > 100)            //{            //    img.Height = bImg.Height * 0.2;            //    img.Width = bImg.Width * 0.2;            //}            img.Height = 50;            img.Stretch = Stretch.Uniform;  //图片缩放模式            new InlineUIContainer(img, richTextBox.Selection.Start); //插入图片到选定位置        }

4 把文章中指定关键字替换成超链接

///         /// 设置热点词为超链接        ///         /// 热点词        /// 热点词字体颜色        public void ConvertKeyToHyperLink(string key, SolidColorBrush foreground)        {            m_TextList = new List
(); //设置文字指针为Document初始位置 //richBox.Document.FlowDirection TextPointer position = richTextBox.Document.ContentStart; while (position != null) { //向前搜索,需要内容为Text if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text) { //拿出Run的Text string text = position.GetTextInRun(LogicalDirection.Forward); //可能包含多个keyword,做遍历查找 int index = 0; index = text.IndexOf(key, 0); if (index != -1) { TextPointer start = position.GetPositionAtOffset(index); TextPointer end = start.GetPositionAtOffset(key.Length); // m_TextList.Add(new TextRange(start, end)); linke(new TextRange(start, end), key, foreground); } } //文字指针向前偏移 position = position.GetNextContextPosition(LogicalDirection.Forward); } } private void linke(TextRange tp, string key, SolidColorBrush foreground) { TextRange tr = new TextRange(tp.Start, tp.End); Hyperlink hlink = new Hyperlink(tr.Start, tr.End); hlink.Tag = key; hlink.Foreground = foreground; hlink.FontFamily = new FontFamily("Microsoft YaHei"); hlink.FontSize = 12; hlink.Cursor = Cursors.Hand; hlink.MouseDown += hyperlink_MouseDown; }

5 后台向文章中新增一个超链接

private void AddLink()        {            Hyperlink hyperlink = new Hyperlink();            hyperlink.Foreground = new SolidColorBrush(Colors.Blue);            hyperlink.ForceCursor = true;            hyperlink.Cursor = Cursors.Hand;            hyperlink.Inlines.Add("后台添加的超链接");            //hyperlink.NavigateUri = new Uri("http://www.baidu.com",UriKind.Absolute);             hyperlink.MouseDown += hyperlink_MouseDown;            Paragraph p = new Paragraph();            p.Inlines.Add(hyperlink);            richTextBoxFlowDocument.Blocks.Add(p);        }

6 改变用户搜索的关键词的样式,并支持当前选中的高亮

///         /// 改变在文章中用户搜索的关键字的字体颜色        ///         ///         public void ChangeSeachKeyWordsColor(string keyword)        {            ChangeColorWithResout(keyword);        }        ///         /// 改变关键字的字体颜色        ///         /// 用户搜索关键字        /// 
private List
ChangeColorWithResout(string keyword) { if (!string.IsNullOrEmpty(m_ProSearchkey)) { ChangeColor(CommonColorsHelp.DefaultFontColor, m_ProSearchkey); ReSetBackGroundAll(); } m_ProSearchkey = keyword; return ChangeColor(CommonColorsHelp.KeyFontColor, keyword); } ///
/// 设置背景色 /// ///
///
public void SetBackGround(Color l, TextRange textRange) { textRange.ApplyPropertyValue(TextElement.BackgroundProperty, new SolidColorBrush(l)); textRange.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(CommonColorsHelp.SelectedKeyFontColor)); } ///
/// 重新设置背景色 /// ///
关键字的的TextRange ///
是否是当前的关键字 public void ReSetBackGround(TextRange textRange, bool isCurrKeyWord) { textRange.ApplyPropertyValue(TextElement.BackgroundProperty, new SolidColorBrush(CommonColorsHelp.DefaultBackGroundColor)); if (isCurrKeyWord) { textRange.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(CommonColorsHelp.KeyFontColor)); } else { textRange.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(CommonColorsHelp.DefaultFontColor)); } } ///
/// 上一处 /// public void SetUpBackGround() { if (m_TextList != null && m_TextList.Count > 0) { ReSetBackGround(m_TextList[currNumber], true); currNumber--; if (currNumber < 0) { currNumber = m_TextList.Count - 1; } SetBackGround(CommonColorsHelp.SelectedKeyBackGroundColor, m_TextList[currNumber]); } } ///
/// 下一处 /// public void SetDownBackGround() { if (m_TextList != null && m_TextList.Count > 0) { ReSetBackGround(m_TextList[currNumber], true); currNumber++; if (currNumber >= m_TextList.Count) { currNumber = 0; } SetBackGround(CommonColorsHelp.SelectedKeyBackGroundColor, m_TextList[currNumber]); } }///
/// 改变关键字的具体实现 /// ///
///
///
///
///
///
private TextPointer selecta(Color l, RichTextBox richTextBox1, int selectLength, TextPointer tpStart, TextPointer tpEnd) { TextRange range = richTextBox1.Selection; range.Select(tpStart, tpEnd); //高亮选择 range.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(l)); return tpEnd.GetNextContextPosition(LogicalDirection.Forward); } ///
/// 把所有背景恢复到默认 /// private void ReSetBackGroundAll() { if (m_TextList != null) { foreach (TextRange textRange in m_TextList) { ReSetBackGround(textRange, false); } } }///
/// 当前第几处关键字被选中 /// private int currNumber = 0; ///
/// 改变关键字字体颜色 /// ///
颜色 ///
关键字 ///
private List
ChangeColor(Color l, string keyword) { m_TextList = new List
(); //设置文字指针为Document初始位置 //richBox.Document.FlowDirection TextPointer position = richTextBox.Document.ContentStart; while (position != null) { //向前搜索,需要内容为Text if (position.GetPointerContext(LogicalDirection.Forward) == TextPointerContext.Text) { //拿出Run的Text string text = position.GetTextInRun(LogicalDirection.Forward); //可能包含多个keyword,做遍历查找 int index = 0; index = text.IndexOf(keyword, 0); if (index != -1) { TextPointer start = position.GetPositionAtOffset(index); TextPointer end = start.GetPositionAtOffset(keyword.Length); m_TextList.Add(new TextRange(start, end)); position = selecta(l, richTextBox, keyword.Length, start, end); } } //文字指针向前偏移 position = position.GetNextContextPosition(LogicalDirection.Forward); } if (m_TextList != null && m_TextList.Count > 0) { //重置 currNumber = 0; SetBackGround(CommonColorsHelp.SelectedKeyBackGroundColor, m_TextList[currNumber]); } return m_TextList; } ///
/// 当前关键字共搜索出的结果集合 /// private List
m_TextList;

 

 

转载于:https://www.cnblogs.com/shanranlei/p/3635317.html

你可能感兴趣的文章
sort-归并排序
查看>>
django 快速实现完整登录系统(cookie)
查看>>
.NET中的out和ref关键字
查看>>
Python之ftp服务器
查看>>
KMP预处理
查看>>
oracle的wm_concat函数实现行转列
查看>>
C语 三子棋小游戏
查看>>
[BZOJ 1861] 书架
查看>>
送给毕业生的一个学习建议
查看>>
基于redis+lua实现高并发场景下的秒杀限流解决方案
查看>>
Oracle 块修改跟踪 (Block Change Tracking) 说明
查看>>
阿里云 Redis 服务遇到的问题
查看>>
Jwt Token 安全策略使用 ECDSA 椭圆曲线加密算法签名/验证
查看>>
Window2008通过web.config进行限制ip访问
查看>>
浅析门户网站体育赛事CDN加速解决方案
查看>>
启动/关闭xp_cmdshell
查看>>
[PY3]——内置数据结构(8)——解构与封装
查看>>
进程、单线程和多线程
查看>>
python入门(3)python的解释器
查看>>
maven入门(1-3)构建简单的maven项目
查看>>