Прокси-сервер данных с анализом рукописного ввода

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

Типы прокси-сервера данных

Функции прокси-сервера данных позволяют приложению:

  • Интеграция данных результатов анализа обратно в существующую модель документа.
  • Сообщите предыдущие результаты (или состояние) обратно в InkAnalyzer.
  • Сообщите о состоянии, отличном от рукописного ввода, в InkAnalyzer.
  • Передавать только минимальный набор данных (как предыдущее, так и не рукописное состояние), необходимый для завершения операции анализа.
  • Легко обновите внутреннюю модель документа приложения с помощью результатов анализа.

Существует два основных подхода к прокси-серверу анализа рукописного ввода. Различия заключается в том, когда и как происходит синхронизация между моделями документов. Первый подход, синхронное обновление, требует изменения модели документа анализа рукописного ввода по мере изменения в документе приложения. Второй подход, обновление по запросу, требует, чтобы в InkAnalyzer передавались только данные, затронутые изменениями в модели документов приложения. Это значит, что в InkAnalyzer необходимо передавать только данные для частей модели документа анализа рукописного ввода, которые находятся в той же области, что и изменения документа приложения.

Синхронное обновление

Для синхронного обновления требуется изменение (создание и удаление) узлов в коллекции объектов ContextNode объекта InkAnalyzer, так как они происходят в документе приложения. Например, при каждом добавлении текстового слова в приложение в InkAnalyzer создается соответствующий объект ContextNode в стиле TextWord. Если расположение текстового слова на странице изменяется, то расположение соответствующего ContextNode обновляется одновременно. Этот метод менее эффективен с точки зрения вычислительных ресурсов, чем метод по запросу, так как каждое изменение документа включает обновление InkAnalyzer, даже если это изменение не влияет на анализ рукописного ввода.

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

  1. Пользователь создает новые данные.
  2. Приложение определяет способ обработки данных, их хранения и отрисовки.
  3. В практических целях следующие действия будут выполняться одновременно.
    1. Приложение помещает данные в модель документа.
    2. Приложение создает InkAnalyzer и обновляет его. Одновременное выполнение этого действия гарантирует, что InkAnalyzer всегда содержит самую последнюю информацию.
    3. Приложение вызывает BackgroundAnalyze в InkAnalyzer , чтобы начать анализ.
  4. Если изменение включает рукописный ввод, и InkAnalyzer определяет новые результаты, возникает ряд событий. Для каждого изменения, внесенного в коллекцию объектов ContextNode в InkAnalyzer, создается одно событие. К этим событиям относятся ContextNodeCreated, ContextNodeDeleting, ContextNodeMovingToPosition, ContextNodePropertiesUpdated, ContextNodeLinkAdding, ContextNodeLinkDeleting и ContextNodeReparenting. Приложение обрабатывает эти события для перенаправления результатов операции анализа обратно в модель документа по мере необходимости.
  5. Приложение обновляет макет документа, извлекая новые данные из модели документа.
  6. Новые данные отрисовывается пользователю.

Обновление по запросу

Подход по запросу требует, чтобы данные передавались только для тех объектов ContextNode , которые находятся в анализируемых областях. Необходимые объекты ContextNode извлекаются из модели документов приложения сразу после вызова операции анализа и еще раз перед согласованием результатов. Хотя реализация более сложна, чем синхронные обновления, этот подход дает лучшие результаты производительности.

Общие сведения об анализе рукописного ввода

Класс InkAnalyzer (C++)

Microsoft.Ink.InkAnalyzer

Microsoft.Ink.ContextNode