You need to enable JavaScript to run this app. WinForm中RichTextBox点击获取行号时报无法转换为IInputElement错误如何解决
优惠活动
大模型
产品
解决方案
定价
更多

WinForm中RichTextBox点击获取行号时报无法转换为IInputElement错误如何解决

错误原因

你遇到的类型转换报错是因为混用了WPF体系的API和WinForms控件:

  • Mouse.GetPosition() 是WPF提供的方法,要求传入实现System.Windows.IInputElement接口的WPF控件
  • 你使用的System.Windows.Forms.RichTextBox属于WinForms控件体系,没有实现上述接口,无法作为参数传入该方法

解决方案

分两种场景处理:

场景1:纯WinForms项目

将原来绑定的PreviewMouseDown事件(该事件属于WPF体系)替换为WinForms RichTextBox原生的MouseDown事件,直接从事件参数中获取点击坐标即可,示例代码如下:

private void richTextBox1_MouseDown(object sender, MouseEventArgs e)
{
    if (e.Button == MouseButtons.Left)
    {
        int charPosition = richTextBox1.GetCharIndexFromPosition(e.Location);
        // linePosition为从0开始计数的行号,需要1开头的行号直接+1即可
        int linePosition = richTextBox1.GetLineFromCharIndex(charPosition);
    }
}

场景2:WPF项目中通过WindowsFormsHost嵌套WinForms RichTextBox

如果是WPF项目中承载了WinForms的RichTextBox,需要先将WPF鼠标坐标转换为WinForms兼容的坐标结构,再传入方法,示例代码如下:

private void richTextBox1_PreviewMouseDown(object sender, MouseButtonEventArgs e)
{
    if (e.ChangedButton == MouseButton.Left)
    {
        // winFormsHost为承载RichTextBox的WindowsFormsHost控件名称
        System.Windows.Point wpfPoint = e.GetPosition(winFormsHost);
        System.Drawing.Point winformPoint = new System.Drawing.Point((int)wpfPoint.X, (int)wpfPoint.Y);
        int charPosition = richTextBox1.GetCharIndexFromPosition(winformPoint);
        int linePosition = richTextBox1.GetLineFromCharIndex(charPosition);
    }
}

内容的提问来源于stack exchange,提问作者gmbc

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.09 00:42:02