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