Главная » Silverlight » Текстовые элементы управления

0

Платформа Silverlight предоставляет два текстовых элемента управления: текстовое поле TextBox и поле ввода пароля PasswordBox. Элемент TextBox поддерживает все средства, присущие традиционным текстовым полям Windows, включая прокручива­ние, перенос в следующую строку, копирование и вставку, выделение фрагментов и т.д.

В текстовом поле всегда отображается строка, хранящаяся в свойстве Text. Выравнивание текста можно задать с помощью свойства TextAlignment. Кроме того, в текстовом поле можно применять все свойства шрифтов, перечисленные выше в табл. 5.2.

Обычно элемент управления TextBox содержит одну строку текста (количество сим­волов можно ограничить с помощью свойства MaxLength). Однако текст может пере­носиться на многие строки. Это можно сделать двумя способами. Во-первых, перенос можно задать с помощью свойства TextWrapping, и, во-вторых, присвоив свойству AcceptsReturn значение true, можно разрешить пользователю вставлять разрывы строк с помощью клавиши <Enter>.

Иногда элемент управления TextBox создается только для отображения текста. В этом случае присвойте свойству isReadOnly значение true, чтобы запретить редактирова­ние. Это лучше, чем отключить текстовое поле с помощью свойства IsEnabled, потому что отключенное текстовое поле выводит затененный текст, который тяжелее читать. Кроме того, в этом случае не поддерживаются выделение и копирование в буфер обмена.

Выделение текста

Как вы уже знаете, в элементе управления TextBox текст можно выделять, переме­щая по нему указатель или нажав клавишу <Shift> и перемещая курсор с помощью кла­виш со стрелками. Класс TextBox предоставляет возможность читать и устанавливать свойства выделенного фрагмента программно с помощью свойств SelectionStart, SelectionLength И SelectedText.

Свойство SelectionStart содержит позицию первого выделенного символа. Отсчет позиций начинается с нуля. Например, если значение SelectionStart равно 10, то первый выделенный символ расположен в 11-й позиции текстового поля. Свойство SelectionLength содержит общее количество выделенных символов. Если ни один сим­вол не выделен, оно равно нулю. Свойство SelectedText содержит выделенный текст.

Задать реакцию на изменение выделения можно, установив обработчик события Select і onChanged. Приведенный ниже обработчик события SelectionChanged выво­дит информацию о выделении при каждом изменении свойств выделения.

private void txt_SelectionChanged(object sender,

RoutedEventArgs e)

{

if (txtSelection == null) return; txtSelection.Text = String.Format(

"первый выделенный символ в позиции {0};" +

"\n количество выделенных символов; {1};" +

"\n"выделенный фрагмент: \"{2}\"",

 txt.SelectionStart, txt.SelectionLength, txt.SelectedText);

}

Результат показан на рис. 5.13.

Рис. 5.13. Реакция на изменение параметров выделения

Поле ввода пароля PasswordBox

Для ввода пароля предназначен элемент управления PasswordBox. Он выглядит так же, как и TextBox, но вместо символов отображает кружочки, чтобы замаскировать пароль. Задать вывод, вместо кружочков, других символов можно с помощью свойства PasswordChar. Введенный текст хранится в свойстве Password, откуда его можно из­влечь программно (можно также записать в поле другой текст). Свойства Text у эле­мента PasswordBox нет.

Кроме того, элемент управления PasswordBox не поддерживает буфер обмена. Это означает, что пользователь не может копировать текст из поля или в поле с помощью комбинации клавиш <Ctrl+C>. Выделять фрагменты текста невозможно, и свойства SelectedText нет.

Примечание. В технологии WPF элемент PasswordBox хранит в памяти зашифрованный пароль, что предотвращает его извлечение некоторыми методами, например с помощью дампа памяти. В Silverlight пароль хранится в незашифрованном виде, как обычный текст.

Поле AutoCompleteBox

В объекте AutoCompleteBox поле ввода совмещено с раскрывающимся списком под­сказок. Такое средство встречается во многих местах Интернета, включая поле поиска Google на домашней странице и адресную строку Internet Explorer.

В Silverlight для этого реализован мощный элемент управления, предоставляющий несколько способов определения пунктов, появляющихся в раскрывающемся списке. Проще всего начать с обычного определения объекта AutoCompleteBox.

cinput:AutoCompleteBox x:Name="txtMonth">

</input:AutoCompleteBox>

При перетаскивании AutoCompleteBox из окна инструментов на страницу Visual Studio создает псевдоним input.

<UserControl xmlns:input= "clr-namespace:System.Windows.Controls; assembly=System.Windows.Controls.Input" … >

После добавления AutoCompleteBox в приложение, создайте массив или список, со­держащий коллекцию подсказок (без определенной последовательности), и присвойте коллекцию свойству AutoCompleteBox. ItemsSource. Обычно эта операция выполняет­ся при первой загрузке страницы. Для этого добавьте коллекцию в конструктор страни­цы или обработчик события UserControl .Loaded.

Ниже приведен пример массива, содержащего названия месяцев.

string!] monthList = {"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"};

txtMonth.ItemsSource = monthList;

Этого достаточно для реализации поведения, установленного по умолчанию. Когда пользователь вводит буквы в поле во время выполнения, появляется раскрывающийся список с подсказками (рис. 5.14). Чтобы выбрать предлагаемый элемент, не вводя все название месяца вручную, нужно щелкнуть на нем мышью или прокрутить список с по­мощью клавиш со стрелками.

Рис. 5.15. Пользовательская фильтрация; объект обнаружен на основе фрагмента кода продукта

Динамический список подсказок

До сих пор мы рассматривали применение свойства ItemsSource для заполнения объекта AutoCompleteBox коллекцией подсказок. Однако для этого нужно иметь пол­ный список разумных размеров. Если же информация извлекается из дополнительных источников или список очень большой, загружать одновременно весь список непрак­тично. Необходимо применить другой подход. Например, свойство ItemsSource можно установить не при создании страницы, а в реальном времени — в процессе ввода букв пользователем.

Для этого присвойте свойству FilterMode значение None и создайте обработчик события Populating. Оно генерируется каждый раз, когда объект AutoCompleteBox готов начать поиск. По умолчанию это происходит в момент нажатия клавиши пользователем. Облегчить задачу для объекта AutoCompleteBox можно с помощью свойств MinimumPrefixLength и MinimumPopupDelay, которые рассматриваются в кон­це раздела. Обработка события Populating объявляется следующим образом.

<input:AutoCompleteBox x:Name="acbProducts" FilterMode="None"

Populating="acbProducts_Populating"> </input:AutoCompleteBox>

Когда генерируется событие Populating, можно либо немедленно установить свой­ство ItemsSource, либо запустить для этого асинхронный процесс. Непосредственная установка свойства ItemsSource имеет смысл, если список подсказок существует или его можно быстро сгенерировать. Список подсказок немедленно появится в раскрываю­щемся списке.

Иногда получение списка подсказок занимает много времени, например, если для этого нужно выполнить много вычислений или передать запрос веб-службе. В этих слу­чаях лучше запустить асинхронный процесс. Его можно создать с помощью средств многопоточности (см. главу 19), однако это не обязательно. Ряд средств Silverlight со­держит встроенную поддержку асинхронного выполнения (например, веб-служба Silverlight, в которой жестко закодированы асинхронные вызовы).

При использовании асинхронных операций необходимо явно отменить нормальный процесс обработки события Populating. Для этого присвойте свойству Populating- EventArgs .Cancel значение true и только после этого запустите асинхронную опера­цию. В следующем примере список подсказок извлекается асинхронно из веб-службы (кодирование и применение веб-служб рассматривается в главе 15).

private void acbProduct_Populating(object sender,

PopulatingEventArgs e)

{

// Извещение обработчика о том, II что задача решается асинхронно е.Cancel = true;

II Создание объекта веб-службы ProductAutoCompleteClient service = new ProductAutoCompleteClient();

// Подключение обработчика к событию завершения service.GetProductMatchesCompleted += GetProductMatchesCompleted;

// Асинхронный вызов веб-службы

service.GetProductMatchesAsync(е.Parameter);

}

На веб-сервере код метода GetProductMaches () выполняется и возвращает совпадения.

public string[] GetProductMatches(string inputText)

{

II Получение информации о продуктах (например, из

// серверной базы данных)

Product[] products = GetProducts () ;

// Создание коллекции совпадений

List<string> productMatches = new List<string> () ;

foreach (Product product in products) {

// Проверка совпадения

if ((product.ProductName.StartsWith (inputText)) I I (product.ProductCode.Contains(inputText)))

productMatches.Add(product.ProductName);

}

)

// Возвращение списка совпадений

return productMatches.ToArray();

}

Когда асинхронная операция завершается и приложение Silverlight получает резуль­тат, свойство ItemsSource заполняется списком подсказок. После этого нужно вызвать метод PopulateComplete () для извещения объекта AutoCompleteBox о поступлении но­вых данных. Ниже приведен обработчик обратного вызова, решающий эту задачу для текущего примера.

private void GetProductMatchesCompleted (object sender, GetProductMatchesCompletedEventArgs e)

{

// Проверка, произошла ли ошибка веб-службы

if (е.Error != null)

{

lblStatus.Text = e.Error.Message;

return;

}

// Установка подсказок

acbProducts.ItemsSource = e.Result;

// Извещение объекта AutoCompleteBox о получении данных

acbProducts.PopulateComplete ();

}

При заполнении объекта AutoCompleteBox данными, получение которых за­нимает много времени или требует применения асинхронных операций, рекомен­дуется настроить свойства MinimumPrefixLength и MinimumPopupDelay. Свойство MinimumPrefixLength определяет, сколько букв должно быть введено в поле AutoCompleteBox, чтобы началось создание подсказок. Обычно AutoCompleteBox пред­лагает подсказки уже после первой буквы. Если, например, нужно начать создание подсказок только после третьей буквы, присвойте свойству MinimumPrefixLength зна­чение 3 (это стандартное значение, используемое текстовыми полями Ajax на многих веб-страницах). С помощью свойства MinimumPopulateDelay можно заставить объект AutoCompleteBox подождать некоторое время после нажатия клавиши пользователем. Возможно, пользователь сам быстро предоставит значение, и обращение к медленной веб-службе не понадобится. Конечно, значение MinimumPopulateDelay никак не влия­ет на реальное время ожидания подсказок. Оно зависит от других факторов: времени инициализации запроса, быстродействия канала связи, загруженности сервера и т.д.

Источник: Мак-Дональд, Мэтью. Silverlight 3 с примерами на С# для профессионалов. : Пер. с англ. —- М. : ООО «И.Д. Вильяме», 2010. — 656 с. : ил. — Парал. тит. англ.

По теме:

  • Комментарии