Sdílet prostřednictvím


Kreslení formátovaného textu

Toto téma obsahuje přehled funkcí objektu FormattedText . 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 displayed using FormattedText object

Poznámka:

Pro ty vývojáře, kteří migrují z rozhraní API Win32, obsahuje tabulka v části Migrace Win32 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 by se měl použít v případě, TextBlock že 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 ve 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.

Objekt je navíc 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

Chcete-li vytvořit formátovaný text, zavolejte FormattedText konstruktor k vytvoření objektu FormattedText . Po vytvoření počátečního formátovaného textového řetězce můžete použít rozsah stylů formátování.

MaxTextWidth Vlastnost slouží k omezení textu na určitou šířku. Text se automaticky zalomí, aby nepřekračoval zadanou šířku. MaxTextHeight Vlastnost použijte k omezení textu na určitou výšku. Text zobrazí tři tečky, "..." pro text, který překračuje zadanou výšku.

Text displayed with wordwrap and ellipsis.

U jednoho nebo více znaků můžete použít více stylů formátování. Můžete například volat jak metody SetFontSizeSetForegroundBrush , tak i změnit formátování prvních pěti znaků v textu.

Následující příklad kódu vytvoří FormattedText objekt 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 FormattedText Windows Presentation Foundation (WPF) používá objekt 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 Geometry objekty, což vám umožní vytvářet další typy vizuálně zajímavého textu. Můžete například vytvořit Geometry objekt založený na obrysu textového řetězce.

Text outline using a linear gradient brush

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 with different colors for fill and stroke

Text with image brush applied to stroke

Text with image brush applied to stroke and highlight

Když je text převeden na Geometry objekt, 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 naleznete v tématu Vytvoření obrysu textu.

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

Následující příklad ukazuje formátovaný text, který byl převeden na PathGeometry objekt. Animované tři tečky se řídí cestou tahů vykresleného textu.

Sphere following the path geometry of text
Sphere za geometrií dráhy textu

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

Po převodu na PathGeometry objekt můžete vytvořit další zajímavé použití pro formátovaný text. Video můžete například vystřihot, abyste ho mohli zobrazit.

Video displaying in the path geometry of text

Migrace Win32

Funkce FormattedText pro kreslení textu 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 Notes
DT_BOTTOM Height Height Pomocí vlastnosti vypočítat odpovídající pozici Win32 DrawText 'y'.
DT_CALCRECT Height, Width K výpočtu výstupního obdélníku použijte vlastnosti Height a Width vlastnosti.
DT_CENTER TextAlignment TextAlignment Použijte vlastnost s hodnotou nastavenou na Center.
DT_EDITCONTROL Nic Nepovinné. Šířka mezery a vykreslení posledního řádku jsou stejné jako v ovládacím prvku pro úpravy architektury.
DT_END_ELsada LIP SIS Trimming Trimming Použijte vlastnost s hodnotou CharacterEllipsis.

Umožňuje WordEllipsis získat Win32 DT_END_ELsada LIP SIS s koncovými tečkami DT_WORD_Esada LIP SIS – v tomto případě se tři tečky znaků vyskytují jenom u slov, která se nevejdou na jeden řádek.
DT_EXPAND_TABS Nic Nepovinné. 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 Nic Nepovinné. Vnější úvodní čáry jsou vždy zahrnuty do řádkování. LineHeight Pomocí vlastnosti můžete vytvořit řádkování definované uživatelem.
DT_HIDEPREFIX Nic Nepodporováno Před sestavením FormattedText objektu odeberte z řetězce znak '&'.
DT_LEFT TextAlignment Toto je výchozí zarovnání textu. TextAlignment Použijte vlastnost s hodnotou nastavenou na Left. (pouze WPF)
DT_MODIFYSTRING Nic Nepodporováno
DT_NOCsada LIP VisualClip Výřez se neprovádí automaticky. Pokud chcete vystřižovat text, použijte VisualClip tuto vlastnost.
DT_NOFULLWIDTHCHARBREAK Nic Nepodporováno
DT_NOPREFIX Nic Nepovinné. Znak &' v řetězcích je vždy považován za normální znak.
DT_PATHELsada LIP SIS Nic Trimming Použijte vlastnost s hodnotou WordEllipsis.
DT_PREFIX Nic Nepodporováno Pokud chcete použít podtržítka pro text, například klávesu akcelerátoru nebo odkaz, použijte metodu SetTextDecorations .
DT_PREFIXONLY Nic Nepodporováno
DT_RIGHT TextAlignment TextAlignment Použijte vlastnost s hodnotou nastavenou na Right. (pouze WPF)
DT_RTLREADING FlowDirection Nastavte vlastnost FlowDirection na RightToLeft.
DT_SINGLELINE Nic Nepovinné. FormattedText objekty se chovají jako jeden řádek, pokud MaxTextWidth není nastavena vlastnost nebo text neobsahuje návratový znak řádku nebo informační kanál řádku (CR/LF).
DT_TABSTOP Nic Nepodporuje uživatelsky definované pozice zarážky tabulátoru.
DT_TOP Height Nepovinné. Hlavní odůvodnění je výchozí. Další svislé hodnoty umístění lze definovat pomocí Height vlastnosti pro výpočet odpovídající pozice Win32 DrawText y.
DT_VCENTER Height Height Pomocí vlastnosti vypočítat odpovídající pozici Win32 DrawText 'y'.
DT_WORDBREAK Nic Nepovinné. K automatickému dělení slov dochází u FormattedText objektů. Nemůžete ho zakázat.
DT_WORD_ELsada LIP SIS Trimming Trimming Použijte vlastnost s hodnotou WordEllipsis.

Viz také