繪製格式化的文字
本主題概要說明 FormattedText 物件的功能。 這個物件提供在 Windows Presentation Foundation (WPF) 應用程式中繪製文字的低階控制項。
這個主題包含下列章節。
- 技術概觀
- 使用 FormattedText 物件
- Win32 移轉
- 相關主題
技術概觀
FormattedText 物件可讓您繪製多行文字,文字中的每個字元都可以個別格式化。 下列範例顯示已套用幾種格式的文字。
使用 FormattedText 方法的顯示文字
注意事項 |
---|
Win32 移轉一節為從 Win32 API 進行移轉的程式開發人員,列出 Win32 DrawText 旗標和 Windows Presentation Foundation (WPF) 中的近似對等項目。 |
使用格式化文字的原因
WPF 包含多個將文字繪製至螢幕的控制項。 每個控制項都鎖定不同的案例,而且擁有自己的功能與限制清單。 一般而言,在需要有限的文字支援 (例如user interface (UI) 中的簡短句子) 時,應該使用 TextBlock 項目。 而在需要最少文字支援時,則可使用 Label。 如需詳細資訊,請參閱 WPF 中的文件。
FormattedText 物件提供的文字格式化功能比 Windows Presentation Foundation (WPF) 文字控制項更強大,而且在您想要使用文字做為裝飾項目的情況下十分有用。如需詳細資訊,請參閱後面的將格式化文字轉換為幾何圖案一節。
此外,FormattedText 物件適合用來建立文字導向的 DrawingVisual 衍生物件。 DrawingVisual 為輕量型繪圖類別,可用於呈現圖案、影像或文字。 如需詳細資訊,請參閱使用 DrawingVisual 進行點擊測試範例 (英文)。
使用 FormattedText 物件
若要建立格式化文字,請呼叫 FormattedText 建構函式建立 FormattedText 物件。 建立初始格式化文字字串之後,就可以套用某個範圍的格式化樣式。
請使用 MaxTextWidth 屬性將文字限制為特定寬度。 文字將會自動換行,以避免超過指定的寬度。 請使用 MaxTextHeight 屬性將文字限制為特定高度。 超過指定高度的文字將會顯示省略符號 "…"。
顯示自動換行和自略符號的顯示文字
您可以將多個格式化樣式套用至一個或多個字元。 例如,您可以同時呼叫 SetFontSize 和 SetForegroundBrush 方法,變更文字前五個字元的格式。
下列程式碼範例會建立 FormattedText 物件,並在文字上套用幾個格式化樣式。
Protected Overrides Sub OnRender(ByVal drawingContext As DrawingContext)
Dim testString As String = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor"
' Create the initial formatted text string.
Dim formattedText As New FormattedText(testString, CultureInfo.GetCultureInfo("en-us"), FlowDirection.LeftToRight, New Typeface("Verdana"), 32, Brushes.Black)
' Set a maximum width and height. If the text overflows these values, an ellipsis "..." appears.
formattedText.MaxTextWidth = 300
formattedText.MaxTextHeight = 240
' Use a larger font size beginning at the first (zero-based) character and continuing for 5 characters.
' The font size is calculated in terms of points -- not as device-independent pixels.
formattedText.SetFontSize(36 * (96.0 / 72.0), 0, 5)
' Use a Bold font weight beginning at the 6th character and continuing for 11 characters.
formattedText.SetFontWeight(FontWeights.Bold, 6, 11)
' Use a linear gradient brush beginning at the 6th character and continuing for 11 characters.
formattedText.SetForegroundBrush(New LinearGradientBrush(Colors.Orange, Colors.Teal, 90.0), 6, 11)
' Use an Italic font style beginning at the 28th character and continuing for 28 characters.
formattedText.SetFontStyle(FontStyles.Italic, 28, 28)
' Draw the formatted text string to the DrawingContext of the control.
drawingContext.DrawText(formattedText, New Point(10, 0))
End Sub
protected override void OnRender(DrawingContext drawingContext)
{
string testString = "Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor";
// Create the initial formatted text string.
FormattedText formattedText = new FormattedText(
testString,
CultureInfo.GetCultureInfo("en-us"),
FlowDirection.LeftToRight,
new Typeface("Verdana"),
32,
Brushes.Black);
// Set a maximum width and height. If the text overflows these values, an ellipsis "..." appears.
formattedText.MaxTextWidth = 300;
formattedText.MaxTextHeight = 240;
// Use a larger font size beginning at the first (zero-based) character and continuing for 5 characters.
// The font size is calculated in terms of points -- not as device-independent pixels.
formattedText.SetFontSize(36 * (96.0 / 72.0), 0, 5);
// Use a Bold font weight beginning at the 6th character and continuing for 11 characters.
formattedText.SetFontWeight(FontWeights.Bold, 6, 11);
// Use a linear gradient brush beginning at the 6th character and continuing for 11 characters.
formattedText.SetForegroundBrush(
new LinearGradientBrush(
Colors.Orange,
Colors.Teal,
90.0),
6, 11);
// Use an Italic font style beginning at the 28th character and continuing for 28 characters.
formattedText.SetFontStyle(FontStyles.Italic, 28, 28);
// Draw the formatted text string to the DrawingContext of the control.
drawingContext.DrawText(formattedText, new Point(10, 0));
}
字型大小測量單位
如同 Windows Presentation Foundation (WPF) 應用程式中的其他文字物件,FormattedText 物件也會使用與裝置無關的像素做為測量單位。 不過,大部分的 Win32 應用程式都會使用點做為測量單位。 如果您想在 Windows Presentation Foundation (WPF) 應用程式中使用以點為單位的顯示文字,必須將device-independent units (1/96th inch per unit) 轉換為點。 下列程式碼範例示範如何執行這個轉換動作。
' The font size is calculated in terms of points -- not as device-independent pixels.
formattedText.SetFontSize(36 * (96.0 / 72.0), 0, 5)
// The font size is calculated in terms of points -- not as device-independent pixels.
formattedText.SetFontSize(36 * (96.0 / 72.0), 0, 5);
將格式化文字轉換為幾何圖案
您可以將格式化文字轉換為 Geometry 物件,以便建立具有有趣外觀的其他文字類型。 例如,您可以根據文字字串的外框來建立 Geometry 物件。
使用線形漸層筆刷的文字外框
下列範例說明藉由修改轉換文字的筆劃、填滿和反白顯示,建立有趣視覺效果的多個方法。
將筆劃和填滿設定為不同色彩的範例
在筆劃上套用影像筆刷的範例
在筆劃和反白顯示上套用影像筆刷的範例
將文字轉換為 Geometry 物件後,文字就不再是字元的集合,因此您無法修改文字字串中的字元。 不過,您可以透過修改轉換後文字的描邊和填滿屬性,影響文字的外觀。 描邊是指轉換後文字的外框,填滿則是指轉換後文字之外框內的區域。 如需詳細資訊,請參閱 HOW TO:建立外框文字。
您也可以將格式化文字轉換為 PathGeometry 物件,然後使用這個物件來反白顯示文字。 例如,您可以將動畫套用至 PathGeometry 物件,讓動畫沿著格式化文字的外框行進。
下列範例顯示已轉換為 PathGeometry 物件的格式化文字。 動畫中顯示的橢圓形會沿著呈現文字的描邊路徑行進。
沿著文字路徑幾何行進的球體
如需詳細資訊,請參閱 HOW TO:建立文字的 PathGeometry 動畫。
將格式化文字轉換為 PathGeometry 文字之後,您就可以建立格式化文字的其他有趣用法。 例如,您可以裁剪視訊以便在格式化文字內顯示。
文字路徑幾何中顯示的視訊
Win32 移轉
用來繪製文字的 FormattedText 功能與 Win32 DrawText 函式的功能類似。 下表針對從 Win32 API 進行移轉的程式開發人員,列出 Win32 DrawText 旗標和 Windows Presentation Foundation (WPF) 中的近似對等項目。
DrawText 旗標 |
WPF 對等用法 |
備註 |
---|---|---|
DT_BOTTOM |
請使用 Height 屬性計算適當的 Win32 DrawText 'y' 位置。 |
|
DT_CALCRECT |
||
DT_CENTER |
請使用 TextAlignment 屬性,並將值設定為 Center。 |
|
DT_EDITCONTROL |
無 |
不需要 空間寬度和最後一行呈現與架構編輯控制項相同。 |
DT_END_ELLIPSIS |
請使用值為 CharacterEllipsis 的 Trimming 屬性。 請使用 WordEllipsis 取得 Win32 DT_END_ELLIPSIS 與 DT_WORD_ELIPSIS 結尾省略符號;在這種情況下,字元省略符號只會出現在無法以單行顯示的文字。 |
|
DT_EXPAND_TABS |
無 |
不需要 定位點會自動擴展成每隔 4 em (約等於 8 個語言無關字元的寬度) 停駐一次。 |
DT_EXTERNALLEADING |
無 |
不需要 行距中一律包含外部前置字元。 請使用 LineHeight 屬性建立使用者定義的行距。 |
DT_HIDEPREFIX |
無 |
不支援。 建構 FormattedText 物件之前,請先從字串移除 '&'。 |
DT_LEFT |
這是預設文字對齊方式。 請使用 TextAlignment 屬性,並將值設定為 Left (僅適用於 WPF)。 |
|
DT_MODIFYSTRING |
無 |
不支援。 |
DT_NOCLIP |
裁剪動作不會自動執行。 如果要裁剪文字,請使用 VisualClip 屬性。 |
|
DT_NOFULLWIDTHCHARBREAK |
無 |
不支援。 |
DT_NOPREFIX |
無 |
不需要 字串中的 '&' 字元一律當做一般字元處理。 |
DT_PATHELLIPSIS |
無 |
請使用值為 WordEllipsis 的 Trimming 屬性。 |
DT_PREFIX |
無 |
不支援。 如果要在文字 (例如快速鍵或連結) 中使用底線,請使用 SetTextDecorations 方法。 |
DT_PREFIXONLY |
無 |
不支援。 |
DT_RIGHT |
請使用 TextAlignment 屬性,並將值設定為 Right (僅適用於 WPF)。 |
|
DT_RTLREADING |
將 FlowDirection 屬性設為 RightToLeft。 |
|
DT_SINGLELINE |
無 |
不需要 除非設定 MaxTextWidth 屬性或是文字中包含歸位字元/換行字元 (CR/LF),否則 FormattedText 物件的運作方式與單行控制項相同。 |
DT_TABSTOP |
無 |
不支援使用者定義的定位停駐點 (Tab Stop) 位置。 |
DT_TOP |
不需要 預設為靠上對齊。 透過使用 Height 屬性計算適當的 Win32 DrawText 'y' 位置,即可定義其他垂直定位值。 |
|
DT_VCENTER |
請使用 Height 屬性計算適當的 Win32 DrawText 'y' 位置。 |
|
DT_WORDBREAK |
無 |
不需要 FormattedText 物件可自動斷字。 您不能停用它。 |
DT_WORD_ELLIPSIS |
請使用值為 WordEllipsis 的 Trimming 屬性。 |