FlowDocument 【WPF】

小林野夫發表於2024-03-27

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 元素通常用作在螢幕上呈現的內容的直接容器。例如,一個 ParagraphBlock 元素)可包含一個 RunInline 元素),而 Run 實際包含在螢幕上呈現的文字。

Run

Run 用於包含無格式文字。

您可能預期 Run 物件會在流內容中廣泛使用,不過,在標記中不需要顯式使用 Run 元素。

Span

Span 將其他 Inline 內容元素組織到一起。

對於 Span 元素中的內容,不應用任何繼承呈現。

但是,從 Span 繼承的元素(包括 HyperlinkBoldItalic Underline)確實會向文字應用格式。

InlineUIContainer

InlineUIContainer 使 UIElement 元素(即像 Button 這樣的控制元件)能夠嵌入到 Inline 內容元素中。

是與BlockUIContainer 等效的 Inline 元素。

Figure Floater

透過 Figure Floater,可以使用定位屬性在流文件中嵌入內容,這些定位屬性可獨立於主內容流進行自定義。

Figure Floater 元素通常用於突出顯示或強調內容的某些部分、在主內容流中承載支援影像或其他內容、或者插入不密切相關的內容(例如廣告)。

Figure

· 可定位:可以設定其水平和垂直定位點,以便相對於頁面、內容、欄或段落進行停靠。還可以使用其 HorizontalOffset VerticalOffset 屬性指定任意偏移量。

· 可將其大小調整為欄大小的幾倍:可以將 Figure 的高度和寬度設定為頁面、內容或欄的高度或寬度的倍數。請注意,對於頁面和內容,倍數不能大於 1。例如,可以將 Figure 的寬度設定為頁面的 0.5 內容的 0.25 欄的 2 。還可以將高度和寬度設定為絕對畫素值。

· 不分頁:如果 Figure 中的內容無法容納在 Figure 內部,它會呈現能夠容納的內容部分,而其餘內容將丟失

Floater

· 無法定位,可在能夠為其提供空間的任何位置呈現。不能設定偏移量或錨定 Floater

· 不能將其大小設定為欄大小的幾倍:預設情況下,Floater 的大小為一個欄大小。它有一個可設定為絕對畫素值的 Width 屬性,但是如果此值大於一個欄寬,則將其忽略並將浮動物件的大小設定為一個欄大小。可以透過設定正確的畫素寬度,將其大小設定為小於一個欄大小,但不能相對於欄調整大小,因此欄的 0.5 不是 Floater 寬度的有效表示式。Floater 沒有高度屬性,因此無法設定其高度;其高度取決於內容。

· Floater 分頁:如果指定寬度的內容超出了一個欄的高度,則浮動物件會斷開並顯示到下一欄、下一頁中等等。

如果希望控制大小和定位,並且確信內容適合於指定的大小,那麼 Figure 非常適合於放置獨立內容。Floater 適合放置流動方式與主頁內容類似但獨立於主頁內容的、具有更大流動自由度的內容。

LineBreak

LineBreak 導致在流內容中發生換行。

內容架構

相關文章