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
相关产品推荐
相关产品推荐

