基于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手写的方法?
答案 0 :(得分:3)
我已经找到了一种方法,可以在触发InkCanvas.InkPresenter.StrokesCollected事件时调用我的RecognizedAsync方法来实现我期望的结果。
来自MSDN文档:
InkPresenter.StrokesCollected事件
通过&gt;应用程序线程处理一个或多个墨迹笔划(&#34;湿&#34;到&#34;干&#34;)时发生。
默认情况下,在低延迟背景线程上处理墨迹笔划,并且在绘制时将其渲染湿润。当笔划完成(笔或手指>抬起,或释放鼠标按钮)时,笔划在UI线程上处理&gt;并呈现为InkCanvas图层(在应用程序内容上方)。