FlowDocument,先給大家看看官方的定義:
流文件旨在根據視窗大小、裝置解析度和其他環境變數來“重排內容”。 此外,流文件還具有很多內建功能,包括搜尋、能夠最佳化可讀性的檢視模式以及更改字型大小和外觀的功能。 當易讀性是文件的主要使用要求時,最適合使用流文件。
我個人理解的流文件主要是為了解決那些需要對文字內容排列布局、新增圖片、放大縮小等使用場景。因此需要先了解流文件的內容格式。先來看看官方給出的模型:
在這裡插入圖片描述
藍色背景為Block(塊級元素)就是FlowDocument內的主要元素,一篇文章的主要構成為一個個的段落,我個人的理解是Block級別元素就是段落,FlowDocument主要包括Paragarph(章節)、Section(區域)、List(列表)、Table(表格)、BolckUIContainer(塊級別UI容器)。
綠色背景的Inline(內聯元素)是Block裡的主力,用於承載需要輸入的內容。這裡就不再展開了,大家可以自己去動手試試。
黃色背景的UIElement對應的是具體的UI控制元件。
FlowDocument結構應該清晰了吧,FlowDocment可以包含多個Block,Block裡面可以包含多個Inline。這很顯然是一個的盒子結構(一層套著一層)。
介紹完流文件之後,我們重新回到RichTextBox,內部是由FlowDocument構成的,當我們使用MVVM模式時,我們需要將流文件的內容與具體的變數做繫結,以達到實時讀取和修改的能力。因為RichTextBox控制元件中Document屬性是不支援繫結的,所以需要對控制元件重寫。透過新增附加屬性的方式為Document新增繫結。
Block 派生類:
Paragraph |
Paragraph 通常用於將內容分組到一個段落中。Paragraph 的最簡單且最常見的用途是建立文字段落。 |
Section |
Section 只用於包含其他 Block 派生元素。 它不會向其中包含的元素應用任何預設格式。不過,在 Section 上設定的任何屬性值都適用於其子元素。使用節能夠以程式設計方式迴圈訪問其子級的集合。 Section 的使用方式類似於 HTML 中的 <DIV> 標記。 |
BlockUIContainer |
使 UIElement 元素(例如 Button)能夠嵌入到 Block 派生的流內容中。 |
List |
List 用於建立專案符號列表或編號列表。 將 MarkerStyle 屬性設定為 TextMarkerStyle 列舉值可確定列表的樣式。 |
Table |
Table 用於建立表。 Table 類似於 Grid 元素,但是它具有更多功能 |
Inline 派生類:
Inline 元素通常用作在螢幕上呈現的內容的直接容器。例如,一個 Paragraph(Block 元素)可包含一個 Run(Inline 元素),而 Run 實際包含在螢幕上呈現的文字。
Run |
Run 用於包含無格式文字。 您可能預期 Run 物件會在流內容中廣泛使用,不過,在標記中不需要顯式使用 Run 元素。 |
||||
Span |
Span 將其他 Inline 內容元素組織到一起。 對於 Span 元素中的內容,不應用任何繼承呈現。 但是,從 Span 繼承的元素(包括 Hyperlink、Bold、Italic 和 Underline)確實會向文字應用格式。 |
||||
InlineUIContainer |
InlineUIContainer 使 UIElement 元素(即像 Button 這樣的控制元件)能夠嵌入到 Inline 內容元素中。 是與BlockUIContainer 等效的 Inline 元素。 |
||||
Figure 和 Floater |
透過 Figure 和 Floater,可以使用定位屬性在流文件中嵌入內容,這些定位屬性可獨立於主內容流進行自定義。 Figure 或 Floater 元素通常用於突出顯示或強調內容的某些部分、在主內容流中承載支援影像或其他內容、或者插入不密切相關的內容(例如廣告)。
如果希望控制大小和定位,並且確信內容適合於指定的大小,那麼 Figure 非常適合於放置獨立內容。Floater 適合放置流動方式與主頁內容類似但獨立於主頁內容的、具有更大流動自由度的內容。 |
||||
LineBreak |
LineBreak 導致在流內容中發生換行。 |
內容架構