模仿Tcl/Tk';s字体“;OnMouseEnter";C#应用程序中的行为

模仿Tcl/Tk';s字体“;OnMouseEnter";C#应用程序中的行为,c#,webforms,tk,C#,Webforms,Tk,我在看一个朋友发给我的程序,它是用Tcl/Tk编写的。它有一个格式丰富的多行文本框,具有不同的颜色和字体,对于某些文本块,应用程序窗口会对用户悬停在不同的文本元素上做出反应。他说,这是通过在创建新字体时指定“OnMouseEnter”回调事件来实现的。这似乎是一种既酷又优雅的方法,我想在我编写的C#应用程序中做一些类似的事情。目前,我认为有三种方法可以做到这一点:(a)解决从X-Y鼠标坐标到文本的映射(可能有一个简单的函数可以实现这一点?)(b)使每个不同的文本块成为具有自己回调函数的子控件(这

我在看一个朋友发给我的程序,它是用Tcl/Tk编写的。它有一个格式丰富的多行文本框,具有不同的颜色和字体,对于某些文本块,应用程序窗口会对用户悬停在不同的文本元素上做出反应。他说,这是通过在创建新字体时指定“OnMouseEnter”回调事件来实现的。这似乎是一种既酷又优雅的方法,我想在我编写的C#应用程序中做一些类似的事情。目前,我认为有三种方法可以做到这一点:(a)解决从X-Y鼠标坐标到文本的映射(可能有一个简单的函数可以实现这一点?)(b)使每个不同的文本块成为具有自己回调函数的子控件(这非常难看,需要我自己进行文本包装)或(c)将其设置为网页控件,并通过WebBrowser.Navigating使用javascript“调用”C。欢迎就实现此类功能的最佳方式提出任何建议。

大多数文本框控件都具有X-Y坐标到文本块转换函数调用。您可以钩住文本框的整个鼠标移动事件,并查看鼠标下方的内容


这可能是一段难看的代码,但至少它可以工作。

FWIW,“计算出从XY到文本段的映射”是Tk的文本小部件在封面下为您所做的,当您具有可变的行高和字符宽度时,这并不是一件小事。使用网页控件可能是最简单的。