Содержание
Работа с текстом в WPF может строится на использовании целого ряд элементов управления, предназначенных как для простого отображения текстового содержимого, так и для его редактирования. С некоторыми из этих элементов мы уже прямо или косвенно познакомились, когда изучали работу с текстом и шрифтами в WPF. В этой части мы рассмотрим основные свойства и события элементов управления, предназначенных для ввода и вывода текстового содержимого в WPF.
Работа с текстом в WPF
Вывод текста: элементы TextBlock, Label и AccessText
Элемент TextBlock
Элемент TextBlock
предназначен для вывода текстового содержимого. Этот элемент WPF содержит достаточно много различных свойств для гибкого управления оформлением текста — размеры шрифта, семейство шрифтов и так далее. С большинством из этих свойств мы подробно знакомились при изучении работы в WPF с текстом и шрифтами. При этом, внутри текста у TextBlock
мы можем использовать специальные элементы содержимого для изменения стилей начертания отдельных частей текста, ручного переноса строк и так далее. Рассмотрим следующий пример:
<TextBlock FontSize="20" Width="600" TextWrapping="WrapWithOverflow"> <Bold>Это</Bold> <Italic>тектовый блок</Italic>, <LineBreak/> содержащий большой объем текста с разделителями,<LineBreak/> который не умещается во всю ширину окна, и может переноситься на другую строку. Также здесь включен перенос слов, например, посмотрим как будет переноситься слово достопримечательность </TextBlock>
Обратите внимание на содержимое текстового блока — здесь мы используем специальные элементы WPF для оформления текста:
<Bold>
— делает участок текста жирным<Italic>
— участок текста пишется курсивом<LineBreak/>
— устанавливает перенос текста на новую строку
В результате, мы увидим следующее содержимое текстового блока:Более того, мы можем оформлять текст, используя специальный элемент
Run
, позволяющий форматировать текст блока. Например:
<TextBlock FontSize="20" Width="600" TextWrapping="WrapWithOverflow"> H<Run Typography.Variants="Subscript">2</Run>O - формула воды<LineBreak/> м/с<Run Typography.Variants="Superscript">2</Run> - размерность ускорения <LineBreak/> </TextBlock>
Здесь мы используем элемент Run
для форматирования текста — установки верхних и нижних индексов:
Элемент Label
Этот элемент также используется для вывода текста, но если элемент TextBlock
предназначен для вывода текста, то Label
представляет собой текстовую подпись для элемента управления и, при этом, обеспечивает поддержку клавиш доступа. Поддержка мнемонических команд — это основная особенность Label
. Чтобы продемонстрировать смысл мнемоники, напишем следующий пример:
<StackPanel> <Label Target="{Binding ElementName=button}">_Select</Label> <Button Click="button_Click" Content="Кнопка" x:Name="button" Width="100" Height="50" /> </StackPanel>
Обработчик события Click кнопки будет следующим:
private void button_Click(object sender, RoutedEventArgs e) { MessageBox.Show("Кнопка нажата"); }
Обратите внимание на текст метки Label
— здесь мы используем символ нижнего подчеркивания:
<Label Target="{Binding ElementName=button}">_Select</Label>
первый символ подчеркивания и следующий символ за ним определяются как клавиша доступа. Также, мы определили атрибут Target
в котором, используя расширение разметки Binding
указали цель — элемент на который будет переведен фокус ввода при выполнении мнемонической команды. Этим элементом управления будет кнопка. Теперь запустим приложение:
Нажмите клавишу s
на клавиатуре и убедитесь, что сработало событие Click
кнопки:
По умолчанию, мы не видим доступные нам мнемонические команды в интерфейсе. Чтобы их увидеть — нажмите клавишу Alt
:
Использование клавиш доступа также реализовано в другом элементе управления в WPF — AccessText
.
Элемент AccessText
Элемент AccessText
также представляет собой клавишу доступа и может применяться, например, в других элементах управления WPF. Рассмотрим следующий пример:
<StackPanel> <Button Click="button_Click" Width="100" Height="50" > <AccessText>_Нажми меня</AccessText> </Button> </StackPanel>
Теперь клавиша н
будет выступать клавишей доступа для кнопки. Напустите приложение и нажмите н
— сработает событие Click
кнопки.
Ввод текста: элементы TextBox, PasswordBox, RichTextBox
Элемент TextBox
Если элемент TextBlock
предназначен для вывода статического текста, то TextBox
позволяет текст редактировать. Обычно, элемент TextBox
используется для ввода небольших объемов неформатированного текста, например, в качестве полей ввода имени пользователя, email, номера телефона и так далее. Например, создадим TextBox
для ввода имени пользователя:
<Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="120"/> <ColumnDefinition/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="25"/> </Grid.RowDefinitions> <Label Grid.Row="0" Grid.Column="0" Target="{Binding ElementName=userName}" Content="_Имя пользователя"/> <TextBox Grid.Row="0" Grid.Column="1" x:Name="userName" Text="Введите имя пользователя" /> </Grid>
В запущенном приложении это поле и метка будут выглядеть следующим образом:Среди свойств TextBox, помимо свойств для работы с текстом и шрифтами, стоит отметить следующие свойства:
Свойство | Тип | Описание |
CaretIndex |
int |
Отсчитываемая от нуля позиция курсора |
MaxLength |
int |
Максимальное количество символов, которые можно ввести в TextBox |
MaxLines |
int |
Максимальное количество видимых строк |
MinLines |
int |
Минимальное количество видимых строк |
SelectedText |
string |
Выделенный текст |
SelectionLength |
int |
Длина выделенной строки |
SelectionStart |
int |
Индекс символа с которого начинается выделенный текст |
Также TextBox
предоставляет нам два события:
Событие | Описание |
public event System.Windows.RoutedEventHandler SelectionChanged; |
Генерируется при изменении выделенного текста |
public event System.Windows.Controls.TextChangedEventHandler TextChanged; |
Генерируется при изменении текстового содержимого |
Воспользуемся этими свойствами и событиями в нашем примере:
<Grid> <Grid.ColumnDefinitions> <ColumnDefinition Width="120"/> <ColumnDefinition/> </Grid.ColumnDefinitions> <Grid.RowDefinitions> <RowDefinition Height="25"/> <RowDefinition Height="25"/> <RowDefinition Height="25"/> </Grid.RowDefinitions> <Label Grid.Row="0" Grid.Column="0" Target="{Binding ElementName=userName}" Content="_Имя пользователя"/> <TextBox Grid.Row="0" Grid.Column="1" x:Name="userName" Text="Введите имя пользователя" TextChanged="userName_TextChanged" SelectionChanged="userName_SelectionChanged"/> <TextBlock x:Name="text" Grid.Column="1" Grid.Row="1"/> <TextBlock x:Name="selected_text" Grid.Column="1" Grid.Row="2"/> </Grid>
Здесь мы добавили два элемента TextBlock
, а также события TextBox
— TextChanged
и SelectionChanged
, обработчики которых выглядят следующим образом:
private void userName_TextChanged(object sender, TextChangedEventArgs e) { if (text != null) text.Text = userName.Text; } private void userName_SelectionChanged(object sender, RoutedEventArgs e) { if (selected_text != null) selected_text.Text = userName.SelectedText; }
Запустим приложение и проверим результат:
Ещё одной замечательной возможностью
TextBox
является проверка орфографии. Для этого мы должны воспользоваться присоединенным свойством и установить язык. Например так:
<TextBox .... Language="ru-RU" SpellCheck.IsEnabled="True"/>
Теперь будет проводиться проверка орфографии для русского языка:
Доступ к редактированию слова осуществляется через контекстное меню, которое открывается кликом правой кнопкой мыши по полю TextBox
.
Элемент PasswordBox
Элемент PasswordBox
предназначен для ввода текстовой информации, которая должна визуально скрываться от пользователя, например, для ввода паролей. Все вводимые символы заменяются маской. Например,
<PasswordBox Grid.Row="0" Grid.Column="1" x:Name="userPass" Password="123456789"/>
В свойстве Password
храниться текущее значение введенное в PasswordBox
. По умолчанию, все символы в этом текстовом поле заменяются на жирные точки:Но, при желании, мы можем заменить маску на любой другой символ:
<PasswordBox Grid.Row="0" Grid.Column="1" x:Name="userPass" Password="123456789" PasswordChar="*"/>
Теперь все символы будут заменены на «звездочки»
Аналогично TextBox
, для отслеживания изменений в PasswordBox
используется событие:
public event System.Windows.RoutedEventHandler PasswordChanged;
Элемент RichTextBox
Элемент RichTextBox
можно назвать текстовым полем с расширенными возможностями. Если вам необходимо обеспечить в приложении не только ввод текста, но и формирование полноценных документов с картинками, параграфами и т.д., то вам необходимо задействовать в приложении именно этот элемент управления. Про этот элемент управления в WPF мы подробно поговорим в отдельной главе руководства.
Итого
Работа с текстом в WPF может строится на использовании целого ряд элементов управления, предназначенных как для простого отображения текстового содержимого, так и для его редактирования. Каждый рассмотренный элемент управления имеет свои особенности и область применения. В этой части мы рассмотрели только основные моменты касающиеся работы с текстом в WPF. В дальнейшем, мы подробно изучим работу с документами в приложениях WPF