本文告诉大家如何在基于 .NET 6 的 WPF 使用 WinRT 的手写识别功能

在开始之前需要先创建 WPF 项目,创建完成之后,可替换 csproj 项目文件为以下代码,用来安装初始化环境

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
<OutputType>WinExe</OutputType>
<TargetFramework>net6.0-windows10.0.19041</TargetFramework>
<Nullable>enable</Nullable>
<UseWPF>true</UseWPF>
<PlatformTarget>x86</PlatformTarget>
<RuntimeIdentifiers>win10-x86;win10-x64</RuntimeIdentifiers>
<TargetPlatformMinVersion>10.0.17763.0</TargetPlatformMinVersion>
</PropertyGroup> <ItemGroup>
<PackageReference Include="Microsoft.WindowsAppSDK" Version="1.3.230331000" />
</ItemGroup> </Project>

如果以上代码构建不通过,请参阅 修复 WPF 安装 WindowsAppSDK 库构建失败 NETSDK1082 和 NETSDK1112 找不到 win10-arm 失败 博客

另外,还需要你的 VisualStudio 2022 安装对应的负载,如 10.0.19041 负载等,基本上 Visual Studio 告诉你缺哪个就安装哪个

如果不想自己的项目只能跑在 Win10 及以上的系统,期望支持 Win7 等系统等,可以考虑采用 WPF 不安装 WindowsAppSDK 使用 WinRT 功能的方法 博客提供的方法

先在 MainWindow.xaml 放入一个 InkCanvas 元素,用来绘制笔迹和创建笔迹对象,代码如下

    <Grid>
<InkCanvas x:Name="InkCanvas" StrokeCollected="InkCanvas_OnStrokeCollected"></InkCanvas>
</Grid>

InkCanvas_OnStrokeCollected 方法里面执行手写识别功能,以下是识别形状的代码逻辑

using Windows.Foundation;
using Windows.UI.Input.Inking;
using Windows.UI.Input.Inking.Analysis; using Point = Windows.Foundation.Point; private async void InkCanvas_OnStrokeCollected(object sender, InkCanvasStrokeCollectedEventArgs e)
{
var inkStrokeBuilder = new InkStrokeBuilder();
var inkStroke = inkStrokeBuilder.CreateStroke(e.Stroke.StylusPoints.Select(t => new Point(t.X, t.Y)));
var inkAnalyzer = new InkAnalyzer();
inkAnalyzer.AddDataForStroke(inkStroke);
var result = await inkAnalyzer.AnalyzeAsync();
foreach (IInkAnalysisNode inkAnalysisNode in inkAnalyzer.AnalysisRoot.FindNodes(InkAnalysisNodeKind.InkDrawing))
{
var inkAnalysisInkDrawing = inkAnalysisNode as InkAnalysisInkDrawing;
var value = inkAnalysisInkDrawing?.DrawingKind;
if (value == InkAnalysisDrawingKind.Triangle)
{
}
}
}

例如在界面绘制一个三角形,也许就能进入到 value == InkAnalysisDrawingKind.Triangle 的判断

以上的 InkAnalyzer 等类型都是 Windows Runtime 提供的类型,也就是需要至少是 Win10 以上版本系统才能支持的功能。如果期望在 Win10 及以下版本使用笔迹识别,可选使用 Microsoft.Ink 组件

本文以上代码放在githubgitee 欢迎访问

可以通过如下方式获取源代码,先创建一个空文件夹,接着使用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到代码

git init
git remote add origin https://gitee.com/lindexi/lindexi_gd.git
git pull origin 55aa84a041b5f9e3446a646662fc079695783e81

以上使用的是 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码

git remote remove origin
git remote add origin https://github.com/lindexi/lindexi_gd.git
git pull origin 55aa84a041b5f9e3446a646662fc079695783e81

获取代码之后,进入 WekihairfawKudurnearka 文件夹

更多笔迹相关,请参阅 博客导航

WPF 通过 WindowsAppSDK 使用 WinRT 的手写识别功能的更多相关文章

  1. 2019-11-20-WPF-使用-MyScript-的-IInk-做手写识别

    title author date CreateTime categories WPF 使用 MyScript 的 IInk 做手写识别 lindexi 2019-11-20 08:18:26 +08 ...

  2. C# 手写识别方案整理

    书写识别,网上的大佬们都有输出. 书写识别存在的2个问题: 直接拿官网的案例(将 Windows Ink 笔划识别为文本和形状 - Windows apps | Microsoft Learn),会发 ...

  3. 【Win 10 应用开发】手写识别

    记得前面(忘了是哪天写的,反正是前些天,请用力点击这里观看)老周讲了一个14393新增的控件,可以很轻松地结合InkCanvas来完成涂鸦.其实,InkCanvas除了涂鸦外,另一个大用途是墨迹识别, ...

  4. JS / Egret 单笔手写识别、手势识别

    UnistrokeRecognizer 单笔手写识别.手势识别 UnistrokeRecognizer : https://github.com/RichLiu1023/UnistrokeRecogn ...

  5. (手写识别) Zinnia库及其实现方法研究

    Zinnia库及其实现方法研究 (转) zinnia是一个开源的手写识别库.采用C++实现.具有手写识别,学习以及文字模型数据制作转换等功能. 项目地址 [http://zinnia.sourcefo ...

  6. android 开源 OCR 项目 及手写识别

    http://blog.csdn.net/archfree/article/details/6023676 1)一个为Android平台,将识别由手机的相机拍摄的图像文本应用程序. http://co ...

  7. TensorFlow 入门之手写识别(MNIST) softmax算法

    TensorFlow 入门之手写识别(MNIST) softmax算法 MNIST flyu6 softmax回归 softmax回归算法 TensorFlow实现softmax softmax回归算 ...

  8. 机器学习实战kNN之手写识别

    kNN算法算是机器学习入门级绝佳的素材.书上是这样诠释的:“存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都有标签,即我们知道样本集中每一条数据与所属分类的对应关系.输入没有标签的新数据 ...

  9. tensorflow笔记(四)之MNIST手写识别系列一

    tensorflow笔记(四)之MNIST手写识别系列一 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7436310.html ...

  10. tensorflow笔记(五)之MNIST手写识别系列二

    tensorflow笔记(五)之MNIST手写识别系列二 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7455233.html ...

随机推荐

  1. 记录--一个好用的轮子 turn.js 实现仿真翻书的效果

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 国际惯例,官网链接 官网传送门 Github地址 github上有几个demos例子,介绍了基础用法. 我参考官网的例子,写了一个demo ...

  2. 记录--css水滴登录界面

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 前言 今天我们来分享一款非常有趣的登录界面,它使用HTML和CSS制作,具有动态的水波纹效果,让用户在登录时感受到了一股清凉之感. 基本h ...

  3. C# 单例模式使用 Singleton

    Singleton 类如下: public class Singleton<T> where T : class, new() { private static T _instance; ...

  4. KingbaseESV8R6表空间与数据库,模式,表的关系

    自定义表空间的作用 使用多个表空间可以更灵活地执行数据库操作.当数据库具有多个表空间时,您可以: 1.将用户数据与系统表数据分开存储在不同性能的存储上,以减少I/O争用. 2.将一个应用程序的数据与另 ...

  5. KingbaseES垃圾回收参数优化之maintenance_work_mem

    maintenance_work_mem 参数说明与vacuum过程 maintenance_work_mem , autovacuum_work_mem. 如果没有设置autovacuum_work ...

  6. Vue入门笔记三(Vuex)

    <Vue.js项目实战> Vuex 集中式的状态管理 Vuex从Flux(由Facebook开发)的概念中获取得灵感.Flux又一系列指导原则构成,阐明了如何使用集中式store来实现组件 ...

  7. Avalonia的Window生命周期

    Avalonia中的Window 在Avalonia中,Window是一个基本的UI元素,它代表了一个应用程序的窗口.每个Window都可以包含其他的UI元素,如按钮.文本框等,并可以响应各种用户输入 ...

  8. #SG函数,记忆化搜索#HDU 4111 Alice and Bob

    题目 Alice和Bob两个好朋友又开始玩取石子了. 游戏开始时,有\(n\)堆石子排成一排,然后他们轮流操作(Alice先手),每次操作时从下面的规则中任选一个: ·从某堆石子中取走一个 ·合并任意 ...

  9. #dp#洛谷 4158 [SCOI2009]粉刷匠

    题目 分析 首先每条木板可以分开处理,再合并起来求最大值 下面讲一下单独处理每条木板的情况 设\(dp[k][m]\)表示前\(m\)个格子粉刷了\(k\)次最多正确粉刷的格子数 那么 \[dp[k] ...

  10. #特殊判断#牛客练习赛71 A 回文数

    题目 分析 首先出现奇数次的数超过1显然无解 并且只有多个0或者只有一个非0数字并且其它都是0也无解 然后由于没有前导0所以先要找到最小的非0数,先占据首尾 最后按照常规方法前一半从左到右依次递增 注 ...