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


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

Основные 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 (которая обеспечивает автоматическое исправление, прогнозирование и диктовку) на мобильных устройствах.

Архитектура

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

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

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

Диапазоны текста и выделение

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

Положение в уходу за приложением

Диапазоны текста, используемые с основными API текста, выражаются с точки зрения позиций курсора. Значение "Позиция Application Caret (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 to Succeeded. Ниже приведено состояние элемента управления после применения изменений.

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

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

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

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

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

Иногда элемент управления редактированием вносит изменения в текст, например при вставлении или автоматическом исправлении текста. В таких случаях необходимо уведомить текстовые службы этих изменений, вызвав метод 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, или конец диапазона выходит за рамки. В этих случаях следует возвращать любой диапазон, который обычно является подмножеством запрошенного диапазона.

Примеры

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