每次用户完成描边描记后,如何进行手写识别?

时间:2015-11-16 15:07:15

标签: c# xaml uwp inkcanvas handwriting-recognition

基于MSDN为Windows 10应用程序中的Handwriting Recognition提供的代码,我尝试让用户在完成跟踪墨迹描边后自动识别手写,而不是单击按钮。

在我的画布中触发PointerReleased事件时,通过调用我的手写识别方法,我可以在Windows 8.1 metro应用程序中执行类似的操作。它工作得很好,我试图在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中。

我试图通过将与事件的InkStrokeInput相对应的Strokes添加到StrokeContainer来避免这个问题,我将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()返回一个空列表。

触发事件时,我有办法访问当前的笔划吗?或者是否有另一个事件我可以用来在笔画被“处理”之后调用手写识别? 还是另一种自动识别所有当前InkStrokes手写的方法?

1 个答案:

答案 0 :(得分:3)

我已经找到了一种方法,可以在触发InkCanvas.InkPresenter.StrokesCollected事件时调用我的RecognizedAsync方法来实现我期望的结果。

来自MSDN文档:

  

InkPresenter.StrokesCollected事件

     

通过&gt;应用程序线程处理一个或多个墨迹笔划(&#34;湿&#34;到&#34;干&#34;)时发生。

     

默认情况下,在低延迟背景线程上处理墨迹笔划,并且在绘制时将其渲染湿润。当笔划完成(笔或手指>抬起,或释放鼠标按钮)时,笔划在UI线程上处理&gt;并呈现为InkCanvas图层(在应用程序内容上方)。