Artykuł

freeimages.com freeimages.com
cze 26 2015
0

Ciekawe możliwości kontrolki TextBlock

Język znaczników XAML, jest integralnym elementem kilku ważnych technologii Microsoftu. Pojawia się on: w sukcesywnie upadającym Silverlighcie, WPFie, Windows Phonie, czy też w aplikacjach uniwersalnych. Dlatego też jeśli poznacie jedno z wymienionych wyżej środowisk, to bardzo łatwo będzie się Wam przestawić na dowolną z pozostałych technologi.

W zależności od środowiska, mogą pojawiać się pewne delikatne różnice w możliwościach jakie dostarczy nam XAML, ale mimo wszystko jest naprawdę sporo rzeczy wspólnych - ot choćby podstawowe kontrolki.

Jedną z takich kontrolek jest pozornie prosty TextBlock, który w praktyce skrywa w sobie spore możliwości. Jakie? Na te pytanie postaram się odpowiedzieć trochę szerzej w dalszej części tekstu;-)

Standardowe użycie

Standardowe użycie TextBlocka polega na podpięciu do niego tekstu (zbindowanego, bądź też nie), według jednego z poniższych sposobów:

<TextBlock Text="Test" />
<TextBlock>Test</TextBlock>
<TextBlock Text="{Binding PropertyWithText}" />

Takie podejście ma jednak kilka wad:

  • Możemy bindować maksymalnie jedną właściwość
  • Nie możemy mieszać tekstów statycznych z bindingiem
  • Cały TextBlock musi mieć jednolite formatowanie
  • Operujemy tylko na prostym tekście

Na szczęście wszystkie te problemy możemy łatwo obejść, umiejętnie wykorzystując domyślny Content property dla kontrolki TextBlock, czyli właściwość Inlines.

Inlines

Właściwość Inlines pozwala na przechowywanie kolekcji elementów typu Inline. Do rodziny tych elementów możemy zaliczyć takie znaczniki jak:

  • Bold - wytłuszcza wskazany fragment tekstu
  • Hyperlink - pozwala na tworzenie linków (!) do różnego rodzaju treści obsługiwanych w systemie. Np. link do strony pozwoli na otwarcie przeglądarki internetowej:
    <Hyperlink NavigateUri="http://www.google.pl">Google</Hyperlink>
    Hyperlink obsługuje również zdarzenie Click. Niestety nie udało mi się podpiąć obsług komend za pomocą Behaviors SDK, co trochę utrudnia pracę w przypadku użycia ViewModeli
  • Italic - pozwala na pisanie tekstu kursywą
  • Linebreak - łamie linię - odpowiednik br z HTMLa
  • Run - element typu inline przechowujący sformatowany (lub też nie) tekst
  • Span - z założenia podobny do konstrukcji Run, aczkolwiek różni się od niej tym, że może przechowywać dowolną ilość innych elementów typu Inline (Run nie może zagnieżdżać innych elementów)
  • Underline - wyświetla podkreślenie we wszystkich elementach znajdujących się w środku

Wszystkie powyższe elementy (z wyłączeniem tagu Run) możemy dowolnie ze sobą miksować. Dopuszczalne jest więc napisanie poniższego kodu:

<TextBlock>
    <Run>To jest jakiś tekst w znaczniku Run</Run>
    <LineBreak />
    <Span>
        Teraz zaczynamy Span
        <LineBreak />
        <Run>Tekst może być w Runie</Run>
        <LineBreak />
        może być też luzem
        <LineBreak />
        i <Run Text="pomieszany" />
        <LineBreak />
        <Bold><Run>Bold jest również dobrą opcją</Run></Bold>
    </Span>
    <LineBreak />
    <Underline>
        <Hyperlink NavigateUri="http://www.google.pl">Wujek Google</Hyperlink>
    </Underline>
</TextBlock>

TextBlock w takim wydaniu ma bardzo dużo podobieństw do HTMLa. Znaczenie mają tutaj nawet spacje i entery pomiędzy poszczególnymi elementami. Poniższy kod:

<TextBlock>
    <Run Text="A" /><Run Text="B" /><Run Text="C" />
</TextBlock>

Wypluje na ekranie tekst ABC, natomiast ten:

<TextBlock>
    <Run Text="A" />
    <Run Text="B" />
    <Run Text="C" />
</TextBlock>

Spowoduje wyświetlenie napisu A B C. W pewnym sensie bardzo to przypomina działanie Razora z ASP.NET MVC - każda spacja, enter, znacznik - wszystko ma znaczenie, a każdy element traktowany (nawet tak drobny) jest jako osobny składnik typu Inline.

Bindowanie

Elementy typu Inline pozwalają również na bindowanie wielu właściwości w jednym TextBlocku naraz. Dzięki temu możemy np. łatwo zapisać wynik meczu, czy godzinę...:

<TextBlock>
    <Run Text="{Binding TeamAScore}" />
    <Run>:</Run>
    <Run Text="{Binding TeamBScore}" />
</TextBlock>

Oczywiście bindowanie nie wpływa na możliwości formatowania. Wciąż możemy zastosować pogrubienie, wytłuszczenie, czy też hiperłącze;-)

Stylowanie

Największy problem w całej tej sytuacji stanowi stylowanie. Pozornie dostaliśmy możliwość łatwego nadawania pogrubienia/podkreślenia dla dowolnej części TextBlocku, ale zabrano nam możliwość nakładania styli na poszczególne składowe (wciąż możemy jednak nakładać styl na cały TextBlock). Na szczęście w całej sytuacji jest pewna furtka, ponieważ możemy ręcznie modyfikować określone właściwości poszczególnych elementów. Poniżej ich lista:

  • CharacterSpacing
  • FlowDirection
  • FontFamily
  • FontSize
  • FontStretch
  • FontStyle
  • FontWeight
  • Foreground
  • IsTextScaleFactorEnabled
  • Language

Może nie jest ona jakaś super długa, ale w większości przypadków wystarczająca do wykonania praktycznie dowolnych operacji na tekście.

<TextBlock>
    <Run Text="AAAAA" FontSize="20" />
    <Run Text="BBBBB" FontFamily="Verdana" FontSize="20" Foreground="Aqua" />
</TextBlock>

Podsumowanie

Kontrolka TextBlock skrywa w sobie naprawdę spore możliwości, z których warto korzystać na co dzień. W większości przypadków może się ona okazać wystarczająca, nawet przy dość złożonych tekstach o urozmaiconym formatowaniu. Jeśli jednak potrzebujecie czegoś więcej, to zawsze możecie sięgnąć po kontrolkę RichTextBlock. Różni się ona od zwykłego TextBlocka przede wszystkim tym, że w jej środku można umieścić kilka dodatkowych elementów - np. paragrafy;-)

Podoba Ci się ten wpis? Powiedz o tym innym!

Send to Kindle

Komentarze

blog comments powered by Disqus