Basing myself on the code given by MSDN for Handwriting Recognition in windows 10 apps, I tried to have it recognize the handwriting automatically after the user has finished tracing an ink stroke rather than when clicking a button.
I have been able to do something similar in a Windows 8.1 metro app by calling my handwriting recognition method when the PointerReleased event was triggered in my canvas. It worked great and I tried to emulate the same behavior in UWP.
The PointerReleased event was not firing in the UWP app so I used the InkCanvas.InkPresenter.StrokeInput.StrokeEnded event instead to call this method :
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.";
}
}
It's close to what I want to achieve, except the last stroke is not taken into account. I guess that when the StrokeEnded event is triggered, the InkStroke has not yet been "processed" and thus it is not included in currentStrokes.
I tried to circumvent this problem by adding the Strokes corresponding to the InkStrokeInput of the event to the StrokeContainer I use as a parameter for the recognition :
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);
But input.InkPresenter.StrokeContainer.GetStrokes() returns an empty List.
Is there a way for me to access the current Stroke when the event is triggered ? Or is there another event I could use to call the handwriting recognition after the stroke has been "processed" ? Or another way to automatically recognize the handwriting for all the current InkStrokes alltogether ?