WPF RichTextBox的使用总结

RichTextBox内容模型

RichTextBox 支持基于块的内容模型。 RichTextBox   的内容属性为 Blocks,这是 Paragraph 元素的集合Paragraph元素可包含从 Inline 派生的元素。上图总结了 RichTextBox 的内容模型,并且显示从 BlockInline 派生的元素是如何适应此模型的。

简单介绍

1.RichTextBox    是一个可支持您显示或编辑丰富内容(包括段落、超链接和内联图像)的控件。本主题介绍 RichTextBox 控件,描述该控件的一些功能,并且显示如何在 XAML 和代码中使用该控件的一些示例。

2.RichTextBox    分为块和行

3.本人部分文章来源MSDN,原文地址:http://msdn.microsoft.com/zh-cn/library/ee681613(v=vs.95).aspx

Block 元素

Block 元素是从 Block 继承的类。目前,ParagraphSectionBlock 派生,但 Section 不是 RichTextBox 的文档模型的一部分。


Block 元素


描述


Paragraph


Paragraph   用于将内容分组到一个段落中。                         Paragraph   的最简单且最常见的用途是创建文本段落。  Paragraph   还可以包含 Inline 元素。

Inline 元素

Inline 元素是从 Inline 继承的类。一个 Inline 元素或者包含在一个 Block 元素中,或者包含在另一个 Inline 元素中。                 Inline 元素通常用作在屏幕上呈现的内容的直接容器。  例如,一个 Paragraph(Block 元素)可以包含 Run(Inline 元素),但 Run 实际包含在屏幕上呈现的文本。  每个 Paragraph 元素中的内容都可以包含如下许多类型的元素:


Inline 元素


描述


Run


Run   用于包含无格式文本。您可能预期 Run 对象会在内容中广泛使用,不过,在标记中不需要显式使用 Run 元素。


Span


Span   将其他 Inline 内容元素组织到一起。对于 Span 元素中的内容,不应用任何继承呈现。  也就是说,如果将内容放置于 Span 元素内且没有任何属性时,不格式化内容。  但是,从 Span 继承的元素(例如 HyperlinkBoldItalicUnderline)会向文本应用格式。


InlineUIContainer


InlineUIContainer   使 UIElement 元素(例如 ImageButton 控件)能够嵌入到 Inline 内容元素中。

RichTextBox   支持超链接。您可以使用 Hyperlink 元素在 RichTextBox 中显示超链接。  超链接提供内置的鼠标悬停行为和焦点支持。  使用 Hyperlink 元素的 NavigateUri 属性指定 URL。

                   说明:                

您必须将 RichTextBoxIsReadOnly 属性设置为 true,才能使 Hyperlink 元素生效。

 RichTextBox案例源码(可发送图片和文字)

直接上代码:

1.xaml 代码

 1 <Window x:Class="RichTextBoxDemo.MainWindow"
 2         xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
 3         xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
 4         Title="RichTextBoxDemo" Height="605.108" Width="846.839"  Closed="MainWindow_OnClosed">
 5     <Grid Margin="0,0,2,0">
 6         <RichTextBox HorizontalAlignment="Left" AllowDrop="True"  VerticalScrollBarVisibility="Auto"    Height="135" VerticalAlignment="Top" Width="802" Margin="10,374,0,0" Name="SendMessageRichTextBox">
 7             <FlowDocument Name="SendDocument">
 8                 <Paragraph Name="SendMessageParas"></Paragraph>
 9             </FlowDocument>
10         </RichTextBox>
11         <RichTextBox HorizontalAlignment="Left" AllowDrop="True" VerticalScrollBarVisibility="Auto" Height="348" IsReadOnly="True" VerticalAlignment="Top" Width="802" Margin="10,10,0,0" Name="MessageRichTextBox">
12             <FlowDocument Name="MessageDocument">
13             </FlowDocument>
14         </RichTextBox>
15         <Button Content="浏览图片" Name="BrowserButton" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="667,534,0,0" Click="BrowserButton_Click"/>
16         <Button Content="发送" Name="SendButton" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="752,534,0,0" Click="SendButton_Click"/>
17
18     </Grid>
19 </Window>

2.点击发送按钮

 1       private void SendButton_Click(object sender, RoutedEventArgs e)
 2         {
 3             try
 4             {
 5                 SendMessage();
 6             }
 7             catch (Exception)
 8             {
 9             }
10         }

3.选择图片

 1      private void SendImage()
 2         {
 3             //选择图片
 4             var dialog = new OpenFileDialog();
 5             dialog.Filter = ".jpg|*.jpg|.png|*.png|.jpeg|*.jpeg";
 6             if (dialog.ShowDialog(this) == false) return;
 7             _fileName = dialog.FileName;
 8             var a = new Image
 9             {
10                 Source = new BitmapImage(new Uri(_fileName, UriKind.RelativeOrAbsolute)),
11                 Width = 60,
12                 Height = 60,
13                 Tag = _fileName
14             };
15             var blockCount = SendDocument.Blocks.Count(b => b != null);
16             if (blockCount > 1)
17             {
18                 var p = new Paragraph();
19                 p.Inlines.Add(a);
20                 SendDocument.Blocks.Add(p);
21             }
22             else
23             {
24                 SendMessageParas.Inlines.Add(a);
25             }
26             SendMessageRichTextBox.Focus();
27             //将光标至于所有发送框末尾
28             SendMessageRichTextBox.CaretPosition = SendDocument.Blocks.LastBlock.ContentEnd;
29         }

4.封装的函数和变量

1         #region 变量区域
2         //选择图片的文件名
3         private string _fileName = string.Empty;
4         private Paragraph p = null;
5         //记录Span
6         Dictionary<int, Span> spans = new Dictionary<int, Span>(0);
7         List<Paragraph> parasList = new List<Paragraph>(0);
8         private int index = 0;
9         #endregion
 1       #region 发送消息
 2         private void SendMessage()
 3         {
 4             index = 0;
 5             //把richtextBox内容转成字符串形式
 6             //string strDoc = System.Windows.Markup.XamlWriter.Save(SendMessageRichTextBox.Document);
 7             //上面的逆操作
 8             var run = new Run("我:\t" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"));
 9             run.Foreground = System.Windows.Media.Brushes.RoyalBlue;
10             var msg = new Paragraph(run);
11             MessageDocument.Blocks.Add(msg);
12
13             var blockCount = SendDocument.Blocks.Count(a => a != null);
14             //以块的形式发送
15             if (blockCount > 1)
16             {
17                 foreach (var item in SendDocument.Blocks.OfType<Paragraph>().SelectMany(b => b.Inlines))
18                 {
19                     p = new Paragraph();
20                     SetData(item);
21
22                 }
23                 foreach (var key in spans.Keys)
24                 {
25                     var span = spans[key];
26                     var par = parasList[key];
27                     par.Inlines.Add(span);
28                     MessageDocument.Blocks.Add(par);
29                 }
30                 spans.Clear();
31                 parasList.Clear();
32                 //清理块
33                 SendDocument.Blocks.Clear();
34                 SendMessageParas = new Paragraph();
35                 SendDocument.Blocks.Add(SendMessageParas);
36             }
37             else
38             {
39                 p = new Paragraph();
40                 foreach (var item in SendMessageParas.Inlines)
41                 {
42                     SetData(item);
43                 }
44                 MessageDocument.Blocks.Add(p);
45                 //清理行
46                 SendMessageParas.Inlines.Clear();
47             }
48
49             MessageRichTextBox.ScrollToEnd();
50         }
51         #endregion
52
53         #region 设置数据
54         //设置数据
55         private void SetData(Inline item)
56         {
57             if (item is Run)
58             {
59                 var r = new Run((item as Run).Text);
60                 p.Inlines.Add(r);
61                 MessageDocument.Blocks.Add(p);
62             }
63             else if (item is Span)
64             {
65                 var s = item as Span;
66                 spans.Add(index, s);
67                 parasList.Add(p);
68             }
69             else if (item is InlineUIContainer)
70             {
71                 var child = item as InlineUIContainer;
72                 var image = child.Child as Image;
73                 if (image == null) return;
74                 var img = new Image { Source = image.Source, Width = image.Width, Height = image.Height };
75                 p.Inlines.Add(img);
76                 MessageDocument.Blocks.Add(p);
77             }
78
79             index++;
80         }
81         #endregion    

5.释放资源

1       private void MainWindow_OnClosed(object sender, EventArgs e)
2         {
3             p = null;
4             SendMessageRichTextBox = null;
5             MessageRichTextBox = null;
6             _fileName = null;
7
8         }

6.运行效果图展示:

(1) 普通的发送图片和文本

(2)支持复制,可全选,RichTextBox 原有的,不是我实现的。

(3) 粘贴代码发送和显示,不过这里有问题,带有样式的代码默认都是以Span出现,所以会乱,目前还解决不了,希望大神指教。

7.OK  说完了,补充一点:

.NET技术交流群 199281001 .欢迎加入。

觉得本文对你有所帮助,就点右下角推荐吧,谢谢。

作者:gaobing

出处: http://gaobing.cnblogs.com

提示:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。

WPF RichTextBox的使用总结

时间: 2024-10-27 10:21:55

WPF RichTextBox的使用总结的相关文章

WPF RichTextBox相关总结

由于公司涉及到聊天对话框的功能,就想到了RichTextBox,查阅相关资料,总结下: 一.RichTextBox的内容相关的类 1.1RichTextBox的内容结构 RichTexBox是个可编辑控件,可编辑我们很容易想到word的可编辑,在word里面我们经常会新建一个Document,然后一段一段的编写,有的时间会插入图片,或者是特殊的文本.同样RichTextBox也是一个以Document为主体的一个控件,Document也有段落(Paragraph),不过段落中是分为小片小片(In

WPF RichTextBox Flowdocment如何实现自动分页?(二)

使用OpenXML SDK实现按页读取内容: 以下内容采用WPF+RichTextBox+FlowDocment展示,测试文档共3页内容,图中展示的是获取第一页内容,效果图后附上代码:效果图如下: 1 /// <summary> 2 /// 按页加载Word 3 /// </summary> 4 /// <param name="flowDoc"></param> 5 /// <param name="filename&q

WPF RichTextBox Flowdocment如何实现自动分页?

需求说明:在不需要Office组件的前提下,利用WPF展现技术.OpenXMLSDK实现Word文档的新建.编辑,只保留基本功能即可,最重要的是要能够根据内容实现自动分页,也要支持手动分页; 最开始,从实现角度考虑,WPF+RichTextBox展现,然后内容通过FlowDocment.Load来加载Word文档,先来看下效果: 那么问题来了,界面中只有一个RichTextBox控件,展示的时候怎么进行分页显示,类似Office Word窗口效果一样呢?怎么实现? 我们都知道Office2007

wpf richtextbox

[转载]WPF操作RichTextBox(转) (2013-03-26 21:59:48) 转载▼ 标签: 转载   原文地址:WPF操作RichTextBox(转)作者: 笨笨发 取出richTextBox里面的内容第一种方法:将richTextBox的内容以字符串的形式取出string xw = System.Windows.Markup.XamlWriter.Save(richTextBox.Document);第二种方法:将richTextBox的类容以二进制数据的方法取出FlowDoc

WPF RichTextBox 禁止换行

原文:WPF RichTextBox 禁止换行 这个问题困扰了好久,进过不断的努力,终于解决了 ? ??????? <RichTextBox Margin="0,44,10,0" Name="codeText" VerticalScrollBarVisibility="Auto" HorizontalScrollBarVisibility="Auto" HorizontalAlignment="Right&qu

WPF RichTextBox 插入换行 移动光标

原文:WPF RichTextBox 插入换行 移动光标 第一次使用的方法是: richTextBox1.CaretPosition.InsertLineBreak(); richTextBox1.CaretPosition = richTextBox1.CaretPosition.GetNextInsertionPosition(LogicalDirection.Forward); richTextBox1.Focus(); 改方法在win7下正常.但是在win10下,当输入汉字的时候,虽然光

WPF RichTextBox 控件常用方法和属性

以下内容转自 http://blog.csdn.net/yulongguiziyao/article/details/25330551. 1. 取得已被选中的内容: (1)使用 RichTextBox.Document.Selection属性(2)访问RichTextBox.Document.Blocks属性的“blocks”中的Text2. 在XAML中增加内容给RichTextBox:<RichTextBox IsSpellCheckEnabled="True">  

WPF RichTextBox滚动条自动滚动实例、文本自动滚动实例

说明:1.后台代码添加测试 数据 2.使用 richTextBox.ScrollToVerticalOffset()方法,滚动竖直方向滚动条位置 3.使用定时器DispatcherTimer,修改页面显示数据 4.自己计算处理,已经滚动的高度位置 Xaml代码: <Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="205*"/> <ColumnDefinition Width=&qu

WPF RichTextBox 如何滚动到光标所在位置、滚动条操作

1.获取当前滚动条位置 //获取当前滚动条位置 richTextBox.VerticalOffset; richTextBox.HorizontalOffset; //获取当前光标位置 richTextBox.CaretPosition 2.滚动到开始,结束,指定位置 // // 摘要: // 将编辑控件的视图设置为内容的末尾. public void ScrollToEnd(); // // 摘要: // 将编辑控件的 " 视图到视区的开头. public void ScrollToHome(