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

本文介绍了如何使用WPF结合Microsoft.Ink库来创建自定义的手写输入功能,不依赖InkCanvas,通过调整速度控制线条粗细,并通过PathGeometry处理笔画数据。展示了代码实现和效果。
摘要由CSDN通过智能技术生成

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



字写的不好看。来看看代码吧

主要代码:

Imports Microsoft.Ink
'Imports System.Windows.Ink

'C:\Program Files (x86)\Common Files\Microsoft Shared\Ink
'添加对 WPF 墨迹分析程序集、IAWinFX.dll、IACore.dll 和 IALoader.dll(这些内容可以在 \Program Files\Reference Assemblies\Microsoft\Tablet PC\v1.7 中找到)的引用。

Structure PointInfo
    Public pt As Point REM 点的位置
    Public dir As Vector REM 与上一个点之间的方向
    Public len As Single REM 上一个点到这个点的距离
    Public perpendicular As Vector REM 与上一个点之间的方向的垂直
    Public Function ToDrawingPoint() As System.Drawing.Point
        Return New System.Drawing.Point(pt.X, pt.Y)
    End Function
End Structure

Class MainWindow
    Private bmp As RenderTargetBitmap REM 渲染到的图片
    Private dv As New DrawingVisual() REM 绘制到图片的visual
    Private geo As PathGeometry REM 一笔 存的所有的path
    Private geos As New List(Of PathGeometry) REM 所有笔划
    Private ptStart As Point REM 起始点
    Private ptEnd As Point REM 终点
    Private ptinfos As New List(Of PointInfo) REM 点的信息

    REM 求垂直与输入向量的向量,顺时针,应该还有更好的写法吧
    Public Function Perpendicular(v As Vector) As Vector
        Dim result As Vector

        If v.Y = 0 And v.X = 1 Then
            Return New Vector(0, -1)
        ElseIf v.Y = 0 And v.X = -1
            Return New Vector(0, 1)
        Else
            If v.Y > 0 Then
                result.X = Math.Sqrt(v.Y * v.Y / (v.X * v.X + v.Y * v.Y))
            Else
                result.X = -Math.Sqrt(v.Y * v.Y / (v.X * v.X + v.Y * v.
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
WPF (Windows Presentation Foundation) 是一个基于 .NET Framework 的 UI 框架,它提供了丰富的界面设计和开发功能。在 WPF使用 Microsoft.Extensions.DependencyInjection 可以帮助我们更好地实现依赖注入(Dependency Injection)。 Microsoft.Extensions.DependencyInjection 是 .NET Core 中的一个轻量级依赖注入框架,它提供了简单、灵活的依赖注入方式。在 WPF 中,我们同样可以使用该框架来实现依赖注入。 首先,我们需要在 WPF 应用程序中安装 Microsoft.Extensions.DependencyInjection NuGet 包。 在 App.xaml.cs 文件中,我们可以创建一个 IServiceCollection 对象,并在其中注册依赖: ```csharp public partial class App : Application { public static IServiceProvider ServiceProvider { get; private set; } protected override void OnStartup(StartupEventArgs e) { base.OnStartup(e); var services = new ServiceCollection(); // 注册依赖 services.AddSingleton<IMyService, MyService>(); // 创建容器 ServiceProvider = services.BuildServiceProvider(); } } ``` 在上面的代码中,我们注册了一个名为 `MyService` 的服务,并指定其实现接口为 `IMyService`。当我们需要使用该服务的时候,可以通过 ServiceProvider 来解析: ```csharp var service = App.ServiceProvider.GetService<IMyService>(); ``` 这样就完成了依赖注入的过程。在 WPF 中,我们通常会在 ViewModel 中使用依赖注入,来实现视图和逻辑的分离。通过使用 Microsoft.Extensions.DependencyInjection,我们可以更方便地管理和注入依赖项,提高代码的可测试性和可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值