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

Novinky ve WPF 4 – Layout rounding

Napsáno pro WPF od Jarda Jirava  [03.08.2010]

Pokračování představování novinek ve WPF 4 jsem si nechal na léto, kdy jsem doufal, že tolik novinek nebude a přeci jen bude volněji. A tak se do konce prázdnin podíváme na všechny novinky, které pomalu přestávají být novinkami a dostávají se pod kůži každého WPF vývojáře a designera.

V tomto příspěvku se chci věnovat novince, která by určitě měla zlepšit kladné vnímání WPF i u koncových uživatelů, neboť nabízí přesné vykreslování použitých prvků a tím je Layout rounding.

Layout rounding

Layoutovací engine ve WPF je založen na vykreslování pomocí subpixelů, což znamená, že veškeré vykreslování je – nebo může být – realizováno nikoliv na celé pixely, ale může zasahovat pouze do části pixelu. To však vede k tomu, že dochází k překrytí a zdání, že vše je lehce rozmazané nebo neodpovídá skutečnosti.

Asi markantně je to vidět na příkladu, kdy chceme vykreslit třeba čáru od pozice 4.5 o tloušťce 1. Tím, že se dostáváme na polovinu pixelu, tak vlastně říkáme zobrazovacímu zařízení, aby rozsvítil čtvrtý a pátý bod a to z poloviny. Takže ve výsledku jsou rozsvíceny dva pixely a původně zamýšlená čára má rázem jinou podobu.

Podívejte se na výsledek této části kódu:

<Rectangle Margin="4.5,4.5,4.5,4.5" StrokeThickness="1" Stroke="Black" Height="30" Width="30" />

a výsledek, který jsem zvětšil 6x:

layoutrounding-off

 

Na obrázku vidíte, že horní a spodní čára je vykreslena správně, kdežto obě boční čáry přesahují přes dva pixely a zároveň jsou vykresleny světleji.

UseLayoutRounding

Vývojáři v Silverlightu se tímto nešvarem již druhou verzi nemusí trápit a vývojáři a designeři WPF již také ne, neboť je k dispozici nově vlastnost UseLayoutRounding, která je sice ve výchozím stavu nastavena na hodnotu false, ale jakmile ji nastavíme hodnotu true, dostaví se kýžený výsledek a dojde k zarovnání na celé pixely. Výsledný obrázek s nastavenou vlastností UseLayoutRouding="True" je pak následující:

layoutrounding-on

Vše je tak zarovnané a ostré.

Ještě je třeba zmínit, že v okamžiku, kdy nastavíme tuto vlastnost na nadřazeném prvku, je toto chování propagováno i na potomky.

Závěrem

Někdo by si v této chvíli mohl říci, proč toto nastavení není implementováno na všechna vykreslování, vždyť by vše bylo ostré. Ale nezapomínejte, že ne vždy je toto účelem a jsou situace, při kterých lépe vypadá vykreslení pomocí anti-aliasingu. Své opodstatnění však toto nastavení má, jak je vidět na přiložených ukázkách.

Komentáře

ukládám komentář, vyčkejte prosím..
  1. Buďte první, kdo napíše komentář.

@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