WPF RichTextBox,关键字搜索,样式改变,超链接替换,图文混排
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字符能力的限制。
用法举例:
<RichTextBox Background="#E3E3E3" ScrollViewer.VerticalScrollBarVisibility="Hidden" Margin="10,0,0,0" FontFamily="Microsoft YaHei" FontSize="12" IsReadOnly="True" Foreground="#333333" x:Name="richTextBox" BorderThickness="0"> <FlowDocument x:Name="richTextBoxFlowDocument" LineHeight="20" /> </RichTextBox>
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 把文章中指定关键字替换成超链接
/// <summary> /// 设置热点词为超链接 /// </summary> /// <param name="key">热点词</param> /// <param name="foreground">热点词字体颜色</param> public void ConvertKeyToHyperLink(string key, SolidColorBrush foreground) { m_TextList = new List<TextRange>(); //设置文字指针为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 改变用户搜索的关键词的样式,并支持当前选中的高亮
/// <summary> /// 改变在文章中用户搜索的关键字的字体颜色 /// </summary> /// <param name="keyword"></param> public void ChangeSeachKeyWordsColor(string keyword) { ChangeColorWithResout(keyword); } /// <summary> /// 改变关键字的字体颜色 /// </summary> /// <param name="keyword">用户搜索关键字</param> /// <returns></returns> private List<TextRange> ChangeColorWithResout(string keyword) { if (!string.IsNullOrEmpty(m_ProSearchkey)) { ChangeColor(CommonColorsHelp.DefaultFontColor, m_ProSearchkey); ReSetBackGroundAll(); } m_ProSearchkey = keyword; return ChangeColor(CommonColorsHelp.KeyFontColor, keyword); } /// <summary> /// 设置背景色 /// </summary> /// <param name="l"></param> /// <param name="textRange"></param> public void SetBackGround(Color l, TextRange textRange) { textRange.ApplyPropertyValue(TextElement.BackgroundProperty, new SolidColorBrush(l)); textRange.ApplyPropertyValue(TextElement.ForegroundProperty, new SolidColorBrush(CommonColorsHelp.SelectedKeyFontColor)); } /// <summary> /// 重新设置背景色 /// </summary> /// <param name="textRange">关键字的的TextRange</param> /// <param name="isCurrKeyWord">是否是当前的关键字</param> 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)); } } /// <summary> /// 上一处 /// </summary> 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]); } } /// <summary> /// 下一处 /// </summary> 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]); } } /// <summary> /// 改变关键字的具体实现 /// </summary> /// <param name="l"></param> /// <param name="richTextBox1"></param> /// <param name="selectLength"></param> /// <param name="tpStart"></param> /// <param name="tpEnd"></param> /// <returns></returns> 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); } /// <summary> /// 把所有背景恢复到默认 /// </summary> private void ReSetBackGroundAll() { if (m_TextList != null) { foreach (TextRange textRange in m_TextList) { ReSetBackGround(textRange, false); } } } /// <summary> /// 当前第几处关键字被选中 /// </summary> private int currNumber = 0; /// <summary> /// 改变关键字字体颜色 /// </summary> /// <param name="l">颜色</param> /// <param name="keyword">关键字</param> /// <returns></returns> private List<TextRange> ChangeColor(Color l, string keyword) { m_TextList = new List<TextRange>(); //设置文字指针为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; } /// <summary> /// 当前关键字共搜索出的结果集合 /// </summary> private List<TextRange> m_TextList;
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· Linux系列:如何用heaptrack跟踪.NET程序的非托管内存泄露
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构