This article has been localized into Czech by the community.
Ovládací prvek "TextBox"
"TextBox" je nejzákladnější ovládací prvek pro vkládání textu, který lze ve WPF najít. Umožňuje koncovým uživatelům zapsat prostý text ať už formou jednořádkového vstupu okna dialogu, tak i ve více řádcích jako v textovém editoru.
Jednořádkový "TextBox"
Prvek "TextBox" je tak běžně používaný, že aniž bychom mu přidali nějaké vlastnosti/atributy (angl. "properties"), můžeme jej již v této nejprimitivnější podobě požít jako plnohodnotné editovatelné textové pole. Níže je příklad takového "základního provedení":
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBoxSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBoxSample" Height="80" Width="250">
<StackPanel Margin="10">
<TextBox />
</StackPanel>
</Window>
To je vše, co potřebujete k vytvoření textového pole. V uvedeném příkladu byl text přidán za běhu aplikace a poté proveden snímek obrazovky, ale můžete také "TextBox" předvyplnit přidáním atributu "Text" do XAML kódu:
<TextBox Text="Hello, world!" />
Vyzkoušejte (za běhu programu) v prvku "TextBox" stisknout pravé tlačítko myši. Otevře se okno nabídky umožňující použít "TextBox" se schránkou systému Windows. Rovněž by měly fungovat základní klávesové zkratky pro navrácení provedené akce (Ctrl+Z) a opakování navrácené akce (Ctrl+Y). A to vše zadarmo!
Víceřádkový "TextBox"
Při spuštění předchozího příkladu zjistíte, že prvek "TextBox" je ve výchozím nastavení jednořádkový. Při stisknutí klávesy "Enter" se neprovede žádná akce a je-li vložen text delší, než se do prvku vejde na jeden řádek, text se v prvku posouvá. Každopádně vytvořit z prvku "TextBox" víceřádkový textový editor je jednoduché:
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBoxSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBoxSample" Height="160" Width="280">
<Grid Margin="10">
<TextBox AcceptsReturn="True" TextWrapping="Wrap" />
</Grid>
</Window>
Postačilo přidat dva atributy: "AcceptsReturn" a "TextWrapping". Nastavení hodnoty atributu AcceptsReturn="True" umožňuje přechod na nový řádek po stisknutí klávesy "Enter". Atribut "TextWrapping" zajišťuje automatické zalamování textu na konci řádku.
Kontrola pravopisu v prvku "TextBox"
Jako bonus umožňuje "TextBox" automatickou kontrolu pravopisu anglického textu a některých dalších jazyků. Mezi podporované jazyky patří již zmíněná angličtina, francouzština, němčina a španělština.
Funguje to podobně jako v aplikaci Microsoft Word, kde jsou pravopisné chyby podtrženy a při stisknutí pravého tlačítka myši lze vybrat ze seznamu navrhovaných možností opravy. Aktivace kontroly pravopisu je velmi jednoduchá:
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBoxSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBoxSample" Height="160" Width="280">
<Grid Margin="10">
<TextBox AcceptsReturn="True" TextWrapping="Wrap" SpellCheck.IsEnabled="True" Language="en-US" />
</Grid>
</Window>
Jako základ byl použit předchozí příklad víceřádkového prvku "TextBox" a do tohoto prvku byly přidány další dva atributy: "IsEnabled", který je připojený ze třídy "SpellCheck" a jednoduše umožňuje kontrolu pravopisu v rodičovském prvku a atribut "Language", který definuje jazykový slovník, vůči kterému bude kontrola pravopisu prováděna. (Pozn. překl.: kontrola pravopisu je podporovaná jenom v případě, že WPF poskytuje výchozí slovník.)
Práce s výběry v prvku "TextBox"
Stejně jako jiné editovatelné prvky ve Windows, "TextBox" umožňuje výběr textu, např. smazat najednou celé slovo nebo zkopírovat text ze schránky. WPF "TextBox" má několik atributů/vlastností pro práci s vybraným textem, jejichž obsah lze nejen vyčítat, ale také měnit. V následujícím příkladu si tyto vlastnosti uvedeme:
<Window x:Class="WpfTutorialSamples.Basic_controls.TextBoxSelectionSample"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="TextBoxSelectionSample" Height="150" Width="300">
<DockPanel Margin="10">
<TextBox SelectionChanged="TextBox_SelectionChanged" DockPanel.Dock="Top" />
<TextBox Name="txtStatus" AcceptsReturn="True" TextWrapping="Wrap" IsReadOnly="True" />
</DockPanel>
</Window>
Příklad sestává ze dvou ovládacích prvků "TextBox": Jeden slouží k editaci textu a druhý jako výstup zobrazující aktuální stav výběru. Pro tento stavový "TextBox" je nastavena hodnota atributu "IsReadOnly" jako "true", aby nebylo možné jej v aplikaci přepsat. U prvního "TextBoxu" deklarujeme událost SelectionChanged="TextBox_SelectionChanged", jejíž obsluhu nadefinujeme v .cs souboru (Code-behind):
using System;
using System.Text;
using System.Windows;
using System.Windows.Controls;
namespace WpfTutorialSamples.Basic_controls
{
public partial class TextBoxSelectionSample : Window
{
public TextBoxSelectionSample()
{
InitializeComponent();
}
private void TextBox_SelectionChanged(object sender, RoutedEventArgs e)
{
TextBox textBox = sender as TextBox;
txtStatus.Text = "Selection starts at character #" + textBox.SelectionStart + Environment.NewLine;
txtStatus.Text += "Selection is " + textBox.SelectionLength + " character(s) long" + Environment.NewLine;
txtStatus.Text += "Selected text: '" + textBox.SelectedText + "'";
}
}
}
Tohoto výstupu bylo dosaženo použitím tří zajímavých atributů:
SelectionStart, který udává aktuální pozici kurzoru, nebo v případě výběru textu pak pozici jeho počátku.
SelectionLength, který udává délku vybraného textu, případně navrací hodnotu 0, jestliže není vybrán žádný text.
SelectedText, který obsahuje aktuálně vybraný text, pokud je nějaký vybrán. Jinak navrátí prázdný řetězec.
Úprava výběru
Všechny tyto atributy lze nejen číst, ale lze do nich hodnoty také zapisovat a tedy pozměnit. Například nastavením atributů "SelectionStart" a "SelectionLength" můžeme zvolit rozsah výběru, nebo lze atribut "SelectedText" využít k vložení textu a jeho současnému výběru/označení. Jen je třeba nezapomenout, že ovládací prvek "TextBox" musí být v danou chvíli aktivní, což lze zajistit například předchozím zavoláním metody Focus().