This article has been localized into Czech by the community.
Ovládací prvek TextBlock - formátování v textu
V posledním článku jsme se podívali na základní funkce ovládacího prvku TextBlock: Zobrazení jednoduchého řetězce a jeho obalení v případě potřeby. Dokonce jsme použili jinou barvu, než je výchozí pro zobrazení textu, ale co kdybyste chtěli něco více než jen definovat statickou barvu pro všechen text v TextBlock?
Naštěstí ovládací prvek TextBlock podporuje vložený obsah. Všechny tyto malé ovládací konstrukce, dědí z vložené třídy (Inline class), což znamená, že mohou být vloženy jako součást většího textu. V textu jsou podporovány prvky ukotvení (AnchoredBlock) , tučné písmo, hypertextový odkaz, InlineUIContainer, kurzíva, zalomení řádku(LineBreak), Run, Span a podtržení (Underline). V následujících příkladech se na většinu z nich podíváme.
Tučné písmo, kurzíva a podtržené písmo
Jedná se pravděpodobně o nejjednodušší typy vložených prvků. Názvy by vám měly být povědomé a také co znamenají a co dělají, ale i tak vám ukážeme jednoduchý příklad, jak je používat:
<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>
Podobně jako v případě jazyka HTML je text ohraničen tagem Tučně (Bold), tímto je text zapsán tučným písmem atd. Díky tomu způsobu zápisu je velmi snadné vytvářet a zobrazovat v aplikacích různorodý text.
Všechny tyto tři tagy jsou pouze podřízenými třídami prvku Span, přičemž každé nastavení určité vlastnosti prvku Span vytvoří požadovaný efekt. Například značka Tučné (Bold) pouze nastavuje vlastnost Tloušťka písma (FontWeight) na podkladovém prvku Span, prvek kurzíva (Italic) nastavuje styl písma (FontStyle) a tak podobně.
Zalomení řádku
Jednoduše vloží do textu znak pro zalomení řádku. Příklad použití prvku LineBreak je zobrazen v předchozí kapitole.
Hypertextový odkaz
Prvek hypertextový odkaz vám umožňuje umístit v textu odkazy. Je vykreslen stylem, který kopíruje aktuální motiv systému Windows, což je obvykle nějaký druh podtrženého modrého textu s červeným efektem při přechodu myší a kurzor myši. Pomocí vlastnosti NavigateUri můžete definovat adresu URL, na kterou chcete přejít. Příklad:
<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>
Hypertextový odkaz se také používá uvnitř stránek WPF, kde jej lze použít k navigaci mezi stránkami. V takovém případě nebude nutné specificky zpracovávat událost RequestNavigate, jako to děláme v příkladu, ale pro spuštění externí adresy URL z běžné aplikace WPF budeme potřebovat trochu pomoci z této události a třídy Process. Přihlásíme se k odběru události RequestNavigate, která nám umožňuje spustit propojenou adresu URL ve výchozím prohlížeči uživatelů s jednoduchou obslužnou rutinou události, jako je tato, v kódu za na pozadí:
private void Hyperlink_RequestNavigate(object sender, System.Windows.Navigation.RequestNavigateEventArgs e)
{
System.Diagnostics.Process.Start(e.Uri.AbsoluteUri);
}
Spustit (Run)
Element Spustit (Run) umožňuje stylování řetězce pomocí všech dostupných vlastností prvku Span, ale zatímco element Span může obsahovat další vložené elementy, element Run může obsahovat pouze prostý text. Díky tomu je prvek Span flexibilnější, a proto je jeho volba ve většině případů logická.
Span
Prvek Span nemá ve výchozím nastavení žádné specifické zobrazení, ale umožňuje nastavit téměř jakýkoli jeho druh, včetně velikosti písma, stylu a tloušťky, barvy pozadí a popředí atd. Velkou věcí na prvku Span je to, že umožňuje uvnitř sebe použít další vložené elementy, což usnadňuje tvorbu i pokročilých kombinací textu a stylu. V následujícím příkladu jsem použil několik elementů Span, které ukazují některé z mnoha možností jak tyto vložené prvky uvnitř elementu Span použit:
<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>
Takže jak můžete vidět, pokud nemáte v úmyslu ve vašem projektu použít žádný z jiných prvků, nebo pokud chcete, použít při formátování textu jen prázdné plátno, je prvek Span skvělou volbou.
Formátování textu v C# v kódu na pozadí
Jak můžete vidět, formátování textu pomocí jazyka XAML je velmi snadné, ale v některých případech může být výhodnější nebo dokonce nutné jej provést z jazyka C#v kódu na pozadí. Je to sice trochu složitější, ale zde je příklad, jak to můžete udělat:
<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;
}
}
}
Je skvělé mít tuto možnost a v některých případech to může být nezbytné, ale tento příklad vám pravděpodobně umožní ještě více ocenit jazyk XAML.