This article has been localized into Polish by the community.
A special thanks goes out to user #1657 for the Polish translation of this article: Mikolaj Dalecki
TextBlock - formatowanie tekstu
W poprzednim artykule przyjrzeliśmy się podstawowej funkcjonalności kontrolki TextBlock: wyświetlanie zwykłego tekstu oraz łamanie wierszy, gdy to konieczne, również użyliśmy innego koloru niż domyślny. Jednak co musimy zrobić aby uzyskać coś więcej niż zwykły kolor w całej kontrolce?
Całe szczęście TextBlock obsługuje formatowanie w tekście. Te mały tagi, które przypominają kontrolki, pochodzą od klasy Inline, co znaczy, że mogą zostać użyte wewnątrz większego tekstu. W momencie pisania tego tekstu dostępne elementy to: AnchoredBlock, Bold, Hyperlink, InlineUIContainer, Italic, LineBreak, Run, Span, i Underline. W następnych przykładach przybliżymy większość z nich.
Pogrubienie, pochylenie i podkreślenie
Najprawdopodobniej są to najpopularniejsze elementy wykorzystywane w tekście. Ich nazwy powinny wskazywać już na to, co robią, jednak dla pewności pokażemy Ci przykład jak ich używać:
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBlockInlineSample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="TextBlockInlineSample" Height="100" Width="300"> <Grid> <TextBlock Margin="10" TextWrapping="Wrap"> TextBlock with <Bold>bold</Bold>, <Italic>italic</Italic> and <Underline>underlined</Underline> text. </TextBlock> </Grid> </Window>

Podobnie jak w HTML potrzeba po prostu otoczyć tekst tagiem Bold aby uzyskać pogrubiony tekst (i tym podobnie dla pozostałych znaczników). Takie podejście pozwala na łatwe stworzenie różnorodnego tekstu w aplikacji.
Wszystkie trzy znaczniki są pochodnymi elementami Span, a każdy z nich określa pewne właściwości aby osiągnąć zamierzony efekt. Dla przykładu znacznik Bold ustawia parametr FontWeight, natomiast znacznik Italic ustawia właściwość FontStyle.
Łamanie linii
Proste złamanie linii w wybranym miejscu. Przykłady, jak używać znacznika LineBreak, znajdują się w poprzednim rozdziale.
Hiperłącze
Element Hyperlink pozwala wstawiać linki do tekstu. Są one rysowane z uwzględnieniem bieżącego stylu Windows'a, który to zazwyczaj określa je jako niebieski podkreślony tekst z efektem zmiany koloru na czerwony po najechaniu kursorem (który zmienia się do tego w ikonę ręki). Przykład poniżej:
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBlockHyperlinkSample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="TextBlockHyperlinkSample" Height="100" Width="300"> <Grid> <TextBlock Margin="10" TextWrapping="Wrap"> This text has a <Hyperlink RequestNavigate="Hyperlink_RequestNavigate" NavigateUri="https://www.google.com">link</Hyperlink> in it. </TextBlock> </Grid> </Window>

Hyperlink można wykorzystać również do nawigacji między stronami aplikacji - w takim przypadku nie trzeba dodawać obsługi zdarzenia RequestNavigate. Reakcja na to zdarzenie jest wymagana tylko w przypadku linków prowadzących na zewnątrz aplikacji WPF. Metoda wywoływana na zdarzenie RequestNavigate, która pozwoli nam na uruchomienie adresu URL w domyślnej przeglądarce dzięki użyciu klasy Process wygląda następująco:
private void Hyperlink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e) { System.Diagnostics.Process.Start(e.Uri.AbsoluteUri); }
Run (ciąg)
Element Run pozwala na stylizowanie tekstu umożliwiając dostęp do wszystkich właściwości klasy Span, ale z jednym ograniczeniem: kiedy Span może zawierać w sobie inne elementy formatujące wewnątrz (składanie różnych formatowań), tak element Run może w sobie zawierać tylko i wyłącznie czysty tekst (jego formatowanie musi być ciągłe). Takie podejście czyni element Span bardziej uniwersalnym wyborem w większości przypadków.
Span (zakres)
Element Span nie posiada domyślnie żadnego formatowania, ale pozwala za to łatwo określić różne efekty w tekście, który jest w jego zakresie, włączając w to rozmiar czcionki, pogrubienie, czy jej kolor, oraz tło i inne. Ciekawą rzeczą, na którą pozwala Span, jest zagnieżdżanie elementów, co umożliwia nam zrobienie skomplikowanego formatowania w prosty sposób. W następującym przykładzie użyłem wiele elementów Span aby pokazać kilka z możliwości wykorzystania tego znacznika:
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBlockSpanSample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="TextBlockSpanSample" Height="100" Width="300"> <Grid> <TextBlock Margin="10" TextWrapping="Wrap"> This <Span FontWeight="Bold">is</Span> a <Span Background="Silver" Foreground="Maroon">TextBlock</Span> with <Span TextDecorations="Underline">several</Span> <Span FontStyle="Italic">Span</Span> elements, <Span Foreground="Blue"> using a <Bold>variety</Bold> of <Italic>styles</Italic> </Span>. </TextBlock> </Grid> </Window>

Więc, jak widzisz, jeśli żaden inny element nie pasuje do twoich potrzeb, bądź potrzebujesz czegoś aby zacząć tworzyć twoje własne formatowanie, to element Span będzie dobrym wyborem.
Formatowanie tekstu z kodu za-widokiem.
Jak widzisz formatowanie tekstu w XAML jest bardzo proste, jednak w niektórych przypadkach powstaje potrzeba zrobienia tego programowo. Jest to trochę mniej wygodne rozwiązanie, jednak czasami konieczne. Poniżej przykład jak sformatować tekst w języku C#:
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBlockCodeBehindSample" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="TextBlockCodeBehindSample" Height="100" Width="300"> <Grid></Grid> </Window>
using System; using System.Windows; using System.Windows.Controls; using System.Windows.Documents; using System.Windows.Media; namespace WpfTutorialSamples.Basic_controls { public partial class TextBlockCodeBehindSample : Window { public TextBlockCodeBehindSample() { InitializeComponent(); TextBlock tb = new TextBlock(); tb.TextWrapping = TextWrapping.Wrap; tb.Margin = new Thickness(10); tb.Inlines.Add("An example on "); tb.Inlines.Add(new Run("the TextBlock control ") { FontWeight = FontWeights.Bold }); tb.Inlines.Add("using "); tb.Inlines.Add(new Run("inline ") { FontStyle = FontStyles.Italic }); tb.Inlines.Add(new Run("text formatting ") { Foreground = Brushes.Blue }); tb.Inlines.Add("from "); tb.Inlines.Add(new Run("Code-Behind") { TextDecorations = TextDecorations.Underline }); tb.Inlines.Add("."); this.Content = tb; } } }

Wspaniale jest mieć możliwości, i czasem może przyjść moment, kiedy będziemy zmuszeni formatować tekst właśnie w ten sposób. Możliwe jednak, że ten przykład spowoduje, że jeszcze bardziej docenisz język XAML.