This article has been localized into Polish by the community.
Kontrolka TextBox
Kontrolka TextBox jest najbardziej podstawową kontrolką pozwalającą na wprowadzanie tekstu, jaką można znaleźć w WPF, pozwala ona użytkownikowi na pisanie prostego tekstu, zarówno w jednej linii jak w dialogach oraz w wielu liniach jak w edytorze tekstu.
Jedno-liniowy TextBox
Kontrolka TextBox jest tak często stosowana, że wcale nie musisz wykorzystywać żadnych jej własności aby otrzymać pełnoprawne edytowalne pole tekstowe. Poniżej prosty przykład:
<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 wszystko czego potrzebujesz aby otrzymać pole tekstowe. Uzupełniłem tekst po uruchomieniu przykładu, zanim zrobiłem screenshot, ale możesz uzupełnić tekst również poprzez znaczniki XAML, aby był widoczny od razu po uruchomieniu aplikacji, za pomocą własności Text:
<TextBox Text="Hello, world!" />
Spróbuj kliknąć prawym przyciskiem myszy w kontrolkę TextBox. Zobaczysz menu z opcjami pozwalającymi skorzystać ze schowka systemu Windows. Domyślne skróty klawiszowe dla cofania i powtarzania operacji (Ctrl+Z oraz Ctrl+Y) powinny również działać, a wszystkie ten funkcjonalności dostajemy całkowicie za darmo!
Wielo-liniowy TextBox
Jeśli uruchomisz powyższy przykład, zauważysz że TextBox domyślnie oferuje jedno-liniowe wprowadzanie tekstu. Nic nie dzieje się kiedy wciskasz Enter, a jeśli dodasz więcej tekstu niż może zmieścić się w jednej linii, kontrolka umożliwi ci scrollowanie. Niemniej jednak, przestawienie kontrolki TextBox na wielo-liniowe wprowadzanie tekstu jest bardzo proste:
<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>
Dodałem dwie własności: AcceptsReturn zmienia kontrolkę TextBox w wielo-liniową poprzez zezwolenie na używanie klawisza Enter/Powrót aby przejść do nowej linii, a własność TextWrapping pozwala na automatyczne zawijanie tekstu w momencie dotarcia do końca linii.
Sprawdzanie pisowni w kontrolce TextBox
Dodatkowym bonusem jest to, że TextBox ma wbudowane automatyczne sprawdzanie pisowni dla języka angielskiego i kilku innych (francuskiego, niemieckiego oraz hiszpańskiego).
Autokorekta działa podobnie jak w Microsoft Word, gdzie błędy pisowni są podkreślane i klikając w nie prawym przyciskiem myszy widzimy sugerowane alternatywy. Włączenie sprawdzania pisowni jest bardzo proste:
<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>
Wykorzystaliśmy wielo-liniowy TextBox z poprzedniego przykładu, jako podstawę i następnie dodałem dwie nowe własności: własność powiązaną (attached property) z klasą SpellCheck o nazwie IsEnabled, która włącza sprawdzanie pisowni kontrolki-rodzica, oraz własność Language, która informuje który język brać pod uwagę podczas takiego sprawdzania.
Praca z zaznaczaniem tekstu w kontrolce TextBox
Tak jak w każdej innej kontrolce w Windowsie umożliwiającą edycję, tak i TextBox pozwala na zaznaczenie tekstu, np. aby usunąć całe słowo na raz albo skopiować fragment tekstu do schowka. TextBox w WPF posiada kilka własności pozwalających na pracę z zaznaczeniem tekstu, wartości wszystkich tych własności możesz odczytywać a nawet modyfikować. W kolejnym przykładzie będziemy odczytywać wartości tych własności:
<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>
Przykład zawiera dwie kontrolki TextBox: jedną do edycji a drugą do informacji zwrotnej na temat bieżącego stanu zaznaczenia. Dla tej drugiej ustawiliśmy własność IsReadOnly na true, aby zapobiec edytowaniu informacji o stanie kontrolki. Zasubskrybowaliśmy wydarzenie SelectionChanged w pierwszej kontrolce TextBox, które obsłużymy z poziomu kodu:
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 + "'";
}
}
}
Wykorzystaliśmy trzy interesujące własności aby wykonać przykład:
SelectionStart, która zwraca bieżącą pozycję kursora lub gdy występuje zaznaczenie: miejsce w którym się ono zaczyna.
SelectionLength, która zwraca długość bieżącego zaznaczenia o ile takie występuje. Jeśli żaden fragment tekstu nie jest zaznaczony zwraca 0.
SelectedText, która zwraca bieżąco zaznaczony string jeśli owo zaznaczenie występuje. W przeciwnym przypadku zwraca pusty string.
Modyfikowanie zaznaczenia
Wszystkie z przytoczonych własności dają możliwość odczytu jak i edycji co oznacza, że możesz je również modyfikować. Na przykład możesz ustalić wartości własności SelectionStart oraz SelectionLength aby zaznaczyć wybrany zakres tekstu, albo możesz użyć własności SelectedText aby wstawić i zaznaczyć string. Pamiętaj jednak, że TextBox musi być aktywny np. poprzez wywołanie najpierw metody Focus(), aby przytoczone operacje zadziałały.