Sdílet prostřednictvím


Kreslení naformátovaného textu

Toto téma obsahuje přehled funkcí FormattedText objektu. Tento objekt poskytuje ovládací prvek nízké úrovně pro kreslení textu v aplikacích WINDOWS Presentation Foundation (WPF).

Přehled technologií

Objekt FormattedText umožňuje nakreslit víceřádkový text, ve kterém může být každý znak textu individuálně formátován. Následující příklad ukazuje text s několika použitými formáty.

Text zobrazený pomocí objektu FormattedText

Poznámka

Pro ty vývojáře, kteří migrují z rozhraní API Win32, jsou v tabulce v části migrace Win32 uvedeny příznaky Win32 DrawText a přibližný ekvivalent ve Windows Presentation Foundation (WPF).

Důvody použití formátovaného textu

WPF obsahuje více ovládacích prvků pro kreslení textu na obrazovku. Každý ovládací prvek se zaměřuje na jiný scénář a má vlastní seznam funkcí a omezení. Obecně platí, že prvek TextBlock by se měl použít, pokud je vyžadována omezená podpora textu, například stručná věta v uživatelském rozhraní. Label lze použít v případě, že je vyžadována minimální podpora textu. Další informace naleznete v tématu Dokumenty WPF.

Objekt FormattedText poskytuje větší funkce formátování textu než textové ovládací prvky WPF (Windows Presentation Foundation) a může být užitečné v případech, kdy chcete text použít jako dekorativní prvek. Další informace naleznete v následující části Převod formátovaného textu na geometrii.

Kromě toho je objekt FormattedText užitečný pro vytváření textově orientovaných DrawingVisual-odvozených objektů. DrawingVisual je jednoduchá třída kreslení, která se používá k vykreslení obrazců, obrázků nebo textu. Další informace naleznete v tématu Hit Test using DrawingVisuals Sample.

Použití objektu FormattedText

Pokud chcete vytvořit formátovaný text, zavolejte konstruktor FormattedText a vytvořte objekt FormattedText. Po vytvoření počátečního formátovaného textového řetězce můžete použít rozsah stylů formátování.

Vlastnost MaxTextWidth použijte k omezení textu na konkrétní šířku. Text se automaticky zalomí, aby nepřekračoval zadanou šířku. Vlastnost MaxTextHeight použijte k omezení textu na určitou výšku. Text zobrazí elipsu, "…" pro text, který překračuje určenou výšku.

Text zobrazený pomocí wordwrapu a tří teček.

U jednoho nebo více znaků můžete použít více stylů formátování. Můžete například volat oba metody SetFontSize a SetForegroundBrush, které změní formátování prvních pěti znaků v textu.

Následující příklad kódu vytvoří objekt FormattedText a pak na text použije několik stylů formátování.

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));
}
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

Měrná jednotka velikosti písma

Stejně jako u jiných textových objektů v aplikacích WPF (Windows Presentation Foundation) používá objekt FormattedText jako měrnou jednotku pixely nezávislé na zařízení. Většina aplikací Win32 ale používá body jako měrnou jednotku. Pokud chcete použít zobrazovaný text v jednotkách bodů v aplikacích Windows Presentation Foundation (WPF), musíte převést jednotky nezávislé na zařízení (1/96 palce na jednotku) na body. Následující příklad kódu ukazuje, jak provést tento převod.

// 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)

Převod formátovaného textu na geometrii

Formátovaný text můžete převést na objekty Geometry, což vám umožní vytvářet další typy vizuálně zajímavého textu. Můžete například vytvořit objekt Geometry na základě obrysu textového řetězce.

obrys textu pomocí lineárního přechodového štětce

Následující příklady ilustrují několik způsobů, jak vytvořit zajímavé vizuální efekty úpravou tahu, výplně a zvýraznění převedeného textu.

Text s různými barvami pro výplň a tah

Text s obrázkovým štětcem použitým na tah

Text s obrázkovým štětcem aplikovaným na tah a zvýraznění

Když je text převeden na objekt Geometry, už se nejedná o kolekci znaků – znaky v textovém řetězci nelze upravovat. Vzhled převedeného textu ale můžete ovlivnit úpravou jeho vlastností tahu a výplně. Tah odkazuje na obrys převedeného textu; výplň odkazuje na oblast uvnitř obrysu převedeného textu. Další informace viz Vytvoření textu s obrysem.

Formátovaný text můžete také převést na objekt PathGeometry a použít ho ke zvýraznění textu. Můžete například použít animaci na objekt PathGeometry tak, aby animace následuje obrys formátovaného textu.

Následující příklad ukazuje formátovaný text, který byl převeden na objekt PathGeometry. Animovaná elipsa následuje cestu tahů vykresleného textu.

Koule podél dráhy textu podle geometrie
Koule sledující geometrii dráhy textu

Další informace naleznete v tématu Postupy: Vytvoření animace PathGeometry pro text.

Po převodu na objekt PathGeometry můžete vytvořit další zajímavé způsoby formátování textu. Video můžete například vystřihnout, aby se zobrazilo uvnitř.

Video zobrazující geometrii cesty textu

Migrace Win32

Funkce FormattedText pro kreslicí text jsou podobné funkcím funkce Win32 DrawText. Pro ty vývojáře, kteří migrují z rozhraní API Win32, uvádí následující tabulka příznaky Win32 DrawText a přibližný ekvivalent ve Windows Presentation Foundation (WPF).

Příznak DrawText Ekvivalent WPF Poznámky
DT_BOTTOM Height Použijte vlastnost Height k výpočtu odpovídající pozice 'y' pro funkci Win32 DrawText.
DT_CALCRECT Height, Width K výpočtu výstupního obdélníku použijte vlastnosti Height a Width.
DT_CENTER TextAlignment Použijte vlastnost TextAlignment s hodnotou nastavenou na Center.
DT_EDITCONTROL Žádný Nevyžaduje se. Šířka mezery a vykreslení posledního řádku jsou stejné jako v ovládacím prvku pro úpravy v rámci.
Ukončení s elipsou Trimming Použijte vlastnost Trimming s hodnotou CharacterEllipsis.

Pomocí WordEllipsis získáte Win32 DT_END_ELLIPSIS s DT_WORD_ELIPSIS koncovým třímístným znakem – v tomto případě se znak tří teček objevuje pouze u slov, která se nevejdou na jeden řádek.
DT_EXPAND_TABS Žádný Nevyžaduje se. Tabulátory se automaticky rozbalí tak, aby zastavovaly každých 4 ems, což je přibližně šířka 8 znaků nezávislých na jazyce.
DT_EXTERNALLEADING Žádný Nevyžaduje se. Vnější úvodní čáry jsou vždy zahrnuty do řádkování. Pomocí vlastnosti LineHeight vytvořte uživatelsky definované řádkování.
DT_HIDEPREFIX Žádný Nepodporuje se. Před vytvořením objektu FormattedText odeberte z řetězce&.
DT_LEFT TextAlignment Toto je výchozí zarovnání textu. Použijte vlastnost TextAlignment s hodnotou nastavenou na Left. (pouze WPF)
DT_MODIFYSTRING Žádný Nepodporuje se.
DT_NOCLIP VisualClip Výřez se neprovádí automaticky. Pokud chcete vystřižovat text, použijte vlastnost VisualClip.
DT_NOFULLWIDTHCHARBREAK Žádný Nepodporuje se.
DT_NOPREFIX Žádný Nevyžaduje se. Znak&v řetězcích se vždy považuje za normální znak.
DT_PATHELLIPSIS Žádný Použijte vlastnost Trimming s hodnotou WordEllipsis.
DT_PREFIX Žádný Nepodporuje se. Pokud chcete použít podtržítka pro text, například klávesu akcelerátoru nebo odkaz, použijte metodu SetTextDecorations.
DT_PREFIXONLY Žádný Nepodporuje se.
DT_RIGHT TextAlignment Použijte vlastnost TextAlignment s hodnotou nastavenou na Right. (pouze WPF)
DT_RTLREADING FlowDirection Nastavte vlastnost FlowDirection na RightToLeft.
DT_SINGLELINE Žádný Nevyžaduje se. FormattedText objekty se chovají jako ovládací prvek s jedním řádkem, pokud není nastavena vlastnost MaxTextWidth nebo text obsahuje návratový znak řádku nebo informační kanál řádku (CR/LF).
DT_TABSTOP Žádný Nepodporuje uživatelsky definované pozice zarážky tabulátoru.
DT_TOP Height Nevyžaduje se. Hlavní odůvodnění je výchozí. Další svislé hodnoty umístění lze definovat pomocí vlastnosti Height pro výpočet odpovídající pozice Win32 DrawText y.
DT_VCENTER Height Pomocí vlastnosti Height vypočítat odpovídající pozici Win32 DrawText y.
DT_WORDBREAK Žádný Nevyžaduje se. K dělení slov dochází automaticky s objekty FormattedText. Nemůžete ho zakázat.
DT_WORD_ELLIPSIS Trimming Použijte vlastnost Trimming s hodnotou WordEllipsis.

Viz také