XAML.cz Magazín moderních technologií založených na XAML

Novinky ve WPF 4 – TextFormattingMode

Napsáno pro WPF od Jarda Jirava  [10.08.2010]

Dnešním článkem se dostávám k jednomu ze zásadních vylepšení, alespoň z pohledu Line Of Business aplikací, jenž nám nové WPF verze 4 přineslo. Už v minulém článku jsem se zmiňoval o Layout roundingu a dnes se chci věnovat použití TextFormattingMode.

Jak mnozí zřejmě vědí, vykreslování textu ve WPF bylo od počátku velice rozmazané. Což zapřičiňovalo to, že text, se stejně jako ostatní vykreslování snažilo být univerzální a z pohledu WPF snadno manipulovatelné. To znamená, že se hojně využívalo vykreslování přes subpixely a jak jsme si naznačili právě v minulém článku, to s sebou nese své nepříjemné stránky.

WPF team se tak rozhodl tohoto nešvaru zbavit a kompletně přepsal text stack do DirectWrite. Co to znamená v praxi, že veškterý text a jeho umístění je počítání stejně, nebo velice obdobně, jako by bylo použito GDI (tzv. WPF GDI comptatibility režim). Pokud tak nyní srovnáte text například ve Visual Studio 2008 a ve Visual Studio 2010 neměli byste, až na pár drobných výjimek, najít rozdíl.

TextOptions.TextFormattingMode

TextOptions.TextFormattingMode je attached vlastnost používaná právě pro přepínání způsobu vykreslování textu. Na výběr tak máme ze dvou možností a nastavení na rodiči se pak propaguje níže na jeho všechny potomky, dokud toto nastavení nezměníme.

Ideal

První možnost je nazvaná Ideal a někoho toto nastavení může zmást. Jedná se o původní způsob vykreslování textu, který využívá právě pozicování na subpixely.

Display

Je pak volbou pro ty, kteří chtějí využívat nového formátovacího způsobu, který je kompatibilní s GDI. To znamená, že všechny glyphy mají šířku dopočítanou na celé pixely a také pozicování je uzpůsobeno na vykreslení na celé pixely.

Jeden z výraznějších rozdílů, který můžete pozorovat oproti klasickému GDI vykreslování je pak zalamování řádků, které je počítáno odlišně ve WPF text stacku.

Použití TextFormattingMode

Na první pohled by se mohlo zdát, že není důvod nadále setrvávat u nastavení Ideal neboť vše důležité a pro uživatele příjemnější na dívání nám poskytne zobrazení pomocí vykreslení v modu Display. Tak jako vše má i toto vykreslování své kladné i záporné stránky. Pojďme se podívat na obě volby a co nám přináší.

V případě Ideal modu je to lepší rozložení a pozicování textu. Jestli si dobře pamatuji, tak je to shodný rozpal mezi jednotlivými znaky. Což však vede k tomu, že se text jeví více rozmazaně, neboť není na celých pixelech a jak jste mohli vidět minule, je tedy více šedý, to vede k horší čitelnosti, zejména u menších velikostí písma. Na druhé straně Display mod nám zajistí lepší a ostřejší vykreslení daného písma, avšak občas se nám může zdát, že je toto písmo neurovnané.

Občas se ale dostaneme do situace, kdy přesně nevíme, který mod zvolit, abychom dosáhli lepšího výsledku. Zkusím vám tedy předat několik doporučení, v jakých situacích co použít. Pokud svoji konkrétní situaci nenaleznete v tomto krátkém výčtu, pak doporučím vyzkoušet oba režimy a rozhodnout se, který je vhodnější, což může být občas velice subjektivní.

Ideal mod

Velké písmo – s narůstající velikostí písma se efekt rozmazaného písma zmenšuje a už od velikosti přibližně 15pt je možné používat tento mod. Hodně pak samozřejmě záleží i na typu zvoleného písma. Ale obecně se dá říci, že při větších velikostech písma se tento mod jeví úhlednější a dobře čitelný

Transformace textu – v případě, že chcete s textem provádět různé transformace, pak bude určitě lépe vypadat takto vykreslený text lépe v Ideal modu. Je to i tím, že právě pro tento účel byl zvolen daný algoritmus počítání a vykreslování textu. U Dispaly modu v případě transformací na textu dochází k nečekaným vybočením a deformacím, právě díky snaze dopočítat se na celé pixely.

Zoom textu – je vlastně jednou z transformací textu, kdy dochází k lineárnímu zvětšování nebo zmenšování. To je možné plynule provádět u Ideal modu. V případě Display modu tato transformace není lineární a nemusí to působit pěkně.

Kompozice v designu – v případech, kdy chceme text vhodně zakomponovat do nějakého designu, lépe působí text vykreslený právě při použití v modu Ideal, tady je to samozřejmě velice subjektivní hodnocení a záleží na konkrétním použití.

Display mod

Malé písmo – z předchozích odstavců pak jasně vyplývá, že použití modu Display je vhodné pro text, který je a bude nutné v naší aplikaci číst, bude jej hodně a nebo se bude jednat třeba jen o popisky v Line of Business aplikaci. V těchto případech je vhodné použít právě tento vykreslovací mod, který uživatelé znají z aplikací používajících GDI.

Před samotným závěrem pak nabízím ukázku různých velikostí a možností vykreslení s použitím probraného TextFormattingMode.

použití TextFormattingMode

A ještě ukázka kódu, jak jsem dospěl k tomuto výsledku:

<StackPanel>
        <TextBlock Padding="5">
                Ideal text formatting mode popisovaný na xaml.cz
        </TextBlock>
        <TextBlock TextOptions.TextFormattingMode="Display" Padding="5">
                Display text formatting mode popisovaný na xaml.cz
        </TextBlock>
        <TextBlock Padding="5" FontSize="20">
                Ideal text formatting mode popisovaný na xaml.cz
        </TextBlock>
        <TextBlock TextOptions.TextFormattingMode="Display" Padding="5" FontSize="20">
                Display text formatting mode popisovaný na xaml.cz
        </TextBlock>
        <TextBlock Padding="5" Text="Ideal text formatting mode popisovaný na xaml.cz">
                <TextBlock.RenderTransform>
                        <RotateTransform Angle="45" CenterX="20" CenterY="50" />
                </TextBlock.RenderTransform>
        </TextBlock>
        <TextBlock TextOptions.TextFormattingMode="Display" Padding="5">
                Display text formatting mode popisovaný na xaml.cz
                <TextBlock.RenderTransform>
                        <RotateTransform Angle="45" CenterX="20" CenterY="50" />
                </TextBlock.RenderTransform>
        </TextBlock>
</StackPanel>

Závěrem

Práce s textem se ve verzi WPF 4.0 hodně změnila a v současné chvíli tuto technologii považuji za konkurenceschopnou i v oblasti vývoje Line of Business aplikací. Samozřejmě je stále důležité se správně rozhodnout a mít na paměti především koncového uživatele a jeho způsob práce s naším programem, který by mu měl nejen poskytnout požadovanou funkcionalitu, ale také uživatelský zážitek z jeho snadného používání.

Na samotný závěr mám jedno malé doporučení. Nezapomínejte na to, že někteří uživatelé stále ještě mohou používat technologii monitorů CRT a tam se vykreslování textu chová odlišně. Obdobně se pak můžete setkat s nečekaným zjištěním u LCD monitorů v tzv. pivot režimu, kdy jsou najednou jednotlivé subpixely orientovány jinak.

Komentáře

ukládám komentář, vyčkejte prosím..
  1. David Procházka

    Takže to vypadá, že je konečně možné text ve WPF přečíst a nebudou mě z toho bolet oči díky rozmazanosti. Dobrá zpráva

    11.08.2010 @ 07:50

@xamlcz

  • RT @jvanrhyn: XAML, It's a bit like olives. Takes a while to get used to. But once you're used to it. It is actually pretty good. <3 XAML
  • RT @moser_christian: WPF Inspector 0.9.7 is released. It supports .NET 3.5 and 4.0 The project is now open source and available on CodeP ...
  • Jeff Handley oznámil vydání WCF RIA Services v.1.0 SP1 RTM http://bit.ly/gOgckn ke stažení na http://bit.ly/gVAXdK
  • jedna výzva pro Brno. Byl někdo z vás na přednášce o RIA v MS Akvárku? Dejte o sobě vědět. Děkuji
  • také jste uvažovali o tom, že zkusíte na projekt použít Caliburn Micro nebo naopak Prism 4? A co tak obojí, šlo by to nebo ne? Již brzy