InkCanvas是一种特殊控件,在应用程序运行后,它不会呈现任何内容,不过,它可以收集用户通过鼠标、手指或笔所输入的数据,这些数据称为"墨迹(Inking)"。只要用户的输入操作是在InkCanvas控件的区域内,它就可以收集输入的墨迹。

InkCanvas控件公开InkPresenter属性,类型是位于Windows.UI.Input.Inking命名空间下的InkPresenter类。这个类用于配置墨迹收集相关的参数,例如墨迹的呈现颜色,呈现大小等。每当InkCanvas控件完成一次墨迹收集时会引发StrokesCollected事件。

为了便于开发,通常InkCanvas控件会与InkToolbar控件结合使用。InkToolbar会呈现一系列操作按钮,包括设置笔触颜色、粗细等操作,开发者不需要自行开发操作按钮。

InkCanvas控件除了有"涂鸦"功能外,还可以用来实现手写识别。InkRecognizerContainer类负责完成识别操作,识别成功后会得到一个InkRecognitionResult列表,表示识别结果。其中每个InkRecognitionResult对象会包含一个候选集合,集合按照被识别文字的精确程度进行排序。

接下来将通过示例来综合演示一下墨迹收集和手写识别。

  1. 新建应用程序项目、
  2. 界面布局可以参考下面XAML代码来完成。
    <Grid Margin="20"><Grid.RowDefinitions><RowDefinition Height="auto"/><RowDefinition/><RowDefinition Height="auto"/></Grid.RowDefinitions><InkToolbar x:Name="inkToolBar"/><InkCanvas x:Name="inkcvs" Grid.Row="1" Margin="0,5"/><ListView x:Name="lvResults" Header="识别结果:" Grid.Row="2" FontSize="20"ScrollViewer.HorizontalScrollMode="Auto" ScrollViewer.HorizontalScrollBarVisibility="Hidden"><ListView.ItemsPanel><ItemsPanelTemplate><VirtualizingStackPanel Orientation="Horizontal"/></ItemsPanelTemplate></ListView.ItemsPanel><ListView.ItemContainerStyle><Style TargetType="ListViewItem"><Setter Property="FontSize" Value="24"/><Setter Property="Foreground" Value="Green"/></Style></ListView.ItemContainerStyle></ListView></Grid>

InkToolbar控件在默认情况下会呈现如钢笔、圆珠笔、橡皮擦等工具按钮,用户不仅可以选择合适的笔头,还可以设置笔触的颜色和大小。InkCanvas面板提供一个矩形区域,用户只能在该区域完成墨迹输入。本示例将顺带地演示手写识别功能,当用户进行输入后,等待2秒钟,应用程序会完成识别,并将结果呈现在ListView控件中。

3. 打开MainPage类的代码文件,在类级别声明以下字段。

        InkRecognizerContainer recognizerContainer = null;DispatcherTimer timer = null;IReadOnlyList<InkRecognizer> recognizers;

InkRecognizerContainer类负责进行手写识别,DispatcherTimer类用于计时,在用户输入完成后开始计时,延迟识别操作。

4. 在类的构造函数中,对各个对象进行初始化。

        public MainPage(){this.InitializeComponent();//将InkCanvas与InkToolbar关联inkToolBar.TargetInkCanvas = inkcvs;//设置墨迹面板支持鼠标、触摸和笔输入inkcvs.InkPresenter.InputDeviceTypes = CoreInputDeviceTypes.Mouse |CoreInputDeviceTypes.Touch | CoreInputDeviceTypes.Pen;inkcvs.InkPresenter.StrokesCollected += OnStrokeCollected;inkcvs.InkPresenter.StrokeInput.StrokeStarted += OnStrokeStarted;recognizers = new List<InkRecognizer>();//初始化 InkRecognizerContainerrecognizerContainer = new InkRecognizerContainer();//获取已安装的手写识别器集合recognizers = recognizerContainer.GetRecognizers();var recognizer = recognizers.SingleOrDefault(r => r.Name == "Microsoft 中文(简体)手写识别器");recognizerContainer.SetDefaultRecognizer(recognizer);//初始化 DispatcherTimertimer = new DispatcherTimer();timer.Interval = TimeSpan.FromSeconds(2d);timer.Tick += OnTimerTick;}

要让InkToolbar和InkCanvas协同工作,则必须让InkToolbar对象的TargetInkCanvas属性引用一个有效的InkCanvas实例。

设置InputDeviceTypes属性,让应用程序支持鼠标、手写触摸以及触控笔来进行输入。属性值由CoreInputDeviceTypes枚举来定义,可以多个值组合使用。

处理StrokeStarted事件是为了在用户开始输入时禁用计时器,在用户未完成输入时进行手写识别意义不大;然后还要处理StrokesCollected事件,当墨迹面板完成一次墨迹收集后启动计时器,如果2秒钟内用户不再进行输入,就会引发计时器的Tick事件,并执行手写识别。

5. 下面是StrokeStarted事件的处理代码,功能是禁用计时器。。

        void OnStrokeStarted(InkStrokeInput sender,PointerEventArgs args){if (timer.IsEnabled){timer.Stop();}}

6. 下面代码处理StrokesColelcted事件,重新开始计时器。

        void OnStrokeCollected(InkPresenter sender,InkStrokesCollectedEventArgs args){timer.Start();}

7. 处理Tick事件是本示例的核心,调用recognizerContainer字段的RecognizeAsync方法执行手写识别,最后将识别结果显示到ListView控件中。

        async void OnTimerTick(object sender, object e){//获取收集的笔触列表var strokes = inkcvs.InkPresenter.StrokeContainer.GetStrokes();//当集合中包含有笔触时才进行识别if (strokes.Count > 0){var results = await recognizerContainer.RecognizeAsync(inkcvs.InkPresenter.StrokeContainer,InkRecognitionTarget.All);//显示识别结果if (results.Count > 0){//获取第一个识别结果InkRecognitionResult firstresult = results[0];lvResults.ItemsSource = firstresult.GetTextCandidates();//清空笔触集合inkcvs.InkPresenter.StrokeContainer.Clear();}}//停止计时timer.Stop();}

RecognizeAsync方法会返回多个识别结果,在本例中,只获取第一个结果进行分析。开发者应当根据实际情况来获取需要的识别结果。在单个InkRecognitionResult对象中,可以调用GetTextCandidates方法来得到一个字符串列表,该列表表示被识别文本的候选项,系统会按精确度对候选项进行排序。

至此,示例应用程序已经完成,运行示例后,在InkCanvas面板中通过墨迹输入文字,就可以进行识别了。

墨迹处理(InkCanvas)相关推荐

  1. win10 uwp 使用油墨输入

    win10可以很简单在我们的app使用自然输入,这篇文章主要翻译https://blogs.windows.com/buildingapps/2015/09/08/going-beyond-keybo ...

  2. 2018-4-12-win10-uwp-使用油墨输入

    title author date CreateTime categories win10 uwp 使用油墨输入 lindexi 2018-04-12 14:19:58 +0800 2018-2-13 ...

  3. 【Win 10 应用开发】将墨迹保存到图像的两种方法

    IT界最近这几年,各种乱七八糟的东西不断出现,其中能用在实际工作与生活中的,大概也就那么几个.Web 前端也冒出各种框架,这就为那些喜欢乱用框架的公司提供了很好的机会,于是造成很多项目体积越来越庞大, ...

  4. WPF and Silverlight 学习笔记(九):WPF布局管理之Canvas、InkCanvas

    一.Canvas 在WPF中子元素的绝对定位的布局控件 其子元素使用Width.Height定义元素的宽度和高度 使用Convas.Left(Convas.Right).Convas.Top(Conv ...

  5. 基于InkCanvas实现的桌面涂鸦工具-[ WPF开发 ]

    首先简单的介绍下InkCanvas,简单的来说,InkCanvas就是在WPF中实现允许使用墨迹的布局控件.实际上,InkCanvas有着更多层面上的应用,它的主要目的是(通过鼠标或者和指示笔)捕捉笔 ...

  6. Azure认知服务之使用墨迹识别功能识别手写汉字

    前面我们使用Azure Face实现了人脸识别.使用Azure表格识别器提取了表格里的数据.这次我们试试使用Azure墨迹识别API来对笔迹进行识别. 墨迹识别 墨迹识别器认知服务提供基于云的 RES ...

  7. WPF 使用Microsoft.Ink 做的墨迹输入法

    利用微软的Ink,实现手写输入. 不用自带的InkCanvas,重写的绘制的效果. 根据速度调节线条粗细了.其实不算是线条吧,PathGeometry对象. 然后再向Ink引擎传入笔画数据,其实就是点 ...

  8. WPF实现WORD 2013墨迹批注功能

    原文:WPF实现WORD 2013墨迹批注功能 1 前言 WORD 2013可以使用墨迹在文档上面标注,本文讲述通过WPF第三方控件实现类似主要功能如下: 名称 描述 墨迹标注 不论是否触摸屏环境下可 ...

  9. 墨迹天气: 更重视商业数据的公共价值

    [在中国,墨迹天气所涉及的天气数据细化到了城市行政区域.县级.村.街道的级别,也就是说,在同一个城市的不同位置不同时间,用户也可以看到跟自己更贴近的天气情况,准确率超过80%.] 当你推着满满一车物品 ...

最新文章

  1. python 2x list 里面的中文打印效果为unicode 编码 的处理方法
  2. 观点 | 通往通用人工智能的路上,我们少不了无监督学习
  3. python可以播放音乐吗_详解python播放音频的三种方法
  4. mysql基于binlog增量更新_一个应用它提取MySQL binlog,解析binlog并将增量更新数据推送到不同的接收器...
  5. linux-history历史命令-光标的移动操作-命令行上的字符删除操作
  6. 白话 discuz加密解密算法,包你懂
  7. 技术圈几个牛逼的公号推荐给大家
  8. 如何使用jstack?线程的状态?
  9. Atitit 单点登录实现几种模式架构图 目录 1. 因此要点也就以下两个:存储信任验证信任 1 1.1. 共享cookie (最简单 1 1.2. 通过 url带token参数跳转 1 1.3.
  10. php tcpdf 分层,PHP 使用tcPdf 生成pdf文件
  11. QThread安全退出
  12. 厉害了,大米云Linux搭建Wordpress环境
  13. Vue3.0后台管理框架
  14. 冒险岛手游服务器维护界面,冒险岛手游游戏界面全解 丰富轻松画风
  15. 邮件服务器搭建 iredmail
  16. Unity3D延迟执行功能脚本
  17. 密码的输入问题(do while()和st1.equals(st2)的使用)
  18. html 左侧固定导航栏,前端布局-固定导航栏与侧边栏
  19. JS中改变this指向的两种方法
  20. 智商太低,竟然算不出病狗神题了

热门文章

  1. 青铜修炼手册:Axure页面右键菜单制作
  2. RL78/F13 在E2 studio(GCC)上的FLASH(FDL)读写应用
  3. Learning-Deep-Learning(学习深度学习)
  4. Ubuntu编译GPU版本Pytorch
  5. 计算机二级准考证解压缩失败 文件损坏 怎么办 ? 急
  6. js时间format
  7. 前Burberry CEO接棒库克成为Apple女性掌门人,年薪是库克8倍
  8. vi设计的时代性原则
  9. 淘宝双十一电商秒杀系统架构设计
  10. 贵金属白银行情走势图缘何强势?