TOC

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

Podstawowe kontrolki:

TextBlock - formatowanie tekstu

W poprzednim artykule przyjżeliś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.

This article has been fully translated into the following languages: Is your preferred language not on the list? Click here to help us translate this article into your language!