This article has been localized into Russian by the community.
Элемент TextBox
Этот элемент управления является базовым, среди полей ввода в WPF, и позволяет конечному пользователю вводить текст, как простой однострочный (диалоговое окно), так и многострочный (редактор).
Однострочный TextBox
TextBox является крайне часто используемым элементом, и Вам даже нет необходимости использовать множество свойств для того, чтобы получить полномасштабное текстовое поле для ввода. Вот пример скелета такого элемента:
<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>
Это все, что Вам необходимо для получения текстового поля ввода. Я добавил в него текст после запуска примера и сделал скриншот. Но Вы также можете сделать это в коде, предварительно заполнив поле, используя свойство Text:
<TextBox Text="Hello, world!" />
Попробуйте кликнуть правой кнопкой мыши на TextBox. Вы увидите меню с опциями, позволяющими Вам использовать TextBox с буфером обмена Windows. Горячие клавиши отмены и повтора (Ctrl+Z и Ctrl+Y) будут работать по умолчанию, и этот функционал Вы получаете сразу же, "from box"!
Многострочный TextBox
Запустив предыдущий пример, Вы заметите, что TextBox по умолчанию является однострочным элементом. Ничего не произойдет при нажатии на Enter, и если Вы введете больше текста, чем позволяет одна строка, ввод просто прекратится. Однако, достаточно просто сделать из TextBox многострочный редактор:
<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>
Здесь я добавил два свойства: AcceptsReturn превращает TextBox в многострочный элемент, позволяя использовать клавишу Enter/Return для перехода на следующую строку, а свойство TextWrapping реализует автоматический перенос строки на новую, при достижении конца строки.
Проверка орфографии в TextBox
Дополнительным бонусом TextBox является то, что он поддерживает автоматическую проверку орфограции английского и некоторых других языков (французский, немецкий и испанский).
Этот механизм похож на проверку в Microsoft Word, где ошибки написания подчеркиваются, и, по нажатию правой кнопкой мыши, Вам предлагаются варианты исправления. Включить эту проверку в TextBox очень легко:
<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>
В качестве основы мы использовали предыдущий пример многострочного TextBox, при этом я добавил два новых свойства: SpellCheck.IsEnabled, которое включает проверку орфографии элемента и Language - информирующий приложение о том, какой язык используется по умолчанию.
TextBox и работа с выделенными словами
Как и любой другой элемент управления Windows, TextBox позволяет выделять текст: например для удаления слова или вставки текста из буфера обмена. TextBox в WPF имеет несколько свойств для работы с выделенным текстом, которые Вы можете либо пронаблюдать, либо изменить. В следующем примере мы проанализируем следующие свойства:
<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>
Пример состоит из двух элементов TextBox: один для редактирования, а второй для отображения статуса выбранного текста. Для последнего мы установили свойство IsReadOnly как true, во избежание редактирования текста, предназначенного для отображения статусов. Мы подписываем первый TextBox на событие SelectionChanged, которое обрабатываем в CodeBehind следующим образом:
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 + "'";
}
}
}
Для достижения результата мы использовали здесь три интересных свойства:
SelectionStart, которое дает нам текущее положение курсора либо, в случае выделенного текста - место, где этот текст начинается.
SelectionLength дает нам длину текущего выделенного текста, если он существует. В противном случае свойство вернет нам 0.
SelectedText возвращает текущую выделенную строку либо пустую строку при отсутствии выделенного текста.
Модифицирование выделенного текста
Все эти свойства являются свойствами чтения и записи, это значит, что Вы можете их также и модифицировать. Например, Вы можете установить свойства SelectionStart и SelectionLength на выбор текста определенной длины или свойство SelectedText для вставки строки. Просто помните, что для реализации подобных механизмов, TextBox должен находится в фокусе. Иными словами чтобы это работало, сначала используйте метод Focus().