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

打印 上一主题 下一主题

主题 949|帖子 949|积分 2847

本文将告诉大家如安在 Avalonia 里面实现输入法光标跟随效果
本文是在 11.1.0 的 Avalonia 版本里面实现效果
本文内容里面只给出关键代码片段,如须要全部的项目文件,可到本文末尾找到本文所有代码的下载方法
核心是编写一个类型,让这个类型继承 TextInputMethodClient 类。然后在输入法光标变化的时间,设置 CursorRectangle 属性和调用 RaiseCursorRectangleChanged 方法通知变更
实现的效果如下图所示,通过如下图可以看到鼠标点击的地方就修改了光标,输入法就从光标开始输入

以下是详细实现方法
编写一个 IMESupporter 类型,让这个类型继承 TextInputMethodClient 类
  1. internal class IMESupporter : TextInputMethodClient
  2. {
  3.     public IMESupporter(Visual textViewVisual)
  4.     {
  5.         TextViewVisual = textViewVisual;
  6.     }
  7.     public void SetCursorRectangle(Rect cursorRectangle)
  8.     {
  9.         _cursorRectangle = cursorRectangle;
  10.         RaiseCursorRectangleChanged();
  11.     }
  12.     public override Visual TextViewVisual { get; }
  13.     public override bool SupportsPreedit => false;
  14.     public override bool SupportsSurroundingText => false;
  15.     public override string SurroundingText => string.Empty;
  16.     public override Rect CursorRectangle => _cursorRectangle;
  17.     private Rect _cursorRectangle;
  18.     public override TextSelection Selection { get; set; }
  19. }
复制代码
为了方便演示,我在 MainView.axaml 放了一个 Grid 控件,以及在 Grid 里面放了一个 Border 假装是光标,界面代码如下
  1.   <Grid x:Name="RootGrid" Background="Transparent" PointerPressed="RootGrid_OnPointerPressed">
  2.       <Border x:Name="DebugBorder" Width="2" Height="20" Background="Black" HorizontalAlignment="Left" VerticalAlignment="Top">
  3.           <Border.RenderTransform>
  4.               <TranslateTransform/>
  5.           </Border.RenderTransform>
  6.       </Border>
  7.   </Grid>
复制代码
设置 RootGrid 的 Background 为透明,仅仅只是为了拿到命中测试而已
在 RootGrid_OnPointerPressed 事件里面获取鼠标点击的坐标,然后设置 DebugBorder 的坐标,以及设置输入法光标,代码如下
  1.     private readonly IMESupporter _imeSupporter;
  2.     private void RootGrid_OnPointerPressed(object? sender, PointerPressedEventArgs e)
  3.     {
  4.         var (x, y) = e.GetPosition(RootGrid);
  5.         var translateTransform = (TranslateTransform) DebugBorder.RenderTransform!;
  6.         translateTransform.X = x;
  7.         translateTransform.Y = y;
  8.         RootGrid.Focus(NavigationMethod.Pointer);
  9.         _imeSupporter.SetCursorRectangle(new Rect(x, y, 1, 1));
  10.     }
复制代码
在 MainView 的构造函数举行 _imeSupporter 字段的设置,代码如下
  1.     public MainView()
  2.     {
  3.         InitializeComponent();
  4.         var imeSupporter = new IMESupporter(RootGrid);
  5.         _imeSupporter = imeSupporter;
  6.         RootGrid.TextInputMethodClientRequested += (sender, args) =>
  7.         {
  8.             args.Client = imeSupporter;
  9.         };
  10.         RootGrid.Focusable = true;
  11.     }
复制代码
如此即可完成一个非常简单的输入法光标跟随功能
如此可见在 Avalonia 里面添加了许多内置的支持,比 WPF 的定义简单一些。关于在 WPF 里面定制输入法光标,请看 WPF 自定义文本框输入法 IME 跟随光标
本文代码放在 githubgitee 上,可以利用如下命令行拉取代码。我整个代码仓库比较庞大,利用以下命令行可以举行部分拉取,拉取速度比较快
先创建一个空文件夹,接着利用命令行 cd 命令进入此空文件夹,在命令行里面输入以下代码,即可获取到本文的代码
  1. git init
  2. git remote add origin https://gitee.com/lindexi/lindexi_gd.git
  3. git pull origin a66a404a8e49c97cd662c46a0d2d55735b3676f2
复制代码
以上利用的是国内的 gitee 的源,如果 gitee 不能访问,请替换为 github 的源。请在命令行继续输入以下代码,将 gitee 源换成 github 源举行拉取代码。如果依然拉取不到代码,可以发邮件向我要代码
  1. git remote remove origin
  2. git remote add origin https://github.com/lindexi/lindexi_gd.git
  3. git pull origin a66a404a8e49c97cd662c46a0d2d55735b3676f2
复制代码
获取代码之后,进入 AvaloniaIDemo/HeyaywarhearJaikoyalqair 文件夹,即可获取到源代码
更多 Avalonia 技能博客,请参阅 博客导航

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

勿忘初心做自己

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表