Поделиться через


Настраиваемые текстовые входные данные

Основные API текста в пространстве имен Windows.UI.Text.Core позволяют приложению Windows получать текстовые данные от любой текстовой службы, поддерживаемой на устройствах Windows. API подобны API Платформы текстовых служб тем, что для приложения не требуется глубоких знаний о текстовых службах. Это позволяет приложению получать текст на любом языке и из любого типа ввода (например, клавиатуры, речи или пера).

Важные API: Windows.UI.Text.Core, CoreTextEditContext

Зачем использовать основные API текста?

Для многих приложений элементы управления XAML или текстового поля HTML достаточно для ввода текста и редактирования. Однако если приложение обрабатывает сложные текстовые сценарии, например приложение для обработки слов, может потребоваться гибкость пользовательского элемента управления редактирования текста. Вы можете использовать API клавиатуры CoreWindow для создания элемента управления редактированием текста, но они не предоставляют способ получения текстовых данных на основе композиции, который необходим для поддержки языков Восточной Азии.

Вместо этого используйте API Windows.UI.Text.Core , когда необходимо создать пользовательский элемент управления редактирования текста. Эти API предназначены для обеспечения много гибкости при обработке текстовых данных на любом языке и позволяют обеспечить оптимальный подход к тексту для вашего приложения. Элементы управления вводом текста и редактированием, созданные с помощью основных API текста, могут получать текстовые данные от всех существующих методов ввода текста на устройствах Windows, от редакторов методов ввода на основе Text Services Framework (IMEs) и рукописного ввода на компьютерах на клавиатуре WordFlow (которая обеспечивает автоматическое исправление, прогнозирование и диктовку) на мобильных устройствах.

Architecture

Ниже приведено простое представление системы ввода текста.

  • Приложение представляет приложение Windows, в котором размещен пользовательский элемент управления редактирования, созданный с помощью основных API текста.
  • API Windows.UI.Text.Core упрощают взаимодействие с текстовыми службами через Windows. Обмен данными между элементом управления редактированием текста и текстовыми службами обрабатывается главным образом с помощью объекта CoreTextEditContext , который предоставляет методы и события для упрощения взаимодействия.

Схема архитектуры CoreText

Выбор и диапазоны текста

Элементы управления редактированием предоставляют место для записи текста, и пользователи ожидают редактирования текста в любом месте этого пространства. Здесь мы объясним систему размещения текста, используемую основными API текста, и как диапазоны и выделения представлены в этой системе.

Позиция каретки в приложении

Диапазоны текста, используемые с основными API текста, выражаются с точки зрения позиций курсора. Значение "Позиция курсора в приложении (ACP)" — это нулевая точка отсчета сколько символов находится с начала текстового потока непосредственно перед курсором, как показано здесь.

Снимок экрана с показателем позиции курсора в приложении (ACP) и количеством символов

Интервалы текста и выделение

Текстовые диапазоны и выделения представлены структурой CoreTextRange , содержащей два поля:

Поле Тип данных Description
StartCaretPosition Число [JavaScript] | System.Int32 [.NET] | int32 [C++] Начальная позиция диапазона — ACP непосредственно перед первым символом.
EndCaretPosition Число [JavaScript] | System.Int32 [.NET] | int32 [C++] Конечное положение диапазона — ACP сразу после последнего символа.

 

Например, в текстовом диапазоне, показанном ранее, диапазон [0, 5] указывает слово "Hello". StartCaretPosition всегда должно быть меньше или равно EndCaretPosition. Диапазон [5, 0] недопустим.

Точка вставки

Текущая позиция курсора, часто называемая точкой вставки, представлена параметром StartCaretPosition равным EndCaretPosition.

Неконтигентный выбор

Некоторые элементы управления редактированием поддерживают неконтигированные выделения. Например, приложения Microsoft Office поддерживают несколько произвольных выборок, а многие редакторы исходного кода поддерживают выбор столбцов. Однако основные API текста не поддерживают несмежные выделения. Элементы управления редактирования должны сообщать только один непрерывный выбор, чаще всего активный поддиапазон неконтинуальных выборок.

Например, на следующем рисунке показан текстовый поток с двумя несвязанными выделениями: [0, 1] и [6, 11], для которых элемент управления редактированием должен сообщать только один ([0, 1] или [6, 11]).

Снимок экрана: несоотложный фрагмент текста, где выбран первый символ и последние пять символов.

Работа с текстом

Класс CoreTextEditContext позволяет потоку текста проходить между Windows и элементами управления редактированием через событие TextUpdating, событие TextRequested и метод NotifyTextChanged.

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

При изменении текста в элементе управления редактированием, например путем вставки текста в элемент управления, необходимо уведомить Windows, вызвав NotifyTextChanged.

Если службе текста требуется новый текст, создается событие TextRequested . Необходимо указать новый текст в обработчике событий TextRequested .

Принятие текстовых обновлений

Элемент управления редактирования обычно должен принимать запросы на обновление текста, так как они представляют текст, который пользователь хочет ввести. В обработчике событий TextUpdating эти действия ожидаются в элементе управления редактированием:

  1. Вставьте текст, указанный в CoreTextTextUpdatingEventArgs.Text , в положение, указанное в CoreTextTextUpdatingEventArgs.Range.
  2. Поместите выделение на позиции, указанной в CoreTextTextUpdatingEventArgs.NewSelection.
  3. Уведомите систему об успешном обновлении, задав CoreTextTextUpdatingEventArgs.Result значение CoreTextTextUpdatingResult.Succeeded.

Например, это состояние поля ввода перед вводом "d". Точка вставки находится в [10, 10].

Снимок экрана: схема текстового потока с точкой вставки [10, 10], перед вставкой

Когда пользователь вводит "d", вызывается событие TextUpdating со следующими данными CoreTextTextUpdatingEventArgs :

В элементе управления редактированием примените указанные изменения и задайте Result на успешно. Ниже приведено состояние элемента управления после применения изменений.

Снимок экрана: показана диаграмма текстового потока с точкой вставки в \[11, 11\], после вставки

Отклонение текстовых обновлений

Иногда нельзя применять обновления текста, так как запрошенный диапазон находится в области элемента управления редактирования, который не должен быть изменен. В этом случае не следует применять какие-либо изменения. Вместо этого уведомите систему о сбое обновления, задав CoreTextTextUpdatingEventArgs.Result значение CoreTextTextUpdatingResult.Failed.

Например, рассмотрим элемент управления редактированием, который принимает только адрес электронной почты. Пробелы должны быть отклонены, так как адреса электронной почты не могут содержать пробелы, поэтому при возникновении событий TextUpdating для клавиши пробела, необходимо просто задать Result в элементе управления редактирования на Failed.

Уведомление об изменениях текста

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

Например, это состояние элемента управления редактирования, прежде чем пользователь вставляет "World". Точка вставки находится в [6, 6].

Снимок экрана: схема текстового потока с точкой вставки [6, 6], перед вставкой

Пользователь выполняет действие вставки и элемент управления редактирования после применения изменений:

Снимок экрана: схема текстового потока с точкой вставки в \[11, 11\], после вставки

В этом случае следует вызвать NotifyTextChanged с этими аргументами:

  • modifiedRange = [6, 6]
  • newLength = 5
  • newSelection = [11, 11]

Одно или несколько событий TextRequested последуют, и которые вы обрабатываете для обновления текста, с которыми работают текстовые службы.

Переопределение обновляемого текста

В элементе управления редактирования может потребоваться переопределить текстовое обновление, чтобы обеспечить функции автоматической коррекции.

Например, рассмотрим элемент редактирования с функцией исправления, которая формализует сокращения. Это состояние элемента управления редактирования перед тем, как пользователь вводит ключ пространства для активации исправления. Точка вставки находится в [3, 3].

Снимок экрана: схема текстового потока с точкой вставки [3, 3], перед вставкой

Пользователь нажимает пробел и вызывает соответствующее событие TextUpdating . Элемент управления редактирования принимает обновление текста. Это состояние элемента управления редактирования в течение короткого момента до завершения исправления. Точка вставки находится в [4, 4].

Снимок экрана: схема текстового потока с точкой вставки [4, 4], после вставки

За пределами обработчика событий TextUpdating элемент управления редактированием делает следующее исправление. Это состояние элемента управления редактирования после завершения исправления. Точка вставки находится в [5, 5].

Снимок экрана: диаграмма текстового потока с точкой вставки в [5, 5]

В этом случае следует вызвать NotifyTextChanged с этими аргументами:

  • modifiedRange = [1, 2]
  • newLength = 2
  • newSelection = [5, 5]

Одно или несколько событий TextRequested последуют, и которые вы обрабатываете для обновления текста, с которыми работают текстовые службы.

Предоставление запрошенного текста

Важно, чтобы текстовые службы имели правильный текст для предоставления таких функций, как автоматическое исправление или прогнозирование, особенно для текста, который уже существовал в элементе управления редактированием, от загрузки документа, например или текста, вставленного элементом управления редактирования, как описано в предыдущих разделах. Поэтому всякий раз, когда возникает событие TextRequested , необходимо указать текст в элементе управления редактирования для указанного диапазона.

Иногда диапазон в CoreTextTextRequest указывает на диапазон, который элемент управления редактированием не может разместить в текущем виде. Например, диапазон больше размера управляющего элемента редактирования во время события TextRequested, или конец диапазона превышает допустимые границы. В этих случаях следует возвращать любой подходящий диапазон, который, как правило, является подмножеством запрошенного диапазона.

Samples

Архивные примеры