Avalonia 简单实现输入法光标跟随效果

news/2025/1/19 6:13:40/文章来源:https://www.cnblogs.com/lindexi/p/18669800

本文是在 11.1.0 的 Avalonia 版本里面实现效果

本文内容里面只给出关键代码片段,如需要全部的项目文件,可到本文末尾找到本文所有代码的下载方法

核心是编写一个类型,让这个类型继承 TextInputMethodClient 类。然后在输入法光标变化的时候,设置 CursorRectangle 属性和调用 RaiseCursorRectangleChanged 方法通知变更

实现的效果如下图所示,通过如下图可以看到鼠标点击的地方就修改了光标,输入法就从光标开始输入

以下是具体实现方法

编写一个 IMESupporter 类型,让这个类型继承 TextInputMethodClient 类

internal class IMESupporter : TextInputMethodClient
{public IMESupporter(Visual textViewVisual){TextViewVisual = textViewVisual;}public void SetCursorRectangle(Rect cursorRectangle){_cursorRectangle = cursorRectangle;RaiseCursorRectangleChanged();}public override Visual TextViewVisual { get; }public override bool SupportsPreedit => false;public override bool SupportsSurroundingText => false;public override string SurroundingText => string.Empty;public override Rect CursorRectangle => _cursorRectangle;private Rect _cursorRectangle;public override TextSelection Selection { get; set; }
}

为了方便演示,我在 MainView.axaml 放了一个 Grid 控件,以及在 Grid 里面放了一个 Border 假装是光标,界面代码如下

  <Grid x:Name="RootGrid" Background="Transparent" PointerPressed="RootGrid_OnPointerPressed"><Border x:Name="DebugBorder" Width="2" Height="20" Background="Black" HorizontalAlignment="Left" VerticalAlignment="Top"><Border.RenderTransform><TranslateTransform/></Border.RenderTransform></Border></Grid>

设置 RootGrid 的 Background 为透明,仅仅只是为了拿到命中测试而已

RootGrid_OnPointerPressed 事件里面获取鼠标点击的坐标,然后设置 DebugBorder 的坐标,以及设置输入法光标,代码如下

    private readonly IMESupporter _imeSupporter;private void RootGrid_OnPointerPressed(object? sender, PointerPressedEventArgs e){var (x, y) = e.GetPosition(RootGrid);var translateTransform = (TranslateTransform) DebugBorder.RenderTransform!;translateTransform.X = x;translateTransform.Y = y;RootGrid.Focus(NavigationMethod.Pointer);_imeSupporter.SetCursorRectangle(new Rect(x, y, 1, 1));}

在 MainView 的构造函数进行 _imeSupporter 字段的设置,代码如下

    public MainView(){InitializeComponent();var imeSupporter = new IMESupporter(RootGrid);_imeSupporter = imeSupporter;RootGrid.TextInputMethodClientRequested += (sender, args) =>{args.Client = imeSupporter;};RootGrid.Focusable = true;}

如此即可完成一个非常简单的输入法光标跟随功能

如此可见在 Avalonia 里面添加了很多内置的支持,比 WPF 的定义简单一些。关于在 WPF 里面定制输入法光标,请看 WPF 自定义文本框输入法 IME 跟随光标

本文代码放在 github 和 gitee 上,可以使用如下命令行拉取代码。我整个代码仓库比较庞大,使用以下命令行可以进行部分拉取,拉取速度比较快

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

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

以上使用的是国内的 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源进行拉取代码。如果依然拉取不到代码,可以发邮件向我要代码

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

获取代码之后,进入 AvaloniaIDemo/HeyaywarhearJaikoyalqair 文件夹,即可获取到源代码

更多 Avalonia 技术博客,请参阅 博客导航

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/868941.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【一文详解】解决跨网文件传输三大瓶颈 选择专业文件摆渡系统

在数字化办公日益普及的今天,跨网文件传输成为许多企业面临的技术瓶颈。传统的文件传输方式往往无法满足跨地域、跨网络环境中的需求,尤其是随着数据量的增大和传输频率的提高,企业在进行文件交换时频繁遇到速度慢、安全性差、稳定性差等问题。因此,选择一款专业的文件摆渡…

SecureCRT v9.5.2 for Mac SSH终端操作工具

SecureCRT v9.5.2 for Mac SSH终端操作工具 安装 介绍 SecureCRT Mac是一款SSH终端工具,为计算专业人士提供高级会话管理工具。也是一个功能强大且值得信赖的基于GUI的SHH和Telnet客户端,以及旨在提高工作效率并简化重复任务的终端仿真器。借助SecureCRT mac版的帮助,您可以…

Gitlab流水线配置

由于格式和图片解析问题,为了更好阅读体验可前往 阅读原文流水线的流程是,提交代码后,gitlab会检测项目根目录里的.github-ci.yml文件,根据文件中的流水线自动构建,配置文件格式正确性可以在gitlab进行文件校验,格式使用yaml文件格式,一个yaml文件就是一个流水线,里面会…

验证表单输入:必填域

问题 希望确保必须为一个表单元素提供一个值。例如,希望保证一个文本框不为空。 解决方案 使用filter_has_var()查看这个元素在相应的输入数组中是否存在。 严格表单验证 // 检查POST请求中是否存在first_name字段,并且这个字段的长度大于0 if(!(filter_has_var(INPUT_POST, …

[2025.1.13 JavaSE学习]集合-7(Hashtable Properties)

Hashtable 特点和HashMap处于同一级,实现了Map接口,继承了Dictionary类 Hashtable的key和value都不能为null,否则会抛出NullPointException 是线程安全的,带有synchronized修饰扩容机制底层有数组Hashtable$Entry[ ],初始化大小为11 临界值threshold为8 = 11/* 0.75 而后按…

Ansible工具集使用指南

作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任。 目录一.ansible相关的工具概述1.查看ansible相关的工具2.本质上是一个Python脚本文件二.ansible-doc工具使用指南1 ansible-doc查看ansible文档2.列出支持的模块列表3.过滤出指定模块4.列出指定类型模块5.显示…

网络云服务

一、网络服务介绍 网络是指多个计算机或其他设备连接在一起,以便它们可以互相通信和共享资源的系统。 网络可以是局域网(Local Area Network,LAN)、广域网(Wide Area Network,WAN)或互联网(Internet)等不同类型。 华为云拥有丰富的网络服务,提供安全、可扩展的云上网…

Get-Command *http* 后,你会看到与 HTTP 相关的命令和工具的列表。以下是这些命令和它们的简要描述:

inetcpl.cpl 是 Internet Explorer 设置面板的控制面板项文件,运行此命令将打开 Internet Explorer 的设置界面,其中包括浏览器的常规设置、连接设置、安全性设置等。Get-Command *http* 后,你会看到与 HTTP 相关的命令和工具的列表。以下是这些命令和它们的简要描述: 1. N…

快速上手 INFINI Console 的 TopN 指标功能

背景 在分布式搜索引擎系统(如 Easysearch、Elasticsearch 和 OpenSearch)中,性能监控至关重要。为了确保系统的高效运行和资源的合理分配,我们通常需要关注一段时间内关键资源的使用情况,特别是索引、节点和分片的内存与 CPU 占用情况。 通过对这些关键指标进行 TopN 查询…

特斯拉CEO埃隆马.斯克的五步工作法,怎么提高工程效率加速产品开发?

简介 在《埃隆马斯克传》这本书中,有两个章节写到了特斯拉 CEO 埃隆马斯克为了在一段时间内,提升特斯拉汽车 model 3 的产能到每个月 5000 辆这个数量级,在书中叫 “量产地狱”,这是他的目标。 马斯克扎根工厂,睡在工厂的地板上近一年,亲自参与生产线的调试和优化,通过反…

iStoreOS_x86-U盘安装写入内置硬盘启动

https://doc.linkease.com/zh/guide/istoreos/install_x86.html#_1-%E8%A7%86%E9%A2%91%E4%BB%8B%E7%BB%8D 86 物理机x86物理机,范围很广,可以是各种"电脑",或者J4125/N5105等小主机。这里介绍x86实机安装iStoreOS固件。#1.视频介绍#2.准备工作一个 U盘 一个显示器…

《CPython Internals》阅读笔记:p118-p150

《CPython Internals》学习第 8 天,p118-p150 总结,总计 33 页。 一、技术总结 补充一些本人整理的关于 Context-Free Grammar(CFG) 的知识。 1.symbol(符号) A mathematical symbol is a figure or a combination of figures that is used to represent a mathematical ob…