Как я могу сделать распознавание рукописного ввода каждый раз, когда пользователь завершил отслеживание удара?

Основываясь на коде, предоставленном MSDN для распознавания рукописного ввода в приложениях Windows 10, я пытался заставить его распознавать рукописный текст автоматически после того, как пользователь закончил отслеживать чернильный штрих, а не при нажатии кнопки.

Я смог сделать нечто подобное в приложении метро Windows 8.1, вызвав метод распознавания рукописного ввода, когда событие PointerReleased было запущено на моем холсте. Это работало отлично, и я пытался подражать тому же поведению в UWP.

Событие PointerReleased не запускалось в приложении UWP, поэтому я вместо этого использовал событие InkCanvas.InkPresenter.StrokeInput.StrokeEnded для вызова этого метода:

async void RecognizeAsync(InkStrokeInput input, PointerEventArgs e)
{
    IReadOnlyList<InkStroke> currentStrokes =myInkCanvas.InkPresenter.StrokeContainer.GetStrokes();
    if (currentStrokes.Count > 0)
    {
        var recognitionResults = await inkRecognizerContainer.RecognizeAsync(myInkCanvas.InkPresenter.StrokeContainer, InkRecognitionTarget.All);

        if (recognitionResults.Count > 0)
        {
            // Display recognition result
            string str = "Recognition result:";
            foreach (var r in recognitionResults)
            {
                str += " " + r.GetTextCandidates()[0];
            }
            Status.Text=str;
        }
        else
        {
            Status.Text = "No text recognized.";
        }
    }
    else
    {
        Status.Text="Must first write something.";
    }
}

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

Я попытался обойти эту проблему, добавив Strokes, соответствующий InkStrokeInput события, в StrokeContainer, который я использую в качестве параметра для распознавания:

InkStrokeContainer totalStrokes=new InkStrokeContainer();
if (currentStrokes.Count > 0) {
    totalStrokes= myInkCanvas.InkPresenter.StrokeContainer;
}
totalStrokes.AddStrokes(input.InkPresenter.StrokeContainer.GetStrokes());

var recognitionResults = await inkRecognizerContainer.RecognizeAsync(totalStrokes, InkRecognitionTarget.All);

Но input.InkPresenter.StrokeContainer.GetStrokes() возвращает пустой список.

Есть ли способ для меня, чтобы получить доступ к текущему Stroke, когда событие инициируется? Или есть другое событие, которое я мог бы использовать, чтобы вызвать распознавание рукописного ввода после того, как штрих был "обработан"? Или другой способ автоматического распознавания почерка для всех текущих InkStrokes?

1 ответ

Решение

Я нашел способ достичь результата, которого я ожидал, вызвав мой метод RecognizedAsync, когда срабатывает событие InkCanvas.InkPresenter.StrokesCollected.

Из документации MSDN:

Событие InkPresenter.StrokesCollected

Происходит, когда один или несколько чернильных штрихов обрабатываются (от "мокрой" до "сухой")> прикладной нитью.

По умолчанию чернильный штрих обрабатывается на фоновой нити с низкой задержкой и> отображается как влажный при его рисовании. Когда обводка завершена (перо или палец> подняты или кнопка мыши отпущена), обводка обрабатывается в потоке пользовательского интерфейса> и отображается в виде слоя InkCanvas (над содержимым приложения).

Другие вопросы по тегам