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" Name="Windowa"  Closed="MainWindow_OnClosed">
 5     <Grid Margin="0,0,2,0">
 6         <RichTextBox HorizontalAlignment="Left" FontSize="20" BorderBrush="Violet"    VerticalScrollBarVisibility="Auto"    Height="135" VerticalAlignment="Top" Width="802" Margin="10,374,0,0" Name="SendMessageRichTextBox">
 7             <FlowDocument Name="SendDocument">
 8                 <Paragraph Name="SendMessageParas">
 9                     <Run></Run>
10                 </Paragraph>
11             </FlowDocument>
12         </RichTextBox>
13         <RichTextBox HorizontalAlignment="Left"   AllowDrop="True" VerticalScrollBarVisibility="Auto" Height="348" IsReadOnly="True" VerticalAlignment="Top" Width="802" Margin="10,10,0,0" Name="MessageRichTextBox">
14             <FlowDocument Name="MessageDocument">
15             </FlowDocument>
16         </RichTextBox>
17         <Button Content="瀏覽圖片" Name="BrowserButton" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="667,534,0,0" Click="BrowserButton_Click"/>
18         <Button Content="發送" Name="SendButton" HorizontalAlignment="Left" VerticalAlignment="Top" Width="75" Margin="752,534,0,0" Click="SendButton_Click"/>
19 
20     </Grid>
21 </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 BrowserButton_Click(object sender, RoutedEventArgs e)
 2         {
 3             try
 4             {
 5                 SendImage();
 6             }
 7             catch (Exception)
 8             {
 9 
10                 throw;
11             }
12         }

 

 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       private void SendMessage()
 2         {
 3             index = 0;
 4             //把richtextBox內容轉成字符串形式 
 5             // var strDoc = System.Windows.Markup.XamlWriter.Save(SendMessageRichTextBox.Document);
 6             var run = new Run("我:\t" + DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss"))
 7             {
 8                 Foreground = System.Windows.Media.Brushes.Green
 9             };
10             var msg = new Paragraph(run);
11             MessageDocument.Blocks.Add(msg);
12 
13             var blockCount = SendDocument.Blocks.Count;
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             }
34             else
35             {
36                 p = new Paragraph();
37                 foreach (var item in SendMessageParas.Inlines)
38                 {
39                     SetData(item);
40                 }
41                 MessageDocument.Blocks.Add(p);
42 
43             }
44             //清理塊
45             SendDocument.Blocks.Clear();
46             SendMessageParas = new Paragraph(new Run(""));
47             SendDocument.Blocks.Add(SendMessageParas);
48             MessageRichTextBox.ScrollToEnd();
49         }

 

 1         //設置數據
 2         private void SetData(Inline item)
 3         {
 4             if (item is Run)
 5             {
 6                 var text = (item as Run).Text;
 7                 if(string.IsNullOrWhiteSpace(text))return;
 8                 var r = new Run(text);
 9                 p.Inlines.Add(r);
10                 MessageDocument.Blocks.Add(p);
11             }
12             else if (item is Span)
13             {
14                 var s = item as Span;
15                 spans.Add(index, s);
16                 parasList.Add(p); index++;
17             }
18             else if (item is InlineUIContainer)
19             {
20                 var child = item as InlineUIContainer;
21                 var image = child.Child as Image;
22                 if (image == null) return;
23                 var img = new Image {Source = image.Source, Width = image.Width, Height = image.Height};
24                 p.Inlines.Add(img);
25                 MessageDocument.Blocks.Add(p);
26             }
27             else
28             {
29                 MessageDocument.Blocks.Add(p);
30 
31             }
32         }

 

 

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出現,所以會亂,目前還解決不了。額

  這是粘貼代碼后生成的xml

 

 1 <FlowDocument PagePadding="5,0,5,0" Name="SendDocument" AllowDrop="True" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation">
 2   <Paragraph Margin="0,0,0,0" FontFamily="Microsoft YaHei" FontSize="16">
 3     <Span Foreground="#FF000000" Background="#FFFFFFFF" xml:space="preserve">    </Span>
 4     <Span Foreground="#FF0000FF" Background="#FFFFFFFF">try</Span>
 5   </Paragraph>
 6   <Paragraph Margin="0,0,0,0" FontFamily="Microsoft YaHei" FontSize="16">
 7     <Span Foreground="#FF000000" Background="#FFFFFFFF" xml:space="preserve">            {</Span>
 8   </Paragraph>
 9   <Paragraph Margin="0,0,0,0" FontFamily="Microsoft YaHei" FontSize="16">
10     <Span Foreground="#FF000000" Background="#FFFFFFFF" xml:space="preserve">                SendMessage();</Span>
11   </Paragraph>
12   <Paragraph Margin="0,0,0,0" FontFamily="Microsoft YaHei" FontSize="16">
13     <Span Foreground="#FF000000" Background="#FFFFFFFF" xml:space="preserve">            }</Span>
14   </Paragraph>
15   <Paragraph Margin="0,0,0,0" FontFamily="Microsoft YaHei" FontSize="16">
16     <Span Foreground="#FF000000" Background="#FFFFFFFF" xml:space="preserve">            </Span>
17     <Span Foreground="#FF0000FF" Background="#FFFFFFFF">catch</Span>
18     <Span Foreground="#FF000000" Background="#FFFFFFFF"> (</Span>
19     <Span Foreground="#FF2B91AF" Background="#FFFFFFFF">Exception</Span>
20     <Span Foreground="#FF000000" Background="#FFFFFFFF">)</Span>
21   </Paragraph>
22   <Paragraph Margin="0,0,0,0" FontFamily="Microsoft YaHei" FontSize="16">
23     <Span Foreground="#FF000000" Background="#FFFFFFFF" xml:space="preserve">            {</Span>
24   </Paragraph>
25   <Paragraph Margin="0,0,0,0" FontFamily="Microsoft YaHei" FontSize="16">
26     <Span Foreground="#FF000000" Background="#FFFFFFFF" xml:space="preserve">            }</Span>
27   </Paragraph>
28   <Paragraph Name="SendMessageParas" />
29 </FlowDocument>

 

所以最后的結果是醬紫的:

 

 

 

 7.OK  說完了,補充一點:

 .NET技術交流群 199281001 .歡迎加入。

 覺得本文對你有所幫助,就點右下角推薦吧,謝謝。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM