Label vs TextBlock
чем отличаются эти 2 контрола? вроде и тот и другой только выводят текст. в windows forms всегда для этого был один label, зачем тогда тут ввели этот textblock?
Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
ProgressBar. Отображение % выполнения на label — как сделать фон label прозрачным?
Есть прогрессбар, есть лэйбл, на котором отображается ход выполнения. Лэйбл помещена на.
Не срабатывает Label _Click при программном создании Label на UserForm
Всем доброго времени суток! После программного создания Label: With.
Обьект Label(сумма своих денег+заработанные= вывести в Label)
здравствуйте скажите пожалуйста: у меня стоит timer хочу чтобы он прибавлял в label число и.
Как вставить текст в label на середине, то есть на центре label?
Здравствуйте. Как вставить текст в label на середине, то есть на центре label?
746 / 487 / 187
Регистрация: 30.12.2012
Сообщений: 1,278
Записей в блоге: 2
Сообщение было отмечено Penelent как решение
Решение
Penelent, если коротко, то Label — тяжелый, TextBlock — лёгкий. TextBlock наследует напрямую от FrameworkElement, и, в отличие от Label, не тащит за собой всю функциональность ContentControl, от которого наследует Label. Если нужен способ отобразить только текст — выбирайте TextBlock.
141 / 117 / 26
Регистрация: 07.12.2014
Сообщений: 371
А ещё label может иметь только один вложенный элемент, а textblock несколько, что иногда ползено когда куски отображаемого текста зависят о каких-то условий, например, во ViewModel
19 / 18 / 14
Регистрация: 06.03.2013
Сообщений: 335
Penelent, Tsin, Vigelforts, Не знаю как для вас а для меня важным преимуществом textblock’а это то что textblock легче всего отцентрировать
Регистрация: 17.07.2018
Сообщений: 1
Регистрация: 30.04.2014
Сообщений: 938
Сообщение от Tsin
Label — тяжелый, TextBlock — лёгкий
Это сказывается на скорости работы приложения?
15102 / 10394 / 2731
Регистрация: 21.04.2018
Сообщений: 30,823
Записей в блоге: 2
Сообщение от Khludenkov
Это сказывается на скорости работы приложения?
Если их несколько сот, то да.
Скорость работы у них значительно будет отличаться.
Но по сравнению со скоростью GUI, работы пользователя — это не существенно.
Но другой аспект гораздо важнее.
Label — это ContentControl.
И он сам по себе никакой текст вывести не может.
Для вывода текста он использует шаблон данных по умолчанию,
А шаблон данных по умолчанию — это TextBlock!
То есть такой код label.Content = «Любой текст»; как бы будет динамически транслирован в label.Content= new TextBlock() ; .
А он будет обёрнут ещё ContentPresenter и Border.
Если во время исполнения программы вы откроете «Динамическое визуальное дерево», то увидите это сами.
А TextBlock — это очень простой элемент.
Он даже не Контрол и у него нет шаблона.
Он производный непосредственно от FrameworkElement.
Чем отличается textbox от textblock
Элемент предназначен для вывода текстовой информации, для создания простых надписей:
Текст1
Ключевым свойством здесь является свойство Text , которое задает текстовое содержимое. Причем в случае
С помощью таких свойств, как FontFamily, TextDecorations и др., мы можем настроить отображение текста. Однако мы можем задать и более сложное форматирование, например:
О негин был, по мненью многих.
Элементы 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 :
Привет, как дила?
Метка (Label)
Главной особенностью меток является поддержка мнемонических команд-клавиш быстрого доступа, которые передают фокус связанному элементу. Например,
Теперь, нажав на клавишу «п», мы переведем фокус на связанное текстовое поле. При вызове приложения подчеркивание не отображается, чтобы отображать подчеркивание, надо нажать на клавишу Alt. Тогда чтобы перевести фокус на связанное текстовое поле необходимо будет нажать сочетание Alt + «п». Если не предполагается использование клавиш быстрого доступа, то для вывода обычной текста вместо меток лучше использовать элемент TextBlock.
PasswordBox
Элемент предназначен для ввода парольной информации. По сути это тоже текстовое поле, только для ввода символов используется маска. Свойство PasswordChar устанавливает символ маски, отображаемый при вводе пароля. Если это свойство не задано, то по умолчанию для маски символа используется черная точка. Свойство Password устанавливает парольную строку, отображаемую по умолчанию при загрузке окна приложения.
RichTextBox
Для вывода текстового содержимого, насыщенного форматированием, графикой, предназначен RichTextBox. Можно даже сказать, что он выводит не просто текст, а документы с более сложным форматированием, чем обычный TextBox. Более подробно о нем, а также как на его основе создать простой текстовый редактор, мы поговорим в главе, посвященной документам.
Элемент TextBlock
TextBlock нельзя назвать элементом управления (control), сам по себе он не наследует класс Control, но используется как и большинство других «контролек» в рамках WPF, так что, ради упрощения процесса, отнесем текстовое поле к элементам управления.
Элемент TextBlock является одним из самых фундаментальных в WPF, поскольку он очень полезен в использовании. Он позволяет разместить текст на экране, как Label, но при этом прост в использовании и не требователен к ресурсам. В общем восприятии, Label это короткий однострочный текст (но может включать в себя, например, изображение), в то время как TextBlock отлично справляется еще и с многострочным текстом, но содержать в себе может исключительно текст (string). Label и TextBlock могут предложить свои уникальные достоинства, но что Вам выбрать — будет очень зависеть от ситуации.
Мы уже использовали TextBlock в главе «Hello, WPF!», но сейчас, давайте рассмотрим этот элемент в его простейшей форме:
This is a TextBlock
Это так же просто, как и написано, и, если Вы читали предыдущие разделы данного руководства, то в принципе, не найдете здесь чего-то нового. Текст между открывающим и закрывающим тегами — это упрощенный вариант определения свойства Text текстового поля.
Для следующего примера давайте выведем более длинный текст и посмотрим как TextBlock с ним справится. Также я добавлю отступы, для более элегантного вида:
This is a TextBlock control and it comes with a very long text
Работа с большими строками
Скоро скриншот с примером Вас убедит в том, что TextBlock отлично справляется с длинными, многосторчными текстами, но, к сожалению, это не работает по умолчанию. В таком случае, когда текст слишком длинный, для отображения внутри окна, по умолчанию, WPF отобразит максимальное количество знаков, которое вместится по ширине, и просто прекратит дальнейший рендер текста.
К счастью, существует несколько вариантов решения этой проблемы. В следующем примере я покажу Вам их все и позже объясню функционирование каждого из них:
This is a TextBlock control with multiple lines of text. This is a TextBlock control with text that may not be rendered completely, which will be indicated with an ellipsis. This is a TextBlock control with automatically wrapped text, using the TextWrapping property.
Здесь было предствлено три элемента TextBlock, каждый разного цвета (свойство Foreground), для наглядности. В каждом решение проблемы большого текста решается по своему:
Красный TextBlock использует тег LineBreak для ручного возврата каретки. Это дает Вам абсолютный контроль над тем, где Вы хотите прервать строку и начать ее с новой, но такое решение недостаточно гибкое для большинства ситуаций. Если пользователь увеличивает окно, текст остается прерванным в том же месте, хотя места для текста размещенного в одну строку уже будет более чем достаточно.
Зеленый TextBlock использует свойство TextTrimming со значением CharacterEllipsis, для того, чтобы в конце строки TextBlock добавить многоточие, когда текст уже не будет вмещаться по ширине. Это распространенный метод сигнализирования о том, что текста имеется больше, чем позволяет вместить контейнер. Это может пригодиться в ситуации, когда у Вас есть слишком длинный текст, но Вы не сильно уж и хотите готовить для него дополнительную строку. Альтернативой значению CharacterEllipsis является WordEllipsis, которое при недостатке пространства для текста по ширине, обрежет его до целого слова, вместо того, чтобы вставить многоточие в середине слова.
И третий вариант — синий TextBlock использует свойство TextWrapping со значением Wrap для того, чтобы переносить текст на новую строку всегда, когда текст уже не помещается. В отличие от первого текстового поля, в котором мы вручную управляли переносом строки, здесь, процесс является полностью автоматическим и имеет еще одно достоинство: в случае, когда меняется размер текстового поля, переносы строк обновляются сами. Делая окно больше или меньше Вы можете заметить как ширина строк и переносы приспосабливаются к новым условиям.
Здесь был описан процесс работы с простыми строками в TextBlock. В следующей главе мы рассмотрим более продвинутый функционал этого элемента, который позволит создавать текст различных стилей в TextBlock и многое другое.
Элемент TextBox
Этот элемент управления является базовым, среди полей ввода в WPF, и позволяет конечному пользователю вводить текст, как простой однострочный (диалоговое окно), так и многострочный (редактор).
Однострочный TextBox
TextBox является крайне часто используемым элементом, и Вам даже нет необходимости использовать множество свойств для того, чтобы получить полномасштабное текстовое поле для ввода. Вот пример скелета такого элемента:
Это все, что Вам необходимо для получения текстового поля ввода. Я добавил в него текст после запуска примера и сделал скриншот. Но Вы также можете сделать это в коде, предварительно заполнив поле, используя свойство Text:
Попробуйте кликнуть правой кнопкой мыши на TextBox. Вы увидите меню с опциями, позволяющими Вам использовать TextBox с буфером обмена Windows. Горячие клавиши отмены и повтора (Ctrl+Z и Ctrl+Y) будут работать по умолчанию, и этот функционал Вы получаете сразу же, «from box»!
Многострочный TextBox
Запустив предыдущий пример, Вы заметите, что TextBox по умолчанию является однострочным элементом. Ничего не произойдет при нажатии на Enter, и если Вы введете больше текста, чем позволяет одна строка, ввод просто прекратится. Однако, достаточно просто сделать из TextBox многострочный редактор:
Здесь я добавил два свойства: AcceptsReturn превращает TextBox в многострочный элемент, позволяя использовать клавишу Enter/Return для перехода на следующую строку, а свойство TextWrapping реализует автоматический перенос строки на новую, при достижении конца строки.
Проверка орфографии в TextBox
Дополнительным бонусом TextBox является то, что он поддерживает автоматическую проверку орфограции английского и некоторых других языков (французский, немецкий и испанский).
Этот механизм похож на проверку в Microsoft Word, где ошибки написания подчеркиваются, и, по нажатию правой кнопкой мыши, Вам предлагаются варианты исправления. Включить эту проверку в TextBox очень легко:
В качестве основы мы использовали предыдущий пример многострочного TextBox, при этом я добавил два новых свойства: SpellCheck.IsEnabled, которое включает проверку орфографии элемента и Language — информирующий приложение о том, какой язык используется по умолчанию.
TextBox и работа с выделенными словами
Как и любой другой элемент управления Windows, TextBox позволяет выделять текст: например для удаления слова или вставки текста из буфера обмена. TextBox в WPF имеет несколько свойств для работы с выделенным текстом, которые Вы можете либо пронаблюдать, либо изменить. В следующем примере мы проанализируем следующие свойства:
Пример состоит из двух элементов 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().
This article has been fully translated into the following languages:
Is your preferred language not on the list? Click here to help us translate this article into your language!