Чем отличается textbox от textblock
Перейти к содержимому

Чем отличается textbox от textblock

  • автор:

Чем отличается textbox от textblock

Элемент TextBlock служит для вывода простой текстовой информации, то есть представляет собой обычную метку. За установку текста метки отвечает свойство Text :

Для настройки шрифта мы можем использовать стандартные свойства FontSize (высота шрифта), FontFamily (семейство шрифтов), FontStretch (растяжение шрифта), FontStyle (стиль наклона), FontWeight (вес/толщина шрифта):

С помощью свойств LineHeight, TextWrapping и TextAllignment мы можем задать дополнительные настройки текста.

Свойство LineHeight позволяет указывать высоту строк.

TextWrapping

Свойство TextWrapping позволяет переносить текст. Может принимать три значения:

  • NoWrap : текст не переносится. Значение по умолчанию
  • Wrap : если ширина текстовой метки не позволяет вместить весь текст, то в ней создается новые строки, на которые переносится текст
  • WrapWholeWords : текст переносится по границам слов

Установка в коде:

textBlock.TextWrapping = TextWrapping.WrapWholeWords;
TextAllignment

Свойство TextAllignment выравнивает текст. Может принимать следующие значения:

  • Center : выравнивание по центру
  • DetectFromContent : направление выравнивания зависит от текста
  • Justify : текст не растягивается так, чтобы символы были оптимальным образом распределены по всей ширине блока
  • Left : выравнивание по левому краю
  • Right : выравнивание по правому краю

Установка в коде:

textBlock.TextAlignment = TextAlignment.Justify;
TextLineBounds

Свойство TextLineBounds устанавливает способ определения высоты для каждой строки текста в элементе. Может принимать следующие значения:

TextLineBounds in UWP

  • Full : строка имеет стандартную высоту. Значение по умолчанию
  • TrimToCapHeight : высота строки устанавливается по высоте шапки шрифта.
  • TrimToBaseline : нижний уровень строки устанавливается по опорной линии текста.
  • Tight : высота строки устанавливается по шапке шрифта, а нижний уровень — по опорной линии текста

Установка в коде:

textBlock.TextLineBounds = TextLineBounds.Full;
TextTrimming

Свойство TextTrimming устанавливает, как будет усекаться текст при выходе за пределы ограничивающего прямоугольника. Может принимать следующие значения:

  • None : текст не усекается. Значение по умолчанию
  • CharacterEllipsis : текст усекается по границе символа. На месте усечения вставляется многоточие
  • WordEllipsis : текст усекается по границе слова. На месте усечения вставляется многоточие
  • Clip : текст обрезается на уровне пикселей

Установка в коде:

textBlock.TextTrimming = TextTrimming.WordEllipsis;
TextReadingOrder и FlowDirection

Свойство FlowDirection задает направление текста — слева направо или справа налево:

  • LeftToRight : направление текста слева направо, значение по умолчанию
  • RightToLeft : направление текста справа налево

Установка в коде:

textBlock.FlowDirection = FlowDirection.RightToLeft;

Свойство TextReadingOrder также влияет на порядок чтения:

  • Default : по умолчанию не переопределяет направление содержимого. Направление задается через FlowDirection
  • DetectFromContent : корректирует порядок, в котором размещаются блоки двунаправленного текста
  • UseFlowDirection : то же самое, что и Default

Установка в коде:

textBlock.TextReadingOrder = TextReadingOrder.UseFlowDirection;

TextBox

Для ввода текста используется элемент TextBox . Он также, как и TextBlock, имеет свойства TextWrapping, TextAllignment и TextReadingOrder. Для задания шрифта текста также применяются свойства FontFamily , FontSize . Среди других свойств следует выделить MaxLength и PlaceholderText

MaxLength устанавливает предельное количество вводимых символов.

Свойство PlaceholderText задает текст по умолчанию, который отображается в поле до ввода в него символов:

Еще одно интересное свойство IsSpellCheckEnabled позволяет автоматически проверять орфографию:

Если мы введем некорректное значение, то текстовое поле его подчеркнет:

TextBox in Universal Windows Platform

Из событий элемента следует выделить событие TextChanged , которое срабатывает при изменении текста в текстовом поле. Например, подключим обработчик события:

А в файле кода пропишем сам обработчик:

private void TextBox_TextChanged(object sender, TextChangedEventArgs e) < string text = textBox1.Text; // получаем введенный текст textBlock1.Text = text; >

PasswordBox

PasswordBox применяется для ввода парольной информации. Это тоже самое текстовое поле, только для ввода символов используется маска. Свойство PasswordChar устанавливает символ маски, отображаемый при вводе пароля. Свойство Password задает парольную строку, отображаемую по умолчанию при загрузке окна приложения.

Обновление привязок

В примере из предыдущей статьи (где TextBox.Text привязывается к TextBlock.FontSize) имеется еще один нюанс. При попытке изменить отображаемый размер шрифта, вводя значение в текстовое поле, ничего не происходит. Изменение не применяется до тех пор, пока не будет совершен переход на другой элемент. Это поведение отличается от поведения, которое демонстрировалось в примере с ползунком. Там новый размер шрифта применялся после перетаскивания ползунка в другую позицию, т.е. в переходе на другой элемент вообще не было необходимости.

Чтобы понять это различие, следует повнимательнее присмотреться к выражениям привязки, которые используются этими двумя элементами управления. Когда применяется привязка OneWay или TwoWay, измененное значение распространяется от источника к цели немедленно. В случае с ползунком есть однонаправленное выражение привязки в TextBlock. Таким образом, изменения в свойстве Slider.Value немедленно отражаются в свойстве TextBlock.FontSize. То же поведение имеет место в примере с текстовым полем: изменения в источнике (которым является TextBlock.FontSize) немедленно влияют на цель (TextBox.Text).

Однако изменения, протекающие в обратном направлении — от цели к источнику — не обязательно происходят немедленно. Вместо этого их поведение управляется свойством Binding.UpdateSourceTrigger, которое принимает одно из значений, описанных ниже. Когда текст берется из текстового поля и используется для обновления свойства TextBlock.FontSize, это пример обновления цель-источник, которое использует поведение UpdateSourceTrigger.LostFocus.

PropertyChanged

Источник обновляется немедленно, когда изменяется целевое свойство

LostFocus

Источник обновляется немедленно, когда изменяется целевое свойство и цель теряет фокус

Explicit

Источник не обновляется, пока не будет вызван метод BindingExpression.UpdateSource()

Default

Поведение обновления определяется метаданными целевого свойства (формально — его свойства FrameworkPropertyMetadata.DefaultUpdateSourceTrigger). Для большинства свойств поведением по умолчанию будет PropertyChanged, хотя свойство TextBox.Text обладает поведением по умолчанию LostFocus

Помните, что эти значения не оказывают эффекта на обновление цели. Они просто управляют тем, как обновляется источник в привязках TwoWay и OneWayToSource.

Вооружившись этим знанием, можно усовершенствовать пример с текстовым полем, чтобы изменения применялись к размеру шрифта по мере их ввода в текстовое поле:

Автоматическое обновление привязки

Поведением по умолчанию свойства TextBox.Text является LostFocus просто потому, что текст в текстовом поле будет изменяться непрерывно в процессе пользовательского ввода, вызывая множественные обновления. В зависимости от того, как исходный элемент управления обновляет себя, режим обновления PropertyChanged может сделать приложение более медлительным. Вдобавок это может заставить исходный объект обновлять себя до завершения редактирования, что создаст проблемы при проверке достоверности.

Для полного контроля над моментом обновления исходного объекта можно выбрать режим UpdateSourceTrigger.Explicit. Если воспользоваться этим подходом в примере с текстовым полем, то когда текстовое поле утратит фокус, ничего не произойдет.

Вместо этого код должен будет вручную инициировать обновление. Например, можно было бы добавить кнопку Add (Добавить), которая вызовет метод BindingExpression.UpdateSource(), инициируя немедленное обновление размера шрифта. Разумеется, прежде чем можно будет вызвать метод BindingExpression.UpdateSource(), нужен способ получения объекта BindingExpression. Объект BindingExpression — это тонкая упаковка, которая содержит в себе две вещи: уже известный объект Binding (предоставленный через свойство BindingExpression.ParentBinding) и объект, привязанный от источника (BindingExpression.DataItem).

Вдобавок объект BindingExpression предоставляет два метода для запуска немедленного обновления одной части привязки: UpdateSource() и UpdateTarget().

Для получения объекта BindingExpression используется метод GetBindingExpression(), унаследованный каждым элементом от базового класса FrameworkElement, которому передается целевое свойство, имеющее привязку.

Чем отличается textbox от textblock

Элемент предназначен для вывода текстовой информации, для создания простых надписей:

 Текст1  

Ключевым свойством здесь является свойство Text , которое задает текстовое содержимое. Причем в случае Текст1 данное свойство задается неявно.

С помощью таких свойств, как FontFamily, TextDecorations и др., мы можем настроить отображение текста. Однако мы можем задать и более сложное форматирование, например:

 О негин был, по мненью многих.  

TextBlock в WPF

Элементы Run представляют куски обычного текста, для которых можно задать отдельное форматирование.

Для изменения параметров отображаемого текста данный элемент имеет такие свойства, как LineHeight , TextWrapping и TextAlignment .

Свойство LineHeight позволяет указывать высоту строк.

Свойство TextWrapping позволяет переносить текст при установке этого свойства TextWrapping=»Wrap» . По умолчанию это свойство имеет значение NoWrap , поэтому текст не переносится.

Свойство TextAlignment выравнивает текст по центру (значение Center), правому (Right) или левому краю (Left):

Для декорации текста используется свойство TextDecorations , например, если TextDecorations=»Underline» , то текст будет подчеркнут.

Если нам вдруг потребуется перенести текст на другую строку, то тогда мы можем использовать элемент LineBreak :

 Однажды в студеную зимнюю пору Я из лесу вышел 

TextBox

Если TextBlock просто выводит статический текст, то этот элемент представляет поле для ввода текстовой информации.

Он также, как и TextBlock, имеет свойства TextWrapping , TextAlignment и TextDecorations .

С помощью свойства MaxLength можно задать предельное количество вводимых символов.

Начальный текст 

В коде C# мы можем обработать событие изменения текста:

private void TextBox_TextChanged(object sender, TextChangedEventArgs e)

По умолчанию, если вводимый текст превышает установленные границы поля, то текстовое поле растет, чтобы вместить весь текст. Но визуально это не очень хорошо выглядит. Поэтому, как и в случае с TextBlock, мы можем перенести непомещающийся текст на новую строку, установив свойство TextWrapping=»Wrap».

Чобы переводить по нажатию на клавишу Enter курсор на следующую строку, нам надо установить свойство AcceptsReturn=»True» .

Также мы можем добавить полю возможность создавать табуляцию с помощью клавиши Tab, установив свойство AcceptsTab=»True»

Для отображения полос прокрутки TextBox поддерживает свойства VerticalScrollBarVisibility и НоrizontalScrollBarVisibility :

Начальный текст 

Возможно, при создании приложения нам потребуется сделать текстовое поле недоступным для ввода (на время в зависимости от условий или вообще), тогда для этого нам надо установить свойство IsReadOnly=»True» .

Для выделения текста есть свойства SelectionStart , SelectionLength и SelectionText . Например, выделим программно текст по нажатию кнопки:

Обработчик нажатия кнопки:

private void Button_Click(object sender, RoutedEventArgs e) < textBox1.SelectionStart = 5; textBox1.SelectionLength = 10; textBox1.Focus(); // данное выражение эквивалентно //textBox1.Select(5, 10); >
Проверка орфографии

TextBox обладает встроенной поддержкой орфографии. Чтобы ее задействовать, надо установить свойство SpellCheck.IsEnabled=»True» . Кроме того, по умолчанию проверка орфографии распространяется только на английский язык, поэтому, если приложение заточено под другой язык, нам надо его явным образом указать через свойство Language :

 Привет, как дила?  

Проверка орфографии в WPF

Метка (Label)

Главной особенностью меток является поддержка мнемонических команд-клавиш быстрого доступа, которые передают фокус связанному элементу. Например,

 

Теперь, нажав на клавишу «п», мы переведем фокус на связанное текстовое поле. При вызове приложения подчеркивание не отображается, чтобы отображать подчеркивание, надо нажать на клавишу Alt. Тогда чтобы перевести фокус на связанное текстовое поле необходимо будет нажать сочетание Alt + «п». Если не предполагается использование клавиш быстрого доступа, то для вывода обычной текста вместо меток лучше использовать элемент TextBlock.

PasswordBox

Элемент предназначен для ввода парольной информации. По сути это тоже текстовое поле, только для ввода символов используется маска. Свойство PasswordChar устанавливает символ маски, отображаемый при вводе пароля. Если это свойство не задано, то по умолчанию для маски символа используется черная точка. Свойство Password устанавливает парольную строку, отображаемую по умолчанию при загрузке окна приложения.

PasswordBox в WPF

RichTextBox

Для вывода текстового содержимого, насыщенного форматированием, графикой, предназначен RichTextBox. Можно даже сказать, что он выводит не просто текст, а документы с более сложным форматированием, чем обычный TextBox. Более подробно о нем, а также как на его основе создать простой текстовый редактор, мы поговорим в главе, посвященной документам.

Общие сведения о TextBlock

Элемент TextBlock управления обеспечивает гибкую поддержку текста для приложений WPF. Элемент предназначен в первую очередь к основным сценариям пользовательского интерфейса, которые не требуют более одного абзаца текста. Он поддерживает ряд свойств, которые обеспечивают точный контроль над отображением текста, например, FontFamily, FontSize, FontWeight, TextEffects и TextWrapping. Содержимое текста может быть добавлено с помощью свойства Text. При использовании в XAML содержимое между открывающим и закрывающим тегами неявно добавляется в качестве текста элемента.

С помощью XAML очень легко создать экземпляр элемента TextBlock.

 Hello, world! 

Точно так же, элемент TextBlock сравнительно легко использовать в коде.

TextBlock myTextBlock = new TextBlock(); myTextBlock.FontSize = 18; myTextBlock.FontWeight = FontWeights.Bold; myTextBlock.FontStyle = FontStyles.Italic; myTextBlock.Text = "Hello, world!"; 
Dim myTextBlock As New TextBlock() myTextBlock.FontSize = 18 myTextBlock.FontWeight = FontWeights.Bold myTextBlock.FontStyle = FontStyles.Italic myTextBlock.Text = "Hello, world!" 

См. также

Совместная работа с нами на GitHub

Источник этого содержимого можно найти на GitHub, где также можно создавать и просматривать проблемы и запросы на вытягивание. Дополнительные сведения см. в нашем руководстве для участников.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *