鼠标悬停时获取控件名称的通用方法?

时间:2009-10-10 21:38:31

标签: c# winforms reflection

我正在编写一个应用程序,我正在为它设置皮肤功能。我想要做的是允许用户创建我的代码将解析的XML文档,并设置窗体上控件的属性。这是简单的部分。我遇到的问题是让用户找到控制名称/类型的方法,只需最少的编码/文档工作。

我的想法是有一个工具提示,当他们在控件上进行鼠标操作时,它会获得控件的名称和要显示的类型。有人知道这样做的方法吗?我在想Spy ++如何找到控件,但我也希望得到.NET属性。

如果有人有另一个想法,我会张开耳朵。

非常感谢。

5 个答案:

答案 0 :(得分:1)

想出来。问题是因为鼠标位置与客户端位置无关。因此,下面的代码将解决此问题。我把它放在一个我已经去过的轮询线程中,但它应该与定时器或其他事件一起使用。但由于某种原因,在MouseMove中无效。谢谢大家的帮助。

                Point p = this.PointToClient(MousePosition);
                Control x = this.GetChildAtPoint(p);
                if (x != null)
                {
                    MessageBox.Show(x.GetType().ToString() + " - " + x.Name);
                }

答案 1 :(得分:0)

您需要设置一些ToolTip个对象(每个字段一个),循环浏览表单中的所有控件以获取每个工具提示的文本。

http://msdn.microsoft.com/en-us/library/system.windows.forms.tooltip.aspx

答案 2 :(得分:0)

您是否愿意为每个控件鼠标注册事件?如果是这样,发件人将是类型等...也许我在这里遗漏了什么?此外,您可以从WPF / SL中的可视树中获取控件,为什么不移植到WPF?

答案 3 :(得分:0)

您可以递归安装OnMouseOver事件处理程序。然后,如果发生OnMouseOver事件,则控件位于事件处理程序的sender参数中。

答案 4 :(得分:0)

为什么这不起作用?我把它放在基本形式中,不要真正看到GetChildAtPoint旁边有什么不起作用。

    protected override void OnMouseMove(MouseEventArgs e)
    {
        Control c = this.GetChildAtPoint(e.Location);
        if (c != null)
        {
            MessageBox.Show(String.Format("Your control name is: {0} and type is {1}.", c.Name, c.GetType().ToString()));
        }
        base.OnMouseMove(e);
    }